From nobody Sun Sep 7 17:09:01 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C8E8EB64DA for ; Thu, 20 Jul 2023 07:09:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231461AbjGTHJZ (ORCPT ); Thu, 20 Jul 2023 03:09:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42958 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231458AbjGTHIs (ORCPT ); Thu, 20 Jul 2023 03:08:48 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B270626BB for ; Thu, 20 Jul 2023 00:08:41 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-56942442eb0so5423057b3.1 for ; Thu, 20 Jul 2023 00:08:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689836921; x=1692428921; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=n6O0Lt5KhyslMSHzCGrHaCXx7KAwNPu5E55KNetzzTM=; b=sV87N/HxxcZHHL1alJO5nBf8HzjYMdw6nkcR38Ddq2rUuAf28cTRr0rb709fkiRMW+ qEy3FdhFn01ikwkfx7y9qLguXlaMHGLFmuRtJXH+L+mW9RyHbcOJWlAUGrGs6aAu/INw 41Y2qTn8C7MjL6RvRw/y0YgIGxiJWL68zL7cWNRAYxyzZ5Cms/cFb5dUzlTJ6iCOM/ec 43odK5EQY91sLY+01W8AhKo4cVLmfc3JuvWr3teNDoKfkk1Lyj7dpYXltbO4KTOFr6c4 DheP8D0OnAwjx0EXPzUp5uV1Ui6HMxgha12C+iK56/iEaIj2+ON6C0S7v2ijUdptonk9 M9ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689836921; x=1692428921; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=n6O0Lt5KhyslMSHzCGrHaCXx7KAwNPu5E55KNetzzTM=; b=P+jr0rTmDwhcR8jue8e5J7Y1q8Ijin946yTKrN2t8cyfu/JB+x+3+rtWCj6f/WkcV7 c6fPtkZsj1DHJxA0sEzxBoszjbpg+Iy+fzfcBbPEPgmkLB7HyecRlkgOsO1XYFFxF7eL KEkTrptVO0Rmzp2ETz8YWEbMH6f8qprdul6rMCRMYRSijNn9Hpv81PVnwKuWhepjPJDw fG1/inRRC0Ya0K6N61/Fr45Z0L+zatzSE/WXCclQYhM4CekBja1+av0pToWz5OFale+1 wP70X3l60NuX2ROVXb8Inho5OEzgUOp62MiC9e66oMvrAznYC0wLLp+2HLurRlREgygL Anwg== X-Gm-Message-State: ABy/qLY9veaZ+aiMzSM9RcXqtEP9HDQxp3xsVxtXyb4xTKD2X8R13qhs 9rgDzPkn0b8RDD/jZD83nXCTTkjbhQVs/LKl X-Google-Smtp-Source: APBJJlGMoGTZrbru1fVb9JslthbAiF2wsIl2HsR1Hk3nalG2jl6ctXDHaNYmeI9gMwOHtknP/aKqVV0pkkfu/CUf X-Received: from yosry.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2327]) (user=yosryahmed job=sendgmr) by 2002:a5b:b8b:0:b0:c4c:f97e:421a with SMTP id l11-20020a5b0b8b000000b00c4cf97e421amr39950ybq.4.1689836920855; Thu, 20 Jul 2023 00:08:40 -0700 (PDT) Date: Thu, 20 Jul 2023 07:08:24 +0000 In-Reply-To: <20230720070825.992023-1-yosryahmed@google.com> Mime-Version: 1.0 References: <20230720070825.992023-1-yosryahmed@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230720070825.992023-8-yosryahmed@google.com> Subject: [RFC PATCH 7/8] memcg: add sysctl and config option to control memory recharging From: Yosry Ahmed To: Andrew Morton , Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt Cc: Muchun Song , "Matthew Wilcox (Oracle)" , Tejun Heo , Zefan Li , Yu Zhao , Luis Chamberlain , Kees Cook , Iurii Zaikin , "T.J. Mercier" , Greg Thelen , linux-kernel@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, Yosry Ahmed Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a sysctl to enable/disable memory recharging for offline memcgs. Add a config option to control whether or not it is enabled by default. Signed-off-by: Yosry Ahmed --- include/linux/memcontrol.h | 2 ++ kernel/sysctl.c | 11 +++++++++++ mm/Kconfig | 12 ++++++++++++ mm/memcontrol.c | 9 ++++++++- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 59b653d4a76e..ae9f09ee90cb 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -60,6 +60,8 @@ struct mem_cgroup_reclaim_cookie { =20 #ifdef CONFIG_MEMCG =20 +extern int sysctl_recharge_offline_memcgs; + #define MEM_CGROUP_ID_SHIFT 16 #define MEM_CGROUP_ID_MAX USHRT_MAX =20 diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 354a2d294f52..1735d1d95652 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -2249,6 +2249,17 @@ static struct ctl_table vm_table[] =3D { .extra2 =3D (void *)&mmap_rnd_compat_bits_max, }, #endif +#ifdef CONFIG_MEMCG + { + .procname =3D "recharge_offline_memcgs", + .data =3D &sysctl_recharge_offline_memcgs, + .maxlen =3D sizeof(sysctl_recharge_offline_memcgs), + .mode =3D 0644, + .proc_handler =3D proc_dointvec_minmax, + .extra1 =3D SYSCTL_ZERO, + .extra2 =3D SYSCTL_ONE, + }, +#endif /* CONFIG_MEMCG */ { } }; =20 diff --git a/mm/Kconfig b/mm/Kconfig index 09130434e30d..9462c4b598d9 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -1236,6 +1236,18 @@ config LOCK_MM_AND_FIND_VMA bool depends on !STACK_GROWSUP =20 +config MEMCG_RECHARGE_OFFLINE_ENABLED + bool "Recharge memory charged to offline memcgs" + depends on MEMCG + help + When a memory cgroup is removed by userspace, try to recharge any + memory still charged to it to avoid having it live on as an offline + memcg. Offline memcgs potentially consume memory and limit scalability + of some operations. + + This option enables the above behavior by default. It can be override + at runtime through /proc/sys/vm/recharge_offline_memcgs. + source "mm/damon/Kconfig" =20 endmenu diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 2fe9c6f1be80..25cdb17eaaa3 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -96,6 +96,9 @@ static bool cgroup_memory_nobpf __ro_after_init; static DECLARE_WAIT_QUEUE_HEAD(memcg_cgwb_frn_waitq); #endif =20 +int sysctl_recharge_offline_memcgs __read_mostly =3D IS_ENABLED( + CONFIG_MEMCG_RECHARGE_OFFLINE_ENABLED); + static struct workqueue_struct *memcg_recharge_wq; =20 /* Whether legacy memory+swap accounting is active */ @@ -6592,7 +6595,8 @@ static void memcg_recharge_mapped_folios(struct mem_c= group *memcg) INIT_DELAYED_WORK(&memcg->recharge_mapped_work.dwork, memcg_do_recharge_mapped_folios); =20 - if (memcg_recharge_wq && memcg_nr_local_mapped_pages(memcg)) { + if (sysctl_recharge_offline_memcgs && + memcg_recharge_wq && memcg_nr_local_mapped_pages(memcg)) { memcg->recharge_mapped_work.retries =3D 0; queue_delayed_work(memcg_recharge_wq, &memcg->recharge_mapped_work.dwork, 0); @@ -6605,6 +6609,9 @@ static bool should_do_deferred_recharge(struct folio = *folio) struct mem_cgroup *memcg; bool ret; =20 + if (!sysctl_recharge_offline_memcgs) + return false; + rcu_read_lock(); memcg =3D folio_memcg_rcu(folio); ret =3D memcg && !!(memcg->css.flags & CSS_DYING); --=20 2.41.0.255.g8b1d071c50-goog