On Thu, Feb 23, 2023 at 12:04:47PM +0900, Sergey Senozhatsky wrote: > The fullness_group enum is nested (sub-enum) within the > class_stat_type enum. zsmalloc requires the values in both > enums to match, because zsmalloc passes these values to > generic functions, e.g. class_stat_inc() and class_stat_dec(), > after casting them to integers. > > Replace these enums (and enum nesting) and use simple defines > instead. Also rename some of zsmalloc stats defines, as they > sort of clash with zspage object tags. > > Suggested-by: Yosry Ahmed <yosryahmed@xxxxxxxxxx> > Signed-off-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> > --- > mm/zsmalloc.c | 104 ++++++++++++++++++++++---------------------------- > 1 file changed, 45 insertions(+), 59 deletions(-) > > diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c > index b57a89ed6f30..38ae8963c0eb 100644 > --- a/mm/zsmalloc.c > +++ b/mm/zsmalloc.c > @@ -159,26 +159,18 @@ > #define ZS_SIZE_CLASSES (DIV_ROUND_UP(ZS_MAX_ALLOC_SIZE - ZS_MIN_ALLOC_SIZE, \ > ZS_SIZE_CLASS_DELTA) + 1) > > -enum fullness_group { > - ZS_EMPTY, > - ZS_ALMOST_EMPTY, > - ZS_ALMOST_FULL, > - ZS_FULL, > - NR_ZS_FULLNESS, > -}; > +#define ZS_EMPTY 0 > +#define ZS_ALMOST_EMPTY 1 > +#define ZS_ALMOST_FULL 2 > +#define ZS_FULL 3 > +#define ZS_OBJS_ALLOCATED 4 > +#define ZS_OBJS_INUSE 5 > > -enum class_stat_type { > - CLASS_EMPTY, > - CLASS_ALMOST_EMPTY, > - CLASS_ALMOST_FULL, > - CLASS_FULL, > - OBJ_ALLOCATED, > - OBJ_USED, > - NR_ZS_STAT_TYPE, > -}; > +#define NR_ZS_STAT 6 > +#define NR_ZS_FULLNESS 4 Using define list instead of enum list looks like going backward. :) Why can't we do this? enum class_stat_type { ZS_EMPTY, ZS_ALMOST_EMPTY, ZS_ALMOST_FULL, ZS_FULL, NR_ZS_FULLNESS, ZS_OBJ_ALLOCATED = NR_ZS_FULLNESS, ZS_OBJ_USED, NR_ZS_STAT, } }; > > struct zs_size_stat { > - unsigned long objs[NR_ZS_STAT_TYPE]; > + unsigned long objs[NR_ZS_STAT]; > }; >