On Mon, Sep 12, 2022 at 11:29 AM Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> wrote: > > 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. > > Signed-off-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> > --- > drivers/block/zram/zram_drv.c | 2 ++ > drivers/block/zram/zram_drv.h | 15 +++++++-------- > 2 files changed, 9 insertions(+), 8 deletions(-) > > diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c > index f3948abce2f7..07913bcdb5c2 100644 > --- a/drivers/block/zram/zram_drv.c > +++ b/drivers/block/zram/zram_drv.c > @@ -2449,6 +2449,8 @@ static int __init zram_init(void) > { > int ret; > > + BUILD_BUG_ON(__NR_ZRAM_PAGEFLAGS > BITS_PER_LONG); Should this be >= BITS_PER_LONG? > + > ret = cpuhp_setup_state_multi(CPUHP_ZCOMP_PREPARE, "block/zram:prepare", > zcomp_cpu_up_prepare, zcomp_cpu_dead); > if (ret < 0) > diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h > index b4eecef2a11f..2b50f0521bd3 100644 > --- a/drivers/block/zram/zram_drv.h > +++ b/drivers/block/zram/zram_drv.h > @@ -30,16 +30,15 @@ > > > /* > - * The lower ZRAM_FLAG_SHIFT bits of table.flags is for > - * object size (excluding header), the higher bits is for > - * zram_pageflags. > + * ZRAM is mainly used for memory efficiency so we want to keep memory > + * footprint small and thus squeeze size and zram pageflags into a flags > + * 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 > - * 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. > + * We use BUILD_BUG_ON() to make sure that zram pageflags don't overflow. > */ > -#define ZRAM_FLAG_SHIFT 24 > +#define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1) > > /* Flags for zram pages (table[page_no].flags) */ > enum zram_pageflags { > -- > 2.37.2.789.g6183377224-goog >