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

zram: do not waste zram_table_entry flags bits

zram_table_entry::flags stores object size in the lower bits and zram
pageflags in the upper bits.  However, for some reason, we use 24 lower
bits, while maximum zram object size is PAGE_SIZE, which requires
PAGE_SHIFT bits (up to 16 on arm64).  This wastes 24 - PAGE_SHIFT bits
that we can use for additional zram pageflags instead.

Also add a BUILD_BUG_ON() to alert us should we run out of bits in
zram_table_entry::flags.

Link: https://lkml.kernel.org/r/20220912152744.527438-1-senozhatsky@chromium.orgSigned-off-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
Reviewed-by: default avatarBrian Geffon <bgeffon@google.com>
Acked-by: default avatarMinchan Kim <minchan@kernel.org>
Cc: Nitin Gupta <ngupta@vflare.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent a1870944
...@@ -2131,6 +2131,8 @@ static int __init zram_init(void) ...@@ -2131,6 +2131,8 @@ static int __init zram_init(void)
{ {
int ret; int ret;
BUILD_BUG_ON(__NR_ZRAM_PAGEFLAGS > BITS_PER_LONG);
ret = cpuhp_setup_state_multi(CPUHP_ZCOMP_PREPARE, "block/zram:prepare", ret = cpuhp_setup_state_multi(CPUHP_ZCOMP_PREPARE, "block/zram:prepare",
zcomp_cpu_up_prepare, zcomp_cpu_dead); zcomp_cpu_up_prepare, zcomp_cpu_dead);
if (ret < 0) if (ret < 0)
......
...@@ -30,16 +30,15 @@ ...@@ -30,16 +30,15 @@
/* /*
* The lower ZRAM_FLAG_SHIFT bits of table.flags is for * ZRAM is mainly used for memory efficiency so we want to keep memory
* object size (excluding header), the higher bits is for * footprint small and thus squeeze size and zram pageflags into a flags
* zram_pageflags. * member. The lower ZRAM_FLAG_SHIFT bits is for object size (excluding
* header), which cannot be larger than PAGE_SIZE (requiring PAGE_SHIFT
* bits), the higher bits are for zram_pageflags.
* *
* zram is mainly used for memory efficiency so we want to keep memory * We use BUILD_BUG_ON() to make sure that zram pageflags don't overflow.
* footprint small so we can squeeze size and flags into a field.
* The lower ZRAM_FLAG_SHIFT bits is for object size (excluding header),
* the higher bits is for zram_pageflags.
*/ */
#define ZRAM_FLAG_SHIFT 24 #define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1)
/* Flags for zram pages (table[page_no].flags) */ /* Flags for zram pages (table[page_no].flags) */
enum zram_pageflags { enum zram_pageflags {
......
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