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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id DC3DCC3ABC3 for ; Tue, 13 May 2025 03:13:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EFF796B008C; Mon, 12 May 2025 23:13:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E86B76B0092; Mon, 12 May 2025 23:13:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CD9DE6B0093; Mon, 12 May 2025 23:13:54 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id A59596B008C for ; Mon, 12 May 2025 23:13:54 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 970FBE2A5A for ; Tue, 13 May 2025 03:13:55 +0000 (UTC) X-FDA: 83436415230.18.080D681 Received: from out-181.mta0.migadu.com (out-181.mta0.migadu.com [91.218.175.181]) by imf02.hostedemail.com (Postfix) with ESMTP id 1C53D80002 for ; Tue, 13 May 2025 03:13:53 +0000 (UTC) Authentication-Results: imf02.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b="ooSsm/BG"; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf02.hostedemail.com: domain of shakeel.butt@linux.dev designates 91.218.175.181 as permitted sender) smtp.mailfrom=shakeel.butt@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747106034; a=rsa-sha256; cv=none; b=dVeVprstdIBWgYdAuynsrIgSoKkrdADiWXIQ9HfaCLeu1RHPCObrwASkqFcbMtnjrQkNSi U4A0i/xYaM1tTNN/pk8xf4mf86uhMN2HtGw4kxVSppz+K99h9ThVTHCLjaH/pvMGGwEJMk lCvwyOM1B5/AN2Dsg/kCcGJaLXrCSt8= ARC-Authentication-Results: i=1; imf02.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b="ooSsm/BG"; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf02.hostedemail.com: domain of shakeel.butt@linux.dev designates 91.218.175.181 as permitted sender) smtp.mailfrom=shakeel.butt@linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747106034; 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=BPiRuCw/bD9XYJlwvKtjg4J90L1EW0IfWXzhcocLuzg=; b=0IYyK2klWXpHuqgTy7mNtWZ7cc1n86larmjjF4zd6tWtXh1lTR/83RAPobPPZsBmshROTl tn7F4ru7/yDgje7WrufXEDEt416iHm7aYThismbYGc6mE0CqqFLSd8R9BExgIcuBnSuKrE OoIV7v1nyeO2k5Ji/gLZkhKA/6H/flg= 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=1747106031; 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=BPiRuCw/bD9XYJlwvKtjg4J90L1EW0IfWXzhcocLuzg=; b=ooSsm/BGkm7jLt7WeCVzcIeXfSfmLTTxu3NEHROcON2zE6dLycnVCdS6+Pirr61u6vkq4u euHpiYkfCAx2oacQVM//UVnoD5lrLUEW6o3iX/cgHCN3dSAZ0N3CB7eKx5dyzXrhUClRXc QwDnQ1oHgBA0T+GBQDkE5Eg074eoGKI= From: Shakeel Butt To: Andrew Morton Cc: Johannes Weiner , Michal Hocko , Roman Gushchin , Muchun Song , Vlastimil Babka , Alexei Starovoitov , Sebastian Andrzej Siewior , Harry Yoo , Yosry Ahmed , bpf@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Meta kernel team Subject: [RFC PATCH 3/7] memcg: make mod_memcg_state re-entrant safe against irqs Date: Mon, 12 May 2025 20:13:12 -0700 Message-ID: <20250513031316.2147548-4-shakeel.butt@linux.dev> In-Reply-To: <20250513031316.2147548-1-shakeel.butt@linux.dev> References: <20250513031316.2147548-1-shakeel.butt@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Stat-Signature: a4gj5k6n1b4xje1fykzw3oymq89oia5n X-Rspam-User: X-Rspamd-Queue-Id: 1C53D80002 X-Rspamd-Server: rspam06 X-HE-Tag: 1747106033-106811 X-HE-Meta: U2FsdGVkX18uaWJ2/IjAEAL0s1LmeIOt5csH3T8kzDzvJM9NPGfw8yAxqDyMQ7Tnb4gFwAKZpeKHM76W8jLcLdRqrOBqGaZCXDmGBwNk34kriI9FAAGEmK+Z4fwdEQJpxRm9pnFdk9yFU9mQQxuUYd157JFcj6u2umi1Syh4imkH3G38++TryREAZsFIGbV0PvB6+et+pLFVZQHfGLYxqnJ0DYx2tMosrFZwhI7hygeFJ/SBRxjnvif9o/Q03wIEkF0JkUwWxDvvenChLIQGgjRG/Vsl1dgFuD7IpmjN0SUloStdYU2cZB4M9JNPfSVQCYjk4K32cSx0qqUHbgnZvpg1KWfI0fVzANPSx6GXaOj6QZvSrE94yty7XgStek2n8bOnbYAdGCTUx6OT1XA4X4uMPr442b6TReFZrYgTexxdXU/wXV42HA0kxylTFZCEQMMD4+I47Tqq69HYSnA3D0xpmQOyxkkHxPJOosxlZhni05NxAcxLPcN/crHDis4bNiD5S1TbrmFuOAxer247BCfrllsNYsk5Mnvh+t256nVUJdfmJ2ulhMTEuI0RLl4fz6RMgnfmhBhib3OHugFj7a5NXqyQJg1Tm2WtBsvgDUyqvKavWs45v1Z6oQfwprFKfSpkqasx3/7WiML/T0EADasXjUmPRAlzqrpcfj24P/tcrjYQNt4IcOsGWTREJ/wVQxBKDyzX88EIquQCAB5h5ANGRozhywy1GsduMzT7GP3+K2iitQFBgPoOfmRuzFeYzCOIz2QjSaIST2+73DzwsBBCqJTwiPcs+WQw7y2P4FMM+vYQBXnyJL27lmXMyMfZXCRDJZnz80878bQnfgHXhk9AtVSHhkHe3WKbDCuYaS5S9YBVwjMR5PeNHKQ2hst88iSaJrzzazm7msQ9MHBiN8zbxeGPTHAgngebrJCb/27bFnvPD6jlYaeoB/tQLLftAWrQHoCXfCI= 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: Let's make mod_memcg_state re-entrant safe against irqs. The only thing needed is to convert the usage of __this_cpu_add() to this_cpu_add(). In addition, with re-entrant safety, there is no need to disable irqs. mod_memcg_state() is not safe against nmi, so let's add warning if someone tries to call it in nmi context. Signed-off-by: Shakeel Butt --- include/linux/memcontrol.h | 20 ++------------------ mm/memcontrol.c | 12 ++++++++---- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index ed9acb68652a..84e2cea7e666 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -911,19 +911,9 @@ 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); -void __mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx, - int val); - /* idx can be of type enum memcg_stat_item or node_stat_item */ -static inline void mod_memcg_state(struct mem_cgroup *memcg, - enum memcg_stat_item idx, int val) -{ - unsigned long flags; - - local_irq_save(flags); - __mod_memcg_state(memcg, idx, val); - local_irq_restore(flags); -} +void mod_memcg_state(struct mem_cgroup *memcg, + enum memcg_stat_item idx, int val); static inline void mod_memcg_page_state(struct page *page, enum memcg_stat_item idx, int val) @@ -1390,12 +1380,6 @@ static inline void mem_cgroup_print_oom_group(struct mem_cgroup *memcg) { } -static inline void __mod_memcg_state(struct mem_cgroup *memcg, - enum memcg_stat_item idx, - int nr) -{ -} - static inline void mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx, int nr) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 62450e7991d8..373d36cae069 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -681,12 +681,12 @@ static int memcg_state_val_in_pages(int idx, int val) } /** - * __mod_memcg_state - update cgroup memory statistics + * mod_memcg_state - update cgroup memory statistics * @memcg: the memory cgroup * @idx: the stat item - can be enum memcg_stat_item or enum node_stat_item * @val: delta to add to the counter, can be negative */ -void __mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx, +void mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx, int val) { int i = memcg_stats_index(idx); @@ -698,9 +698,13 @@ void __mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx, if (WARN_ONCE(BAD_STAT_IDX(i), "%s: missing stat item %d\n", __func__, idx)) return; + if (WARN_ONCE(in_nmi(), "%s: called in nmi context for stat item %d\n", + __func__, idx)) + return; + cpu = get_cpu(); - __this_cpu_add(memcg->vmstats_percpu->state[i], val); + this_cpu_add(memcg->vmstats_percpu->state[i], val); val = memcg_state_val_in_pages(idx, val); memcg_rstat_updated(memcg, val, cpu); trace_mod_memcg_state(memcg, idx, val); @@ -2969,7 +2973,7 @@ static void drain_obj_stock(struct obj_stock_pcp *stock) memcg = get_mem_cgroup_from_objcg(old); - __mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages); + mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages); memcg1_account_kmem(memcg, -nr_pages); if (!mem_cgroup_is_root(memcg)) memcg_uncharge(memcg, nr_pages); -- 2.47.1