On Sat, May 30, 2015 at 12:05:20AM +0900, Sergey Senozhatsky wrote: > always account per-class `zs_size_stat' stats. this data will > help us make better decisions during compaction. we are especially > interested in OBJ_ALLOCATED and OBJ_USED, which can tell us if > class compaction will result in any memory gain. > > for instance, we know the number of allocated objects in the class, > the number of objects being used (so we also know how many objects > are not used) and the number of objects per-page. so we can estimate > how many pages compaction can free (pages that will turn into > ZS_EMPTY during compaction). Fair enough but I need to read further patches to see if we need really this at the moment. I hope it would be better to write down more detail in cover-letter so when I read just [0/0] I realize your goal and approach without looking into detail in each patch. > > Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@xxxxxxxxx> > --- > mm/zsmalloc.c | 49 ++++++++++++------------------------------------- > 1 file changed, 12 insertions(+), 37 deletions(-) > > diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c > index e615b31..778b8db 100644 > --- a/mm/zsmalloc.c > +++ b/mm/zsmalloc.c > @@ -169,14 +169,12 @@ enum zs_stat_type { > NR_ZS_STAT_TYPE, > }; > > -#ifdef CONFIG_ZSMALLOC_STAT > - > -static struct dentry *zs_stat_root; > - > struct zs_size_stat { > unsigned long objs[NR_ZS_STAT_TYPE]; > }; > > +#ifdef CONFIG_ZSMALLOC_STAT > +static struct dentry *zs_stat_root; > #endif > > /* > @@ -201,25 +199,21 @@ static int zs_size_classes; > static const int fullness_threshold_frac = 4; > > struct size_class { > + spinlock_t lock; > + struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS]; > /* > * Size of objects stored in this class. Must be multiple > * of ZS_ALIGN. > */ > - int size; > - unsigned int index; > + int size; > + unsigned int index; > > /* Number of PAGE_SIZE sized pages to combine to form a 'zspage' */ > - int pages_per_zspage; > - /* huge object: pages_per_zspage == 1 && maxobj_per_zspage == 1 */ > - bool huge; > - > -#ifdef CONFIG_ZSMALLOC_STAT > - struct zs_size_stat stats; > -#endif > - > - spinlock_t lock; > + int pages_per_zspage; > + struct zs_size_stat stats; > > - struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS]; > + /* huge object: pages_per_zspage == 1 && maxobj_per_zspage == 1 */ > + bool huge; > }; > > /* > @@ -439,8 +433,6 @@ static int get_size_class_index(int size) > return min(zs_size_classes - 1, idx); > } > > -#ifdef CONFIG_ZSMALLOC_STAT > - > static inline void zs_stat_inc(struct size_class *class, > enum zs_stat_type type, unsigned long cnt) > { > @@ -459,6 +451,8 @@ static inline unsigned long zs_stat_get(struct size_class *class, > return class->stats.objs[type]; > } > > +#ifdef CONFIG_ZSMALLOC_STAT > + > static int __init zs_stat_init(void) > { > if (!debugfs_initialized()) > @@ -574,23 +568,6 @@ static void zs_pool_stat_destroy(struct zs_pool *pool) > } > > #else /* CONFIG_ZSMALLOC_STAT */ > - > -static inline void zs_stat_inc(struct size_class *class, > - enum zs_stat_type type, unsigned long cnt) > -{ > -} > - > -static inline void zs_stat_dec(struct size_class *class, > - enum zs_stat_type type, unsigned long cnt) > -{ > -} > - > -static inline unsigned long zs_stat_get(struct size_class *class, > - enum zs_stat_type type) > -{ > - return 0; > -} > - > static int __init zs_stat_init(void) > { > return 0; > @@ -608,7 +585,6 @@ static inline int zs_pool_stat_create(char *name, struct zs_pool *pool) > static inline void zs_pool_stat_destroy(struct zs_pool *pool) > { > } > - > #endif > > > @@ -1682,7 +1658,6 @@ static void putback_zspage(struct zs_pool *pool, struct size_class *class, > class->size, class->pages_per_zspage)); > atomic_long_sub(class->pages_per_zspage, > &pool->pages_allocated); > - > free_zspage(first_page); > } > } > -- > 2.4.2.337.gfae46aa > -- Kind regards, Minchan Kim -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>