hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IAFWQH ---------------------------------------- Add mm_stat interface for each zspool, the format is same to the global interface. Signed-off-by: Jinjiang Tu <tujinjiang@huawei.com> --- .../multi_pool_zram/multi_pool_zram_drv.c | 74 +++++++++++++++++-- .../multi_pool_zram/multi_pool_zram_drv.h | 9 +++ 2 files changed, 77 insertions(+), 6 deletions(-) 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 5df356ad6759..08987c974a70 100644 --- a/drivers/block/multi_pool_zram/multi_pool_zram_drv.c +++ b/drivers/block/multi_pool_zram/multi_pool_zram_drv.c @@ -499,12 +499,19 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize) */ static void zram_free_page(struct zram *zram, size_t index) { + struct zram_zspool_stats *zspool_stats = NULL; unsigned long handle; struct zs_pool *pool; + size_t obj_size; + int pool_index; + pool_index = zram->table[index].pool_index; + pool = zram->mem_pool[pool_index]; + zspool_stats = &zram->zspool_stats[pool_index]; if (zram_test_flag(zram, index, ZRAM_HUGE)) { zram_clear_flag(zram, index, ZRAM_HUGE); atomic64_dec(&zram->stats.huge_pages); + atomic64_dec(&zspool_stats->huge_pages); } /* @@ -514,6 +521,7 @@ static void zram_free_page(struct zram *zram, size_t index) if (zram_test_flag(zram, index, ZRAM_SAME)) { zram_clear_flag(zram, index, ZRAM_SAME); atomic64_dec(&zram->stats.same_pages); + atomic64_dec(&zspool_stats->same_pages); goto out; } @@ -521,13 +529,14 @@ static void zram_free_page(struct zram *zram, size_t index) if (!handle) return; - pool = zram_get_pool(zram, index); zs_free(pool, handle); - atomic64_sub(zram_get_obj_size(zram, index), - &zram->stats.compr_data_size); + obj_size = zram_get_obj_size(zram, index); + atomic64_sub(obj_size, &zram->stats.compr_data_size); + atomic64_sub(obj_size, &zspool_stats->compr_data_size); out: atomic64_dec(&zram->stats.pages_stored); + atomic64_dec(&zspool_stats->pages_stored); zram_set_handle(zram, index, 0); zram_set_pool_index(zram, index, DEFAULT_ZPOOL_INDEX); zram_set_obj_size(zram, index, 0); @@ -636,21 +645,24 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index) struct zcomp_strm *zstrm; unsigned long element = 0; enum zram_pageflags flags = 0; + struct zram_zspool_stats *zspool_stats = NULL; struct zs_pool *pool; int pool_index; + pool_index = get_pool_index_from_page(zram, page); + pool = zram->mem_pool[pool_index]; + zspool_stats = &zram->zspool_stats[pool_index]; mem = kmap_atomic(page); if (page_same_filled(mem, &element)) { kunmap_atomic(mem); /* Free memory associated with this sector now. */ flags = ZRAM_SAME; atomic64_inc(&zram->stats.same_pages); + atomic64_inc(&zspool_stats->same_pages); goto out; } kunmap_atomic(mem); - pool_index = get_pool_index_from_page(zram, page); - pool = zram->mem_pool[pool_index]; compress_again: zstrm = zcomp_stream_get(zram->comp); src = kmap_atomic(page); @@ -717,6 +729,7 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index) zcomp_stream_put(zram->comp); zs_unmap_object(pool, handle); atomic64_add(comp_len, &zram->stats.compr_data_size); + atomic64_add(comp_len, &zspool_stats->compr_data_size); out: /* * Free memory associated with this sector @@ -728,7 +741,9 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index) if (comp_len == PAGE_SIZE) { zram_set_flag(zram, index, ZRAM_HUGE); atomic64_inc(&zram->stats.huge_pages); + atomic64_inc(&zspool_stats->huge_pages); atomic64_inc(&zram->stats.huge_pages_since); + atomic64_inc(&zspool_stats->huge_pages_since); } if (flags) { @@ -736,13 +751,14 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index) zram_set_element(zram, index, element); } else { zram_set_handle(zram, index, handle); - zram_set_pool_index(zram, index, pool_index); zram_set_obj_size(zram, index, comp_len); } + zram_set_pool_index(zram, index, pool_index); zram_slot_unlock(zram, index); /* Update stats */ atomic64_inc(&zram->stats.pages_stored); + atomic64_inc(&zspool_stats->pages_stored); return ret; } @@ -1121,8 +1137,54 @@ static ssize_t mem_cgroup_store(struct device *dev, } static DEVICE_ATTR_RW(mem_cgroup); +static ssize_t zspool_mm_stat_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct zram_zspool_stats *zram_zspool_stats; + struct kobject *kobj = &dev->kobj; + struct zs_pool_stats pool_stats; + u64 orig_size, mem_used = 0; + struct zs_pool *pool; + struct zram *zram; + int pool_index; + ssize_t ret; + + zram = dev_to_zram(kobj_to_dev(kobj->parent->parent)); + pool_index = kobj_to_pool_index(zram, kobj); + pool = zram->mem_pool[pool_index]; + zram_zspool_stats = &zram->zspool_stats[pool_index]; + memset(&pool_stats, 0x0, sizeof(struct zs_pool_stats)); + + down_read(&zram->init_lock); + if (init_done(zram)) { + mem_used = zs_get_total_pages(pool); + zs_pool_stats(pool, &pool_stats); + } + + orig_size = atomic64_read(&zram_zspool_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_zspool_stats->compr_data_size), + mem_used << PAGE_SHIFT, + 0L, 0L, + (u64)atomic64_read(&zram_zspool_stats->same_pages), + atomic_long_read(&pool_stats.pages_compacted), + (u64)atomic64_read(&zram_zspool_stats->huge_pages), + (u64)atomic64_read(&zram_zspool_stats->huge_pages_since)); + up_read(&zram->init_lock); + + return ret; +} + +static struct device_attribute dev_attr_zspool_mm_stat = { + .attr = { .name = "mm_stat", .mode = 0444 }, + .show = zspool_mm_stat_show, +}; + static struct attribute *mem_pool_attrs[] = { &dev_attr_mem_cgroup.attr, + &dev_attr_zspool_mm_stat.attr, NULL, }; diff --git a/drivers/block/multi_pool_zram/multi_pool_zram_drv.h b/drivers/block/multi_pool_zram/multi_pool_zram_drv.h index e8298e9cfd7b..7c192e81a3de 100644 --- a/drivers/block/multi_pool_zram/multi_pool_zram_drv.h +++ b/drivers/block/multi_pool_zram/multi_pool_zram_drv.h @@ -77,6 +77,14 @@ struct zram_stats { atomic64_t writestall; /* no. of write slow paths */ }; +struct zram_zspool_stats { + atomic64_t compr_data_size; /* compressed size of pages stored */ + atomic64_t pages_stored; /* no. of pages currently stored */ + atomic64_t same_pages; /* no. of same element filled pages */ + atomic64_t huge_pages; /* no. of huge pages */ + atomic64_t huge_pages_since; /* no. of huge pages since zram set up */ +}; + struct zram { struct zram_table_entry *table; struct zs_pool *mem_pool[NR_ZPOOL]; @@ -109,5 +117,6 @@ struct zram { struct kobject *pool_parent_kobj; struct kobject *pool_kobj[NR_ZPOOL]; struct mem_cgroup *pool_memcg[NR_ZPOOL]; + struct zram_zspool_stats zspool_stats[NR_ZPOOL]; }; #endif -- 2.43.0