From patchwork Thu May 9 03:41:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Gushchin X-Patchwork-Id: 13659416 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 55B67C25B74 for ; Thu, 9 May 2024 03:42:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1A3586B009A; Wed, 8 May 2024 23:42:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 151996B009B; Wed, 8 May 2024 23:42:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F0D916B009C; Wed, 8 May 2024 23:42:27 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id CEDD36B009A for ; Wed, 8 May 2024 23:42:27 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 654E3A1D86 for ; Thu, 9 May 2024 03:42:27 +0000 (UTC) X-FDA: 82097459934.14.B2C2770 Received: from out-182.mta1.migadu.com (out-182.mta1.migadu.com [95.215.58.182]) by imf04.hostedemail.com (Postfix) with ESMTP id C34F840005 for ; Thu, 9 May 2024 03:42:25 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=NEPcHmH2; spf=pass (imf04.hostedemail.com: domain of roman.gushchin@linux.dev designates 95.215.58.182 as permitted sender) smtp.mailfrom=roman.gushchin@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1715226145; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=b9lUdssqcdP+CrtmSgsIzouILJvuOsKGGEAvcTP1mqg=; b=4eWAdoc/03TN8NWLqcJHfAt7w8JAg5fDXV/Eu7EJ2vvt/c/mJ9ts91omIHmQf3Lvb/3b5q 6MLfMqbC9ph/UTEoY55wJvWk4XOydPVETc0vjHkFd9n8wrKalwyie65I93JUC0IRo4VXhJ zph9X+983b5o5VWy1+rvmQFfBZ2VJEc= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=NEPcHmH2; spf=pass (imf04.hostedemail.com: domain of roman.gushchin@linux.dev designates 95.215.58.182 as permitted sender) smtp.mailfrom=roman.gushchin@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1715226145; a=rsa-sha256; cv=none; b=wJ5BtfzQilq6ifn4fiJT4xSOMUCuSc9auQ0isSm1K1ZJpRNFhqEl4dJgC33+QbC51k3RbU YKXKUIinmacskVxninaQTgUZRgKZBSf+F8GlVlSC6vvM2TxbVs5P5H8V5xsI6P1ftYgbf+ rNAzyLvBUD5XUPOoQhR8qspeG9hmySc= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1715226144; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=b9lUdssqcdP+CrtmSgsIzouILJvuOsKGGEAvcTP1mqg=; b=NEPcHmH2DSzCrY//6NP0Bi4GvSl4OSSVZtie/gEZgChaQTJBZDgCrJCkjX4BVns83i/UBf cxeWGIqyE+J7wItvNZt3VjQy9rWQ2AZ6Nmlmnk2Y6jEvt8wYXfVGgyqFHH/Y4ZTMzhKvyY noBAfFs68sT8nTfsE5YLtVRvjiqQWik= From: Roman Gushchin To: Andrew Morton Cc: Muchun Song , Johannes Weiner , Michal Hocko , Shakeel Butt , Matthew Wilcox , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Roman Gushchin Subject: [PATCH rfc 7/9] mm: memcg: put cgroup v1-specific code under a config option Date: Wed, 8 May 2024 20:41:36 -0700 Message-ID: <20240509034138.2207186-8-roman.gushchin@linux.dev> In-Reply-To: <20240509034138.2207186-1-roman.gushchin@linux.dev> References: <20240509034138.2207186-1-roman.gushchin@linux.dev> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Rspamd-Queue-Id: C34F840005 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: wf97eepf78hmt16jn3ahu8xo3cuzncqj X-HE-Tag: 1715226145-253424 X-HE-Meta: U2FsdGVkX1+wMgQyPqXR+R4OhixMxTWlLvlhnS9aYPQJaoNtd6AvdKhA+QIfgPBQtUtSUNA/i12wCpi3wFdGwA75WIU54NMm78n5I6KjoyHHenltWIp3eqn7SK1oJigvxcmbWsAWiO1Z5dAarhWtp4CogccQxdk9GZfDyCK1EeKM7L20duoyHpLW7XN3GtPdUvG3RWDx+ol5rQp6rTJblLp21Y6c9x5xud574K9DVacV2qb6xZrMCGQ0p4VziAzq723AHYwgRNQXU9GTL3EMUoV/VQAFV7y1szxoOwObXbGq3vnXyJg5Pe48ACTvdghx0/wDs2k1biImLjX3oX4GcSGEvxlQPgxMVThgX60CIKBq6vtLi9KXcxkzEFjRQuxl4VYhwORvnGcgsdQViF4sKF3tt3FCYWlyIlDlmzwsp8RNeD+Ju9Gv4aLKQeurBJ4Fow5Su/Lz9b9nZvRDW0a7xMymp9J8ux9udBTggLIJVJ7jUGZ5xHbCzJxoZCGtJ/DBWVJ/OSfpY/46dMLLIW49YPTBBytfRQF7My+0xKrE0QzrWcztsi/mmPxKm7HFsBRyBt9z97vfkq5UC/mt8lcO1SsVM7zC+x5HRZYNZRyDzPt0AO+ZI/3PWPTwZ5Xxe4+/37cAz9/WkN58ak0JKV5nF62gjwRcKKsZrm3wxWaIPKpoEsusR5QAF7P688I9Zt+geSJtK+7so+Oxs5iMTjEgPodWge7aS2zYvwNfyqUkF0Dhd4BSUZ7EHgyvaht0Jj8bYBAOD2//tojPFzdNMOdWAYGB33GcgGftl1eWL6RK9O4nGp+FPSDrMB+hLAd7Vg1usox8O5bspKWrG7N9gi5S7r/ZNUrkvnMnd810BQUFEZDchdhQtJT53/QPypOpvTZ3ZRVXxgZ2spkTO4Ee/hqkxjFTtsWNoEtR2fO1vJIAKtGJHZO877ZOnkZuP5aa+XbkiQoXx7YIKknvss4aNjV NCL2gYNo lIUKNu95gdJ3MtfhBIxxeTgAmaAvU3Zm/O14sQxYXIljYGJFdEFbLJj+Ul4bEj8PYT0SV6XEFDIy0ZHc= 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: List-Subscribe: List-Unsubscribe: Put legacy cgroup v1 memory controller code under a new CONFIG_MEMCG_V1 config option. The option is turned on by default as of now to keep things backward-compatible. But users who have fully adopted cgroup v2 and don't use cgroup v1 anymore can turn it off and benefit from a smaller memory footprint and small CPU wins on some memcg paths. Signed-off-by: Roman Gushchin --- include/linux/memcontrol.h | 13 ++++++++++--- init/Kconfig | 7 +++++++ mm/Makefile | 3 ++- mm/internal.h | 24 +++++++++++++++++++++++- mm/memcontrol.c | 10 +++++++--- 5 files changed, 49 insertions(+), 8 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index fc4aaa73aa5e..d2a4145b1909 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -954,7 +954,14 @@ static inline bool task_in_memcg_oom(struct task_struct *p) return p->memcg_in_oom; } +#ifdef CONFIG_MEMCG_V1 bool mem_cgroup_oom_synchronize(bool wait); +#else +static inline bool mem_cgroup_oom_synchronize(bool wait) +{ + return false; +} +#endif struct mem_cgroup *mem_cgroup_get_oom_group(struct task_struct *victim, struct mem_cgroup *oom_domain); void mem_cgroup_print_oom_group(struct mem_cgroup *memcg); @@ -1872,7 +1879,7 @@ static inline bool mem_cgroup_zswap_writeback_enabled(struct mem_cgroup *memcg) /* Cgroup v1-specific definitions */ -#ifdef CONFIG_MEMCG +#ifdef CONFIG_MEMCG_V1 unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, gfp_t gfp_mask, unsigned long *total_scanned); @@ -1895,7 +1902,7 @@ static inline void mem_cgroup_unlock_pages(void) { rcu_read_unlock(); } -#else /* CONFIG_MEMCG */ +#else /* CONFIG_MEMCG_V1 */ static inline unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, @@ -1924,6 +1931,6 @@ static inline void mem_cgroup_unlock_pages(void) { rcu_read_unlock(); } -#endif /* CONFIG_MEMCG */ +#endif /* CONFIG_MEMCG_V1 */ #endif /* _LINUX_MEMCONTROL_H */ diff --git a/init/Kconfig b/init/Kconfig index 10d4a638d9ae..ce9b78279627 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -969,6 +969,13 @@ config MEMCG help Provides control over the memory footprint of tasks in a cgroup. +config MEMCG_V1 + bool "Legacy memory controller" + depends on MEMCG + default y + help + Legacy cgroup v1 memory controller. + config MEMCG_KMEM bool depends on MEMCG diff --git a/mm/Makefile b/mm/Makefile index c717a3ee612e..4e2fe5f6637c 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -96,7 +96,8 @@ obj-$(CONFIG_NUMA) += memory-tiers.o obj-$(CONFIG_DEVICE_MIGRATION) += migrate_device.o obj-$(CONFIG_TRANSPARENT_HUGEPAGE) += huge_memory.o khugepaged.o obj-$(CONFIG_PAGE_COUNTER) += page_counter.o -obj-$(CONFIG_MEMCG) += memcontrol.o memcontrol-v1.o vmpressure.o +obj-$(CONFIG_MEMCG_V1) += memcontrol-v1.o +obj-$(CONFIG_MEMCG) += memcontrol.o vmpressure.o ifdef CONFIG_SWAP obj-$(CONFIG_MEMCG) += swap_cgroup.o endif diff --git a/mm/internal.h b/mm/internal.h index 1b94e2169e19..8c5640ef85f8 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -1559,7 +1559,6 @@ static inline int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, } void mem_cgroup_charge_statistics(struct mem_cgroup *memcg, int nr_pages); -void memcg_oom_recover(struct mem_cgroup *memcg); void mem_cgroup_id_get_many(struct mem_cgroup *memcg, unsigned int n); void mem_cgroup_id_put_many(struct mem_cgroup *memcg, unsigned int n); @@ -1589,6 +1588,7 @@ unsigned long memcg_events_local(struct mem_cgroup *memcg, int event); void drain_all_stock(struct mem_cgroup *root_memcg); /* Memory cgroups v1-specific definitions */ +#ifdef CONFIG_MEMCG_V1 void mem_cgroup_update_tree(struct mem_cgroup *memcg, int nid); void mem_cgroup_remove_from_trees(struct mem_cgroup *memcg); void mem_cgroup_soft_limit_reset(struct mem_cgroup *memcg); @@ -1618,9 +1618,31 @@ void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s); bool mem_cgroup_v1_oom_prepare(struct mem_cgroup *memcg, gfp_t mask, int order, bool *locked); void mem_cgroup_v1_oom_finish(struct mem_cgroup *memcg, bool *locked); +void memcg_oom_recover(struct mem_cgroup *memcg); void mem_cgroup_v1_offline_memcg(struct mem_cgroup *memcg); extern struct cftype memsw_files[]; extern struct cftype mem_cgroup_legacy_files[]; +#else /* CONFIG_MEMCG_V1 */ +static inline void mem_cgroup_remove_from_trees(struct mem_cgroup *memcg) {} +static inline void mem_cgroup_soft_limit_reset(struct mem_cgroup *memcg) {} + +static inline bool mem_cgroup_wait_acct_move(struct mem_cgroup *memcg) +{ + return false; +} + +static inline void memcg_check_events(struct mem_cgroup *memcg, int nid) {} +static inline void memcg1_stat_format(struct mem_cgroup *memcg, struct seq_buf *s) {} +static inline bool mem_cgroup_v1_oom_prepare(struct mem_cgroup *memcg, gfp_t mask, int order, + bool *locked) +{ + return true; +} +static inline void mem_cgroup_v1_oom_finish(struct mem_cgroup *memcg, bool *locked) {} +static inline void memcg_oom_recover(struct mem_cgroup *memcg) {} +static inline void mem_cgroup_v1_offline_memcg(struct mem_cgroup *memcg) {} +#endif /* CONFIG_MEMCG_V1 */ + #endif /* __MM_INTERNAL_H */ diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 805efc98ae12..d5883f748330 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4435,18 +4435,20 @@ struct cgroup_subsys memory_cgrp_subsys = { .css_free = mem_cgroup_css_free, .css_reset = mem_cgroup_css_reset, .css_rstat_flush = mem_cgroup_css_rstat_flush, - .can_attach = mem_cgroup_can_attach, #if defined(CONFIG_LRU_GEN) || defined(CONFIG_MEMCG_KMEM) .attach = mem_cgroup_attach, #endif - .cancel_attach = mem_cgroup_cancel_attach, - .post_attach = mem_cgroup_move_task, #ifdef CONFIG_MEMCG_KMEM .fork = mem_cgroup_fork, .exit = mem_cgroup_exit, #endif .dfl_cftypes = memory_files, +#ifdef CONFIG_MEMCG_V1 + .can_attach = mem_cgroup_can_attach, + .cancel_attach = mem_cgroup_cancel_attach, + .post_attach = mem_cgroup_move_task, .legacy_cftypes = mem_cgroup_legacy_files, +#endif .early_init = 0, }; @@ -5618,7 +5620,9 @@ static int __init mem_cgroup_swap_init(void) return 0; WARN_ON(cgroup_add_dfl_cftypes(&memory_cgrp_subsys, swap_files)); +#ifdef CONFIG_MEMCG_V1 WARN_ON(cgroup_add_legacy_cftypes(&memory_cgrp_subsys, memsw_files)); +#endif #if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_ZSWAP) WARN_ON(cgroup_add_dfl_cftypes(&memory_cgrp_subsys, zswap_files)); #endif