From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752606AbbGJBcR (ORCPT ); Thu, 9 Jul 2015 21:32:17 -0400 Received: from LGEMRELSE6Q.lge.com ([156.147.1.121]:41852 "EHLO lgemrelse6q.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751926AbbGJBcL (ORCPT ); Thu, 9 Jul 2015 21:32:11 -0400 X-Original-SENDERIP: 10.177.220.145 X-Original-MAILFROM: minchan@kernel.org From: Minchan Kim To: Andrew Morton Cc: Sergey Senozhatsky , Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Minchan Kim Subject: [PATCH] zsmalloc: consider ZS_ALMOST_FULL as migrate source Date: Fri, 10 Jul 2015 10:32:09 +0900 Message-Id: <1436491929-6617-1-git-send-email-minchan@kernel.org> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- mm/zsmalloc.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 8c78bcb..7bd7dde 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -1687,12 +1687,20 @@ 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; + bool found = false; - page = class->fullness_list[ZS_ALMOST_EMPTY]; - if (page) - remove_zspage(page, class, ZS_ALMOST_EMPTY); + for (i = ZS_ALMOST_EMPTY; i >= ZS_ALMOST_FULL; i--) { + page = class->fullness_list[i]; + if (!page) + continue; - return page; + remove_zspage(page, class, i); + found = true; + break; + } + + return found ? page : NULL; } /* @@ -1706,9 +1714,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); -- 1.7.9.5