From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5A419C433ED for ; Fri, 16 Apr 2021 17:22:42 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 0C2B9610CE for ; Fri, 16 Apr 2021 17:22:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0C2B9610CE Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=baidu.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 5CFCD6B0036; Fri, 16 Apr 2021 13:22:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5804A6B006C; Fri, 16 Apr 2021 13:22:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 447B96B0070; Fri, 16 Apr 2021 13:22:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 274956B0036 for ; Fri, 16 Apr 2021 13:22:41 -0400 (EDT) Received: from smtpin21.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id DB6B6183956FE for ; Fri, 16 Apr 2021 17:22:40 +0000 (UTC) X-FDA: 78038899680.21.2F8F56B Received: from njjs-sys-mailin01.njjs.baidu.com (mx311.baidu.com [180.101.52.76]) by imf24.hostedemail.com (Postfix) with ESMTP id 392D8A0003A5 for ; Fri, 16 Apr 2021 17:22:31 +0000 (UTC) Received: from unknown.domain.tld (bjhw-sys-rpm015653cc5.bjhw.baidu.com [10.227.53.39]) by njjs-sys-mailin01.njjs.baidu.com (Postfix) with ESMTP id 7FF6A7F00049; Sat, 17 Apr 2021 01:22:31 +0800 (CST) From: chukaiping To: mcgrof@kernel.org, keescook@chromium.org, yzaikin@google.com, akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v2] mm/compaction:let proactive compaction order configurable Date: Sat, 17 Apr 2021 01:22:31 +0800 Message-Id: <1618593751-32148-1-git-send-email-chukaiping@baidu.com> X-Mailer: git-send-email 1.7.1 X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 392D8A0003A5 X-Stat-Signature: 3hp333wkn6cmu1gen9xkdx3ogo3m66c9 Received-SPF: none (baidu.com>: No applicable sender policy available) receiver=imf24; identity=mailfrom; envelope-from=""; helo=njjs-sys-mailin01.njjs.baidu.com; client-ip=180.101.52.76 X-HE-DKIM-Result: none/none X-HE-Tag: 1618593751-68889 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Currently the proactive compaction order is fixed to COMPACTION_HPAGE_ORDER(9), it's OK in most machines with lots of normal 4KB memory, but it's too high for the machines with small normal memory, for example the machines with most memory configured as 1GB hugetlbfs huge pages. In these machines the max order of free pages is often below 9, and it's always below 9 even with hard compaction. This will lead to proactive compaction be triggered very frequently. In these machines we only care about order of 3 or 4. This patch export the oder to proc and let it configurable by user, and the default value is still COMPACTION_HPAGE_ORDER. Signed-off-by: chukaiping Reported-by: kernel test robot --- Changes in v2: - fix the compile error in ia64 and powerpc - change the hard coded max order number from 10 to MAX_ORDER - 1 include/linux/compaction.h | 1 + kernel/sysctl.c | 11 +++++++++++ mm/compaction.c | 14 +++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/linux/compaction.h b/include/linux/compaction.h index ed4070e..151ccd1 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h @@ -83,6 +83,7 @@ static inline unsigned long compact_gap(unsigned int order) #ifdef CONFIG_COMPACTION extern int sysctl_compact_memory; extern unsigned int sysctl_compaction_proactiveness; +extern unsigned int sysctl_compaction_order; extern int sysctl_compaction_handler(struct ctl_table *table, int write, void *buffer, size_t *length, loff_t *ppos); extern int sysctl_extfrag_threshold; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 62fbd09..a607d4d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -195,6 +195,8 @@ enum sysctl_writes_mode { #endif /* CONFIG_SMP */ #endif /* CONFIG_SCHED_DEBUG */ +static int max_buddy_zone = MAX_ORDER - 1; + #ifdef CONFIG_COMPACTION static int min_extfrag_threshold; static int max_extfrag_threshold = 1000; @@ -2871,6 +2873,15 @@ int proc_do_static_key(struct ctl_table *table, int write, .extra2 = &one_hundred, }, { + .procname = "compaction_order", + .data = &sysctl_compaction_order, + .maxlen = sizeof(sysctl_compaction_order), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = &max_buddy_zone, + }, + { .procname = "extfrag_threshold", .data = &sysctl_extfrag_threshold, .maxlen = sizeof(int), diff --git a/mm/compaction.c b/mm/compaction.c index e04f447..bfd1d5e 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -1925,16 +1925,16 @@ static bool kswapd_is_running(pg_data_t *pgdat) /* * A zone's fragmentation score is the external fragmentation wrt to the - * COMPACTION_HPAGE_ORDER. It returns a value in the range [0, 100]. + * sysctl_compaction_order. It returns a value in the range [0, 100]. */ static unsigned int fragmentation_score_zone(struct zone *zone) { - return extfrag_for_order(zone, COMPACTION_HPAGE_ORDER); + return extfrag_for_order(zone, sysctl_compaction_order); } /* * A weighted zone's fragmentation score is the external fragmentation - * wrt to the COMPACTION_HPAGE_ORDER scaled by the zone's size. It + * wrt to the sysctl_compaction_order scaled by the zone's size. It * returns a value in the range [0, 100]. * * The scaling factor ensures that proactive compaction focuses on larger @@ -2666,6 +2666,7 @@ static void compact_nodes(void) * background. It takes values in the range [0, 100]. */ unsigned int __read_mostly sysctl_compaction_proactiveness = 20; +unsigned int __read_mostly sysctl_compaction_order; /* * This is the entry point for compacting all nodes via @@ -2958,6 +2959,13 @@ static int __init kcompactd_init(void) int nid; int ret; + /* + * move the initialization of sysctl_compaction_order to here to + * eliminate compile error in ia64 and powerpc architecture because + * COMPACTION_HPAGE_ORDER is a variable in this architecture + */ + sysctl_compaction_order = COMPACTION_HPAGE_ORDER; + ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "mm/compaction:online", kcompactd_cpu_online, NULL); -- 1.7.1