* Re: [PATCH v5 6/7] zsmalloc: account the number of compacted pages [not found] ` <1436185070-1940-7-git-send-email-sergey.senozhatsky@gmail.com> @ 2015-07-06 13:22 ` Minchan Kim 2015-07-06 13:48 ` Sergey Senozhatsky 0 siblings, 1 reply; 5+ messages in thread From: Minchan Kim @ 2015-07-06 13:22 UTC (permalink / raw) To: Sergey Senozhatsky Cc: Andrew Morton, linux-mm, linux-kernel, Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com, Sergey Senozhatsky On Mon, Jul 06, 2015 at 09:17:49PM +0900, Sergey Senozhatsky wrote: > Compaction returns back to zram the number of migrated objects, > which is quite uninformative -- we have objects of different > sizes so user space cannot obtain any valuable data from that > number. Change compaction to operate in terms of pages and > return back to compaction issuer the number of pages that > were freed during compaction. So from now on `num_compacted' > column in zram<id>/mm_stat represents more meaningful value: > the number of freed (compacted) pages. Fair enough. The main reason I introduced num_migrated is to investigate the effieciency of compaction. ie, num_freed / num_migrated. However, I didn't put num_freed at that time so I can't get my goal with only num_migrated. We could put new knob num_compacted as well as num_migrated but I don't think we need it now. Zram's compaction would be much efficient compared to VM's compaction because we don't have any non-movable objects in zspages and we can account exact number of free slots. So, I want to change name from num_migrated to num_compacted and maintain only it which is more useful for admin, you said. It's not far since we introduced num_migrated so I don't think change name wouldn't be a big problem for userspace,(I hope). > > Return first_page's fullness_group from putback_zspage(), > so we now for sure know that putback_zspage() has issued > free_zspage() and we must update compaction stats. > > Update documentation. > > Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> > --- > Documentation/blockdev/zram.txt | 3 ++- > mm/zsmalloc.c | 27 +++++++++++++++++---------- > 2 files changed, 19 insertions(+), 11 deletions(-) > > diff --git a/Documentation/blockdev/zram.txt b/Documentation/blockdev/zram.txt > index c4de576..71f4744 100644 > --- a/Documentation/blockdev/zram.txt > +++ b/Documentation/blockdev/zram.txt > @@ -144,7 +144,8 @@ mem_used_max RW the maximum amount memory zram have consumed to > store compressed data > mem_limit RW the maximum amount of memory ZRAM can use to store > the compressed data > -num_migrated RO the number of objects migrated migrated by compaction > +num_migrated RO the number of pages freed during compaction > + (available only via zram<id>/mm_stat node) > compact WO trigger memory compaction > > WARNING > diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c > index e0f508a..a761733 100644 > --- a/mm/zsmalloc.c > +++ b/mm/zsmalloc.c > @@ -245,7 +245,7 @@ struct zs_pool { > /* Allocation flags used when growing pool */ > gfp_t flags; > atomic_long_t pages_allocated; > - /* How many objects were migrated */ > + /* How many pages were migrated (freed) */ > unsigned long num_migrated; > > #ifdef CONFIG_ZSMALLOC_STAT > @@ -1596,8 +1596,6 @@ struct zs_compact_control { > /* Starting object index within @s_page which used for live object > * in the subpage. */ > int index; > - /* How many of objects were migrated */ > - int nr_migrated; > }; > > static int migrate_zspage(struct zs_pool *pool, struct size_class *class, > @@ -1634,7 +1632,6 @@ static int migrate_zspage(struct zs_pool *pool, struct size_class *class, > record_obj(handle, free_obj); > unpin_tag(handle); > obj_free(pool, class, used_obj); > - cc->nr_migrated++; > } > > /* Remember last position in this iteration */ > @@ -1660,8 +1657,17 @@ static struct page *isolate_target_page(struct size_class *class) > return page; > } > > -static void putback_zspage(struct zs_pool *pool, struct size_class *class, > - struct page *first_page) > +/* > + * putback_zspage - add @first_page into right class's fullness list > + * @pool: target pool > + * @class: destination class > + * @first_page: target page > + * > + * Return @fist_page's fullness_group > + */ > +static enum fullness_group putback_zspage(struct zs_pool *pool, > + struct size_class *class, > + struct page *first_page) > { > enum fullness_group fullness; > > @@ -1679,6 +1685,8 @@ static void putback_zspage(struct zs_pool *pool, struct size_class *class, > > free_zspage(first_page); > } > + > + return fullness; > } > > static struct page *isolate_source_page(struct size_class *class) > @@ -1720,7 +1728,6 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class) > struct page *src_page; > struct page *dst_page = NULL; > > - cc.nr_migrated = 0; > spin_lock(&class->lock); > while ((src_page = isolate_source_page(class))) { > > @@ -1749,7 +1756,9 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class) > break; > > putback_zspage(pool, class, dst_page); > - putback_zspage(pool, class, src_page); > + if (putback_zspage(pool, class, src_page) == ZS_EMPTY) > + pool->num_migrated += > + get_pages_per_zspage(class->size); > spin_unlock(&class->lock); > cond_resched(); > spin_lock(&class->lock); > @@ -1758,8 +1767,6 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class) > if (src_page) > putback_zspage(pool, class, src_page); > > - pool->num_migrated += cc.nr_migrated; > - > spin_unlock(&class->lock); > } > > -- > 2.5.0.rc0.3.g912bd49 > -- Kind regards, Minchan Kim ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 6/7] zsmalloc: account the number of compacted pages 2015-07-06 13:22 ` [PATCH v5 6/7] zsmalloc: account the number of compacted pages Minchan Kim @ 2015-07-06 13:48 ` Sergey Senozhatsky 2015-07-06 14:00 ` Minchan Kim 0 siblings, 1 reply; 5+ messages in thread From: Sergey Senozhatsky @ 2015-07-06 13:48 UTC (permalink / raw) To: Minchan Kim; +Cc: Sergey Senozhatsky, Andrew Morton, linux-mm, linux-kernel On (07/06/15 22:22), Minchan Kim wrote: > On Mon, Jul 06, 2015 at 09:17:49PM +0900, Sergey Senozhatsky wrote: > > Compaction returns back to zram the number of migrated objects, > > which is quite uninformative -- we have objects of different > > sizes so user space cannot obtain any valuable data from that > > number. Change compaction to operate in terms of pages and > > return back to compaction issuer the number of pages that > > were freed during compaction. So from now on `num_compacted' > > column in zram<id>/mm_stat represents more meaningful value: > > the number of freed (compacted) pages. > > Fair enough. > > The main reason I introduced num_migrated is to investigate > the effieciency of compaction. ie, num_freed / num_migrated. > However, I didn't put num_freed at that time so I can't get > my goal with only num_migrated. > > We could put new knob num_compacted as well as num_migrated > but I don't think we need it now. Zram's compaction would be > much efficient compared to VM's compaction because we don't > have any non-movable objects in zspages and we can account > exact number of free slots. > > So, I want to change name from num_migrated to num_compacted > and maintain only it which is more useful for admin, you said. > > It's not far since we introduced num_migrated so I don't think > change name wouldn't be a big problem for userspace,(I hope). > Hello, Yes, num_migrated rename patch was on my table. I was thinking about two variants: struct zs_pool atomic_long_t pages_allocated; unsigned long num_compacted; or struct zs_pool atomic_long_t pages_allocated; unsigned long pages_compacted; the latter looks even better I think. But I didn't come up with a sane API name to get these stats-- zs_get_pages_compacted() is a bit misleading. So I decided to keep num_compacted to make the patch set smaller. Hm, exporting a new `struct zs_pool_stat' to zram is probably a good way to go. -ss ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 6/7] zsmalloc: account the number of compacted pages 2015-07-06 13:48 ` Sergey Senozhatsky @ 2015-07-06 14:00 ` Minchan Kim 0 siblings, 0 replies; 5+ messages in thread From: Minchan Kim @ 2015-07-06 14:00 UTC (permalink / raw) To: Sergey Senozhatsky; +Cc: Andrew Morton, linux-mm, linux-kernel On Mon, Jul 06, 2015 at 10:48:50PM +0900, Sergey Senozhatsky wrote: > On (07/06/15 22:22), Minchan Kim wrote: > > On Mon, Jul 06, 2015 at 09:17:49PM +0900, Sergey Senozhatsky wrote: > > > Compaction returns back to zram the number of migrated objects, > > > which is quite uninformative -- we have objects of different > > > sizes so user space cannot obtain any valuable data from that > > > number. Change compaction to operate in terms of pages and > > > return back to compaction issuer the number of pages that > > > were freed during compaction. So from now on `num_compacted' > > > column in zram<id>/mm_stat represents more meaningful value: > > > the number of freed (compacted) pages. > > > > Fair enough. > > > > The main reason I introduced num_migrated is to investigate > > the effieciency of compaction. ie, num_freed / num_migrated. > > However, I didn't put num_freed at that time so I can't get > > my goal with only num_migrated. > > > > We could put new knob num_compacted as well as num_migrated > > but I don't think we need it now. Zram's compaction would be > > much efficient compared to VM's compaction because we don't > > have any non-movable objects in zspages and we can account > > exact number of free slots. > > > > So, I want to change name from num_migrated to num_compacted > > and maintain only it which is more useful for admin, you said. > > > > It's not far since we introduced num_migrated so I don't think > > change name wouldn't be a big problem for userspace,(I hope). > > > > Hello, > > Yes, num_migrated rename patch was on my table. > I was thinking about two variants: > > struct zs_pool > atomic_long_t pages_allocated; > unsigned long num_compacted; > > or > > struct zs_pool > atomic_long_t pages_allocated; > unsigned long pages_compacted; > > the latter looks even better I think. But I didn't come up with a Yeb. > sane API name to get these stats-- zs_get_pages_compacted() is a bit > misleading. So I decided to keep num_compacted to make the patch set > smaller. > > Hm, exporting a new `struct zs_pool_stat' to zram is probably a good > way to go. Agreed. > > -ss -- Kind regards, Minchan Kim ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <1436185070-1940-6-git-send-email-sergey.senozhatsky@gmail.com>]
[parent not found: <20150706132728.GB16529@blaptop>]
* Re: [PATCH v5 5/7] zsmalloc/zram: store compaction stats in zspool [not found] ` <20150706132728.GB16529@blaptop> @ 2015-07-06 13:56 ` Sergey Senozhatsky 2015-07-06 14:01 ` Minchan Kim 0 siblings, 1 reply; 5+ messages in thread From: Sergey Senozhatsky @ 2015-07-06 13:56 UTC (permalink / raw) To: Minchan Kim Cc: Andrew Morton, linux-mm, linux-kernel, sergey.senozhatsky.work On (07/06/15 22:27), Minchan Kim wrote: > > `zs_compact_control' accounts the number of migrated objects but > > it has a limited lifespan -- we lose it as soon as zs_compaction() > > returns back to zram. It was fine, because (a) zram had it's own > > counter of migrated objects and (b) only zram could trigger > > compaction. However, this does not work for automatic pool > > compaction (not issued by zram). To account objects migrated > > during auto-compaction (issued by the shrinker) we need to store > > this number in zs_pool. > > > > A new zsmalloc zs_get_num_migrated() symbol exports zs_pool's > > ->num_migrated counter, so we better start using it, rather than > > continue keeping zram's own `num_migrated' copy in zram_stats. > > If we introduce like this API we should make new another API when > we want to introduce new stats. So I don't think it's a good idea. > How about this? > > void zsmalloc_stats(struct zsmalloc_stats *stats); > > So, we could return any upcoming stats without new API introduce. > Hm, agree. Do you prefer me to fold this into this patch set or to do as a separate work later? P.S. Sorry. Seems that my git send-email has some problems, so group-reply in mutt does not work as expected. -ss ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 5/7] zsmalloc/zram: store compaction stats in zspool 2015-07-06 13:56 ` [PATCH v5 5/7] zsmalloc/zram: store compaction stats in zspool Sergey Senozhatsky @ 2015-07-06 14:01 ` Minchan Kim 0 siblings, 0 replies; 5+ messages in thread From: Minchan Kim @ 2015-07-06 14:01 UTC (permalink / raw) To: Sergey Senozhatsky Cc: Andrew Morton, linux-mm, linux-kernel, sergey.senozhatsky.work On Mon, Jul 06, 2015 at 10:56:46PM +0900, Sergey Senozhatsky wrote: > On (07/06/15 22:27), Minchan Kim wrote: > > > `zs_compact_control' accounts the number of migrated objects but > > > it has a limited lifespan -- we lose it as soon as zs_compaction() > > > returns back to zram. It was fine, because (a) zram had it's own > > > counter of migrated objects and (b) only zram could trigger > > > compaction. However, this does not work for automatic pool > > > compaction (not issued by zram). To account objects migrated > > > during auto-compaction (issued by the shrinker) we need to store > > > this number in zs_pool. > > > > > > A new zsmalloc zs_get_num_migrated() symbol exports zs_pool's > > > ->num_migrated counter, so we better start using it, rather than > > > continue keeping zram's own `num_migrated' copy in zram_stats. > > > > If we introduce like this API we should make new another API when > > we want to introduce new stats. So I don't think it's a good idea. > > How about this? > > > > void zsmalloc_stats(struct zsmalloc_stats *stats); > > > > So, we could return any upcoming stats without new API introduce. > > > > Hm, agree. Do you prefer me to fold this into this patch set or to do as > a separate work later? Let's fold it so your next patch can use it for getting num_compacted. > > > P.S. > > Sorry. Seems that my git send-email has some problems, so group-reply > in mutt does not work as expected. > > > -ss -- Kind regards, Minchan Kim ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-07-06 14:02 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1436185070-1940-1-git-send-email-sergey.senozhatsky@gmail.com>
[not found] ` <1436185070-1940-7-git-send-email-sergey.senozhatsky@gmail.com>
2015-07-06 13:22 ` [PATCH v5 6/7] zsmalloc: account the number of compacted pages Minchan Kim
2015-07-06 13:48 ` Sergey Senozhatsky
2015-07-06 14:00 ` Minchan Kim
[not found] ` <1436185070-1940-6-git-send-email-sergey.senozhatsky@gmail.com>
[not found] ` <20150706132728.GB16529@blaptop>
2015-07-06 13:56 ` [PATCH v5 5/7] zsmalloc/zram: store compaction stats in zspool Sergey Senozhatsky
2015-07-06 14:01 ` Minchan Kim
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox