diff options
author | Minchan Kim <minchan.kim@lge.com> | 2015-09-08 15:04:47 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-08 15:35:28 -0700 |
commit | ad9d5e175a77a253f52a7259a7c918b8351d99f1 (patch) | |
tree | a09a440e04adb26ea738fabf369ec71b3590e49f | |
parent | 58f171174625150f3aaad0cddd3e365270b8e1b8 (diff) |
zsmalloc: consider ZS_ALMOST_FULL as migrate source
There is no reason to prevent select ZS_ALMOST_FULL as migration source
if we cannot find source from ZS_ALMOST_EMPTY.
With this patch, zs_can_compact will return more exact result.
Signed-off-by: Minchan Kim <minchan.kim@lge.com>
Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/zsmalloc.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 615b9b9b45eb..c10885ca87a4 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -1691,11 +1691,17 @@ static enum fullness_group putback_zspage(struct zs_pool *pool, static struct page *isolate_source_page(struct size_class *class) { - struct page *page; + int i; + struct page *page = NULL; + + for (i = ZS_ALMOST_EMPTY; i >= ZS_ALMOST_FULL; i--) { + page = class->fullness_list[i]; + if (!page) + continue; - page = class->fullness_list[ZS_ALMOST_EMPTY]; - if (page) - remove_zspage(page, class, ZS_ALMOST_EMPTY); + remove_zspage(page, class, i); + break; + } return page; } @@ -1711,9 +1717,6 @@ static unsigned long zs_can_compact(struct size_class *class) { unsigned long obj_wasted; - if (!zs_stat_get(class, CLASS_ALMOST_EMPTY)) - return 0; - obj_wasted = zs_stat_get(class, OBJ_ALLOCATED) - zs_stat_get(class, OBJ_USED); |