zram_table_entry ->handle is overloaded to store zsmalloc handle, same-filled page pattern and writeback block index, so calling set_slot_handle() or get_slot_handle() for blk_idx and same-filled pattern is confusing. Turn ->handle into a union of handle, element and blk_idx, drop get_slot_handle() and set_slot_handle(), and open-code field accesses. No functional change. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 43 +++++++++++++---------------------- drivers/block/zram/zram_drv.h | 6 ++++- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 380615b73446..5c13addd22f6 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -111,17 +111,6 @@ static inline struct zram *dev_to_zram(struct device *dev) return (struct zram *)dev_to_disk(dev)->private_data; } -static unsigned long get_slot_handle(struct zram *zram, unsigned long index) -{ - return zram->table[index].handle; -} - -static void set_slot_handle(struct zram *zram, unsigned long index, - unsigned long handle) -{ - zram->table[index].handle = handle; -} - static bool test_slot_flag(struct zram *zram, unsigned long index, enum zram_pageflags flag) { @@ -962,8 +951,8 @@ static int zram_writeback_complete(struct zram *zram, struct zram_wb_req *req) if (test_slot_flag(zram, index, ZRAM_HUGE)) atomic64_dec(&zram->stats.huge_pages); atomic64_sub(get_slot_size(zram, index), &zram->stats.compr_data_size); - zs_free(zram->mem_pool, get_slot_handle(zram, index)); - set_slot_handle(zram, index, req->blk_idx); + zs_free(zram->mem_pool, zram->table[index].handle); + zram->table[index].blk_idx = req->blk_idx; set_slot_flag(zram, index, ZRAM_WB); out: @@ -2064,7 +2053,7 @@ static void slot_free(struct zram *zram, unsigned long index) if (test_slot_flag(zram, index, ZRAM_WB)) { clear_slot_flag(zram, index, ZRAM_WB); - zram_release_bdev_block(zram, get_slot_handle(zram, index)); + zram_release_bdev_block(zram, zram->table[index].blk_idx); goto out; } @@ -2078,7 +2067,7 @@ static void slot_free(struct zram *zram, unsigned long index) goto out; } - handle = get_slot_handle(zram, index); + handle = zram->table[index].handle; if (!handle) return; @@ -2088,7 +2077,7 @@ static void slot_free(struct zram *zram, unsigned long index) &zram->stats.compr_data_size); out: atomic64_dec(&zram->stats.pages_stored); - set_slot_handle(zram, index, 0); + zram->table[index].element = 0; set_slot_size(zram, index, 0); } @@ -2098,7 +2087,7 @@ static int read_same_filled_page(struct zram *zram, struct page *page, void *mem; mem = kmap_local_page(page); - zram_fill_page(mem, PAGE_SIZE, get_slot_handle(zram, index)); + zram_fill_page(mem, PAGE_SIZE, zram->table[index].element); kunmap_local(mem); return 0; } @@ -2110,7 +2099,7 @@ static int read_incompressible_page(struct zram *zram, struct page *page, unsigned long handle; void *src, *dst; - handle = get_slot_handle(zram, index); + handle = zram->table[index].handle; zs_obj_read_sg_begin(zram->mem_pool, handle, sg, PAGE_SIZE); /* an incompressible object never spans two pages */ src = kmap_local_page(sg_page(sg)); @@ -2134,7 +2123,7 @@ static int read_compressed_page(struct zram *zram, struct page *page, void *dst; int ret, prio; - handle = get_slot_handle(zram, index); + handle = zram->table[index].handle; size = get_slot_size(zram, index); prio = get_slot_comp_priority(zram, index); @@ -2161,7 +2150,7 @@ static int read_from_zspool_raw(struct zram *zram, struct page *page, unsigned int size; void *dst; - handle = get_slot_handle(zram, index); + handle = zram->table[index].handle; size = get_slot_size(zram, index); /* @@ -2188,7 +2177,7 @@ static int read_from_zspool(struct zram *zram, struct page *page, unsigned long index) { if (test_slot_flag(zram, index, ZRAM_SAME) || - !get_slot_handle(zram, index)) + !zram->table[index].handle) return read_same_filled_page(zram, page, index); if (!test_slot_flag(zram, index, ZRAM_HUGE)) @@ -2209,7 +2198,7 @@ static int zram_read_page(struct zram *zram, struct page *page, ret = read_from_zspool(zram, page, index); slot_unlock(zram, index); } else { - unsigned long blk_idx = get_slot_handle(zram, index); + unsigned long blk_idx = zram->table[index].blk_idx; /* * The slot should be unlocked before reading from the backing @@ -2255,7 +2244,7 @@ static int write_same_filled_page(struct zram *zram, unsigned long fill, slot_lock(zram, index); slot_free(zram, index); set_slot_flag(zram, index, ZRAM_SAME); - set_slot_handle(zram, index, fill); + zram->table[index].element = fill; mark_slot_accessed(zram, index); slot_unlock(zram, index); @@ -2289,7 +2278,7 @@ static int write_incompressible_page(struct zram *zram, struct page *page, slot_lock(zram, index); slot_free(zram, index); set_slot_flag(zram, index, ZRAM_HUGE); - set_slot_handle(zram, index, handle); + zram->table[index].handle = handle; set_slot_size(zram, index, PAGE_SIZE); mark_slot_accessed(zram, index); slot_unlock(zram, index); @@ -2355,7 +2344,7 @@ static int zram_write_page(struct zram *zram, struct page *page, slot_lock(zram, index); slot_free(zram, index); - set_slot_handle(zram, index, handle); + zram->table[index].handle = handle; set_slot_size(zram, index, comp_len); mark_slot_accessed(zram, index); slot_unlock(zram, index); @@ -2471,7 +2460,7 @@ static int recompress_slot(struct zram *zram, unsigned long index, void *src; int ret = 0; - handle_old = get_slot_handle(zram, index); + handle_old = zram->table[index].handle; if (!handle_old) return -EINVAL; @@ -2554,7 +2543,7 @@ static int recompress_slot(struct zram *zram, unsigned long index, zcomp_cstrm_put(zstrm); slot_free(zram, index); - set_slot_handle(zram, index, handle_new); + zram->table[index].handle = handle_new; set_slot_size(zram, index, comp_len_new); set_slot_comp_priority(zram, index, prio); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index c563a7c13a49..5416e25e64e8 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -78,7 +78,11 @@ enum zram_pageflags { * of each entry and hence of the meta table. */ struct zram_table_entry { - unsigned long handle; + union { + unsigned long handle; + unsigned long element; + unsigned long blk_idx; + }; union { unsigned long __lock; struct attr { -- 2.56.0.506.g506a7eabc5-goog