Commit e1807d5d authored by Sergey Senozhatsky's avatar Sergey Senozhatsky Committed by Andrew Morton

zsmalloc: show per fullness group class stats

We keep the old fullness (3/4 threshold) reporting in
zs_stats_size_show().  Switch from allmost full/empty stats to
fine-grained per inuse ratio (fullness group) reporting, which gives
signicantly more data on classes fragmentation.

Link: https://lkml.kernel.org/r/20230304034835.2082479-5-senozhatsky@chromium.orgSigned-off-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
Acked-by: default avatarMinchan Kim <minchan@kernel.org>
Cc: Yosry Ahmed <yosryahmed@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 5a845e9f
...@@ -172,9 +172,7 @@ ...@@ -172,9 +172,7 @@
enum fullness_group { enum fullness_group {
ZS_INUSE_RATIO_0, ZS_INUSE_RATIO_0,
ZS_INUSE_RATIO_10, ZS_INUSE_RATIO_10,
/* NOTE: 5 more fullness groups here */ /* NOTE: 8 more fullness groups here */
ZS_INUSE_RATIO_70 = 7,
/* NOTE: 2 more fullness groups here */
ZS_INUSE_RATIO_99 = 10, ZS_INUSE_RATIO_99 = 10,
ZS_INUSE_RATIO_100, ZS_INUSE_RATIO_100,
NR_FULLNESS_GROUPS, NR_FULLNESS_GROUPS,
...@@ -621,23 +619,22 @@ static unsigned long zs_can_compact(struct size_class *class); ...@@ -621,23 +619,22 @@ static unsigned long zs_can_compact(struct size_class *class);
static int zs_stats_size_show(struct seq_file *s, void *v) static int zs_stats_size_show(struct seq_file *s, void *v)
{ {
int i; int i, fg;
struct zs_pool *pool = s->private; struct zs_pool *pool = s->private;
struct size_class *class; struct size_class *class;
int objs_per_zspage; int objs_per_zspage;
unsigned long class_almost_full, class_almost_empty;
unsigned long obj_allocated, obj_used, pages_used, freeable; 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_objs = 0, total_used_objs = 0, total_pages = 0;
unsigned long total_freeable = 0; unsigned long total_freeable = 0;
unsigned long inuse_totals[NR_FULLNESS_GROUPS] = {0, };
seq_printf(s, " %5s %5s %11s %12s %13s %10s %10s %16s %8s\n", seq_printf(s, " %5s %5s %9s %9s %9s %9s %9s %9s %9s %9s %9s %9s %9s %13s %10s %10s %16s %8s\n",
"class", "size", "almost_full", "almost_empty", "class", "size", "10%", "20%", "30%", "40%",
"50%", "60%", "70%", "80%", "90%", "99%", "100%",
"obj_allocated", "obj_used", "pages_used", "obj_allocated", "obj_used", "pages_used",
"pages_per_zspage", "freeable"); "pages_per_zspage", "freeable");
for (i = 0; i < ZS_SIZE_CLASSES; i++) { for (i = 0; i < ZS_SIZE_CLASSES; i++) {
int fg;
class = pool->size_class[i]; class = pool->size_class[i];
...@@ -645,16 +642,12 @@ static int zs_stats_size_show(struct seq_file *s, void *v) ...@@ -645,16 +642,12 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
continue; continue;
spin_lock(&pool->lock); spin_lock(&pool->lock);
class_almost_full = 0;
class_almost_empty = 0; seq_printf(s, " %5u %5u ", i, class->size);
/* for (fg = ZS_INUSE_RATIO_10; fg < NR_FULLNESS_GROUPS; fg++) {
* Replicate old behaviour for almost_full and almost_empty inuse_totals[fg] += zs_stat_get(class, fg);
* stats. seq_printf(s, "%9lu ", zs_stat_get(class, fg));
*/ }
for (fg = ZS_INUSE_RATIO_70; fg <= ZS_INUSE_RATIO_99; fg++)
class_almost_full += zs_stat_get(class, fg);
for (fg = ZS_INUSE_RATIO_10; fg < ZS_INUSE_RATIO_70; fg++)
class_almost_empty += zs_stat_get(class, fg);
obj_allocated = zs_stat_get(class, ZS_OBJS_ALLOCATED); obj_allocated = zs_stat_get(class, ZS_OBJS_ALLOCATED);
obj_used = zs_stat_get(class, ZS_OBJS_INUSE); obj_used = zs_stat_get(class, ZS_OBJS_INUSE);
...@@ -665,14 +658,10 @@ static int zs_stats_size_show(struct seq_file *s, void *v) ...@@ -665,14 +658,10 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
pages_used = obj_allocated / objs_per_zspage * pages_used = obj_allocated / objs_per_zspage *
class->pages_per_zspage; class->pages_per_zspage;
seq_printf(s, " %5u %5u %11lu %12lu %13lu" seq_printf(s, "%13lu %10lu %10lu %16d %8lu\n",
" %10lu %10lu %16d %8lu\n", obj_allocated, obj_used, pages_used,
i, class->size, class_almost_full, class_almost_empty, class->pages_per_zspage, freeable);
obj_allocated, obj_used, pages_used,
class->pages_per_zspage, freeable);
total_class_almost_full += class_almost_full;
total_class_almost_empty += class_almost_empty;
total_objs += obj_allocated; total_objs += obj_allocated;
total_used_objs += obj_used; total_used_objs += obj_used;
total_pages += pages_used; total_pages += pages_used;
...@@ -680,10 +669,14 @@ static int zs_stats_size_show(struct seq_file *s, void *v) ...@@ -680,10 +669,14 @@ static int zs_stats_size_show(struct seq_file *s, void *v)
} }
seq_puts(s, "\n"); seq_puts(s, "\n");
seq_printf(s, " %5s %5s %11lu %12lu %13lu %10lu %10lu %16s %8lu\n", seq_printf(s, " %5s %5s ", "Total", "");
"Total", "", total_class_almost_full,
total_class_almost_empty, total_objs, for (fg = ZS_INUSE_RATIO_10; fg < NR_FULLNESS_GROUPS; fg++)
total_used_objs, total_pages, "", total_freeable); seq_printf(s, "%9lu ", inuse_totals[fg]);
seq_printf(s, "%13lu %10lu %10lu %16s %8lu\n",
total_objs, total_used_objs, total_pages, "",
total_freeable);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment