|
|
@@ -494,6 +494,8 @@ static void __exit zs_stat_exit(void)
|
|
|
debugfs_remove_recursive(zs_stat_root);
|
|
|
}
|
|
|
|
|
|
+static unsigned long zs_can_compact(struct size_class *class);
|
|
|
+
|
|
|
static int zs_stats_size_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
int i;
|
|
|
@@ -501,14 +503,15 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
|
|
|
struct size_class *class;
|
|
|
int objs_per_zspage;
|
|
|
unsigned long class_almost_full, class_almost_empty;
|
|
|
- unsigned long obj_allocated, obj_used, pages_used;
|
|
|
+ unsigned long obj_allocated, obj_used, pages_used, freeable;
|
|
|
unsigned long total_class_almost_full = 0, total_class_almost_empty = 0;
|
|
|
unsigned long total_objs = 0, total_used_objs = 0, total_pages = 0;
|
|
|
+ unsigned long total_freeable = 0;
|
|
|
|
|
|
- seq_printf(s, " %5s %5s %11s %12s %13s %10s %10s %16s\n",
|
|
|
+ seq_printf(s, " %5s %5s %11s %12s %13s %10s %10s %16s %8s\n",
|
|
|
"class", "size", "almost_full", "almost_empty",
|
|
|
"obj_allocated", "obj_used", "pages_used",
|
|
|
- "pages_per_zspage");
|
|
|
+ "pages_per_zspage", "freeable");
|
|
|
|
|
|
for (i = 0; i < zs_size_classes; i++) {
|
|
|
class = pool->size_class[i];
|
|
|
@@ -521,6 +524,7 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
|
|
|
class_almost_empty = zs_stat_get(class, CLASS_ALMOST_EMPTY);
|
|
|
obj_allocated = zs_stat_get(class, OBJ_ALLOCATED);
|
|
|
obj_used = zs_stat_get(class, OBJ_USED);
|
|
|
+ freeable = zs_can_compact(class);
|
|
|
spin_unlock(&class->lock);
|
|
|
|
|
|
objs_per_zspage = get_maxobj_per_zspage(class->size,
|
|
|
@@ -528,23 +532,25 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
|
|
|
pages_used = obj_allocated / objs_per_zspage *
|
|
|
class->pages_per_zspage;
|
|
|
|
|
|
- seq_printf(s, " %5u %5u %11lu %12lu %13lu %10lu %10lu %16d\n",
|
|
|
+ seq_printf(s, " %5u %5u %11lu %12lu %13lu"
|
|
|
+ " %10lu %10lu %16d %8lu\n",
|
|
|
i, class->size, class_almost_full, class_almost_empty,
|
|
|
obj_allocated, obj_used, pages_used,
|
|
|
- class->pages_per_zspage);
|
|
|
+ class->pages_per_zspage, freeable);
|
|
|
|
|
|
total_class_almost_full += class_almost_full;
|
|
|
total_class_almost_empty += class_almost_empty;
|
|
|
total_objs += obj_allocated;
|
|
|
total_used_objs += obj_used;
|
|
|
total_pages += pages_used;
|
|
|
+ total_freeable += freeable;
|
|
|
}
|
|
|
|
|
|
seq_puts(s, "\n");
|
|
|
- seq_printf(s, " %5s %5s %11lu %12lu %13lu %10lu %10lu\n",
|
|
|
+ seq_printf(s, " %5s %5s %11lu %12lu %13lu %10lu %10lu %16s %8lu\n",
|
|
|
"Total", "", total_class_almost_full,
|
|
|
total_class_almost_empty, total_objs,
|
|
|
- total_used_objs, total_pages);
|
|
|
+ total_used_objs, total_pages, "", total_freeable);
|
|
|
|
|
|
return 0;
|
|
|
}
|