|
@@ -1579,8 +1579,6 @@ struct zs_compact_control {
|
|
/* Starting object index within @s_page which used for live object
|
|
/* Starting object index within @s_page which used for live object
|
|
* in the subpage. */
|
|
* in the subpage. */
|
|
int index;
|
|
int index;
|
|
- /* How many of objects were migrated */
|
|
|
|
- int nr_migrated;
|
|
|
|
};
|
|
};
|
|
|
|
|
|
static int migrate_zspage(struct zs_pool *pool, struct size_class *class,
|
|
static int migrate_zspage(struct zs_pool *pool, struct size_class *class,
|
|
@@ -1617,7 +1615,6 @@ static int migrate_zspage(struct zs_pool *pool, struct size_class *class,
|
|
record_obj(handle, free_obj);
|
|
record_obj(handle, free_obj);
|
|
unpin_tag(handle);
|
|
unpin_tag(handle);
|
|
obj_free(pool, class, used_obj);
|
|
obj_free(pool, class, used_obj);
|
|
- cc->nr_migrated++;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/* Remember last position in this iteration */
|
|
/* Remember last position in this iteration */
|
|
@@ -1643,8 +1640,17 @@ static struct page *isolate_target_page(struct size_class *class)
|
|
return page;
|
|
return page;
|
|
}
|
|
}
|
|
|
|
|
|
-static void putback_zspage(struct zs_pool *pool, struct size_class *class,
|
|
|
|
- struct page *first_page)
|
|
|
|
|
|
+/*
|
|
|
|
+ * putback_zspage - add @first_page into right class's fullness list
|
|
|
|
+ * @pool: target pool
|
|
|
|
+ * @class: destination class
|
|
|
|
+ * @first_page: target page
|
|
|
|
+ *
|
|
|
|
+ * Return @fist_page's fullness_group
|
|
|
|
+ */
|
|
|
|
+static enum fullness_group putback_zspage(struct zs_pool *pool,
|
|
|
|
+ struct size_class *class,
|
|
|
|
+ struct page *first_page)
|
|
{
|
|
{
|
|
enum fullness_group fullness;
|
|
enum fullness_group fullness;
|
|
|
|
|
|
@@ -1662,6 +1668,8 @@ static void putback_zspage(struct zs_pool *pool, struct size_class *class,
|
|
|
|
|
|
free_zspage(first_page);
|
|
free_zspage(first_page);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return fullness;
|
|
}
|
|
}
|
|
|
|
|
|
static struct page *isolate_source_page(struct size_class *class)
|
|
static struct page *isolate_source_page(struct size_class *class)
|
|
@@ -1704,7 +1712,6 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class)
|
|
struct page *src_page;
|
|
struct page *src_page;
|
|
struct page *dst_page = NULL;
|
|
struct page *dst_page = NULL;
|
|
|
|
|
|
- cc.nr_migrated = 0;
|
|
|
|
spin_lock(&class->lock);
|
|
spin_lock(&class->lock);
|
|
while ((src_page = isolate_source_page(class))) {
|
|
while ((src_page = isolate_source_page(class))) {
|
|
|
|
|
|
@@ -1733,7 +1740,9 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class)
|
|
break;
|
|
break;
|
|
|
|
|
|
putback_zspage(pool, class, dst_page);
|
|
putback_zspage(pool, class, dst_page);
|
|
- putback_zspage(pool, class, src_page);
|
|
|
|
|
|
+ if (putback_zspage(pool, class, src_page) == ZS_EMPTY)
|
|
|
|
+ pool->stats.pages_compacted +=
|
|
|
|
+ get_pages_per_zspage(class->size);
|
|
spin_unlock(&class->lock);
|
|
spin_unlock(&class->lock);
|
|
cond_resched();
|
|
cond_resched();
|
|
spin_lock(&class->lock);
|
|
spin_lock(&class->lock);
|
|
@@ -1742,8 +1751,6 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class)
|
|
if (src_page)
|
|
if (src_page)
|
|
putback_zspage(pool, class, src_page);
|
|
putback_zspage(pool, class, src_page);
|
|
|
|
|
|
- pool->stats.num_migrated += cc.nr_migrated;
|
|
|
|
-
|
|
|
|
spin_unlock(&class->lock);
|
|
spin_unlock(&class->lock);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1761,7 +1768,7 @@ unsigned long zs_compact(struct zs_pool *pool)
|
|
__zs_compact(pool, class);
|
|
__zs_compact(pool, class);
|
|
}
|
|
}
|
|
|
|
|
|
- return pool->stats.num_migrated;
|
|
|
|
|
|
+ return pool->stats.pages_compacted;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(zs_compact);
|
|
EXPORT_SYMBOL_GPL(zs_compact);
|
|
|
|
|