hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IAFWQH ---------------------------------------- Add mm_stat interface. Compared to zram, mem_used_total and pages_compacted are calcualted with multiple zspool. mem_limit and mem_used_max aren't supported, and always displayed as 0. Signed-off-by: Jinjiang Tu <tujinjiang@huawei.com> --- .../multi_pool_zram/multi_pool_zram_drv.c | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/drivers/block/multi_pool_zram/multi_pool_zram_drv.c b/drivers/block/multi_pool_zram/multi_pool_zram_drv.c index c3f29d44a9fc..5df356ad6759 100644 --- a/drivers/block/multi_pool_zram/multi_pool_zram_drv.c +++ b/drivers/block/multi_pool_zram/multi_pool_zram_drv.c @@ -362,6 +362,64 @@ static ssize_t debug_stat_show(struct device *dev, return ret; } + +static u64 zram_pool_get_total_pages(struct zram *zram) +{ + u64 mem_used = 0; + int i; + + for (i = 0; i < NR_ZPOOL; ++i) + mem_used += zs_get_total_pages(zram->mem_pool[i]); + + return mem_used; +} + +static long zram_pool_get_pages_compacted(struct zram *zram) +{ + struct zs_pool_stats pool_stats; + long pages_compacted = 0; + int i; + + for (i = 0; i < NR_ZPOOL; ++i) { + zs_pool_stats(zram->mem_pool[i], &pool_stats); + pages_compacted += atomic_long_read(&pool_stats.pages_compacted); + } + + return pages_compacted; +} + +static ssize_t mm_stat_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct zram *zram = dev_to_zram(dev); + u64 orig_size, mem_used = 0; + long pages_compacted = 0; + ssize_t ret; + + down_read(&zram->init_lock); + if (init_done(zram)) { + mem_used = zram_pool_get_total_pages(zram); + pages_compacted = zram_pool_get_pages_compacted(zram); + } + + orig_size = atomic64_read(&zram->stats.pages_stored); + + ret = scnprintf(buf, PAGE_SIZE, + "%8llu %8llu %8llu %8lu %8ld %8llu %8lu %8llu %8llu\n", + orig_size << PAGE_SHIFT, + (u64)atomic64_read(&zram->stats.compr_data_size), + mem_used << PAGE_SHIFT, + 0L, + 0L, + (u64)atomic64_read(&zram->stats.same_pages), + pages_compacted, + (u64)atomic64_read(&zram->stats.huge_pages), + (u64)atomic64_read(&zram->stats.huge_pages_since)); + up_read(&zram->init_lock); + + return ret; +} + static void zram_pool_destroy(struct zram *zram) { int i; @@ -392,6 +450,7 @@ static int zram_pool_create(struct zram *zram) } static DEVICE_ATTR_RO(io_stat); +static DEVICE_ATTR_RO(mm_stat); static DEVICE_ATTR_RO(debug_stat); static void zram_meta_free(struct zram *zram, u64 disksize) @@ -981,6 +1040,7 @@ static struct attribute *zram_disk_attrs[] = { &dev_attr_reset.attr, &dev_attr_comp_algorithm.attr, &dev_attr_io_stat.attr, + &dev_attr_mm_stat.attr, &dev_attr_debug_stat.attr, NULL, }; -- 2.43.0