[PATCH 2/7] zram: drop get_slot_handle() and set_slot_handle()
From: Sergey Senozhatsky
Date: Wed Nov 04 2026 - 23:48:44 EST
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 <senozhatsky@xxxxxxxxxxxx>
---
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.398.g882cbad275-goog