On (22/11/03 10:00), Minchan Kim wrote: > zram->table[index].flags > > If we squeeze the algorithm index, we could work like this > without ZRAM_RECOMP_SKIP. Something like this? Allocate two ->flags bits for priority and one bit for RECOMP_SKIP. Two priority bits let us to have 3 alternative algorithms (01 10 11) plus one default (00). So 4 in total. --- diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 12f03745baf9..af0ff58087ca 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -127,6 +127,19 @@ static size_t zram_get_obj_size(struct zram *zram, u32 index) return zram->table[index].flags & (BIT(ZRAM_FLAG_SHIFT) - 1); } +static inline void zram_set_priority(struct zram *zram, u32 index, u32 prio) +{ + prio &= ZRAM_COMP_PRIORITY_MASK; + zram->table[index].flags &= (prio << ZRAM_COMP_PRIORITY_1); +} + +static inline u32 zram_get_priority(struct zram *zram, u32 index) +{ + u32 prio = zram->table[index].flags; + + return prio & ZRAM_COMP_PRIORITY_MASK; +} + static void zram_set_obj_size(struct zram *zram, u32 index, size_t size) { diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index bdfc9bf0bdd5..33e52c5a9a90 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -40,6 +40,8 @@ */ #define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1) +#define ZRAM_COMP_PRIORITY_MASK 0x3 + /* Flags for zram pages (table[page_no].flags) */ enum zram_pageflags { /* zram slot is locked */ @@ -49,8 +51,9 @@ enum zram_pageflags { ZRAM_UNDER_WB, /* page is under writeback */ ZRAM_HUGE, /* Incompressible page */ ZRAM_IDLE, /* not accessed page since last idle marking */ - ZRAM_RECOMP, /* page was recompressed */ ZRAM_RECOMP_SKIP, /* secondary algorithm cannot compress this page */ + ZRAM_COMP_PRIORITY_1, + ZRAM_COMP_PRIORITY_2, __NR_ZRAM_PAGEFLAGS, };