From nobody Fri Dec 19 18:52:14 2025 Received: from out-172.mta0.migadu.com (out-172.mta0.migadu.com [91.218.175.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E927327F164 for ; Fri, 16 May 2025 18:32:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420364; cv=none; b=iFh65B4inDHHfs2DWUgp0vRIwSxs3ajmHpJxs5JoD2HlRB6OycEzqzZQJhzy+Stmj196nvTz3ii731vaemDYApPF1pbGEFzK2gS19t/fwReyXO+76hxZikPTblekzn6b0+tzY+Dc3Uo5aPTXLxzi2rtnW7F+RrocabJr0uIWsw8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420364; c=relaxed/simple; bh=4ZjTVBpWHcRhiktqzgid2qNVT421D1E6/FiuocKdIR4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r95GXldfikK4OaKHOWnbvdmNec/tZ7nKkjxhe3u/p/sTLM7lhrj68nYipI6dxX8gMLFgWd3Pc2lj5WyB6N49aekchHoZRnKIws2rbzYKzIBFsJ1gMeo7ZzHOuAS8DhnCKdbNrjc/1Tc1COXZVHMqRTP3lGB+/ofekI9jSCO4QqI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=g9Xud4nU; arc=none smtp.client-ip=91.218.175.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="g9Xud4nU" 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=1747420360; 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=2t99xT19g/7qy5mAbIT4AWoGMrbj8qhuG2xvxaCqjsc=; b=g9Xud4nUZSS+w16AXeSr86eISPm8z0RnsTRYEC0O7EG0WtZS2ILoi8kVtrFW57WBpTaSIi XBqNB77YOyqqJWg9yZW3MXM4KdQYrg+GewqdNyW3Kvx7LqNRJDuu4v9Pqd/pDno4e1MYoR X7yvh6M5HH3crF/7viXSJSX1y4rogok= 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 , Peter Zijlstra , Mathieu Desnoyers , Tejun Heo , bpf@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Meta kernel team Subject: [PATCH v3 1/5] memcg: disable kmem charging in nmi for unsupported arch Date: Fri, 16 May 2025 11:32:27 -0700 Message-ID: <20250516183231.1615590-2-shakeel.butt@linux.dev> In-Reply-To: <20250516183231.1615590-1-shakeel.butt@linux.dev> References: <20250516183231.1615590-1-shakeel.butt@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" The memcg accounting and stats uses this_cpu* and atomic* ops. There are archs which define CONFIG_HAVE_NMI but does not define CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS and ARCH_HAVE_NMI_SAFE_CMPXCHG, so memcg accounting for such archs in nmi context is not possible to support. Let's just disable memcg accounting in nmi context for such archs. Signed-off-by: Shakeel Butt --- Changes since v2: - reorder the in_nmi() check as suggested by Vlastimil include/linux/memcontrol.h | 5 +++++ mm/memcontrol.c | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index f7848f73f41c..53920528821f 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -62,6 +62,11 @@ struct mem_cgroup_reclaim_cookie { =20 #ifdef CONFIG_MEMCG =20 +#if defined(CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS) || \ + !defined(CONFIG_HAVE_NMI) || defined(ARCH_HAVE_NMI_SAFE_CMPXCHG) +#define MEMCG_SUPPORTS_NMI_CHARGING +#endif + #define MEM_CGROUP_ID_SHIFT 16 =20 struct mem_cgroup_id { diff --git a/mm/memcontrol.c b/mm/memcontrol.c index e17b698f6243..0f182e4a9da0 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2647,11 +2647,26 @@ static struct obj_cgroup *current_objcg_update(void) return objcg; } =20 +#ifdef MEMCG_SUPPORTS_NMI_CHARGING +static inline bool nmi_charging_allowed(void) +{ + return true; +} +#else +static inline bool nmi_charging_allowed(void) +{ + return false; +} +#endif + __always_inline struct obj_cgroup *current_obj_cgroup(void) { struct mem_cgroup *memcg; struct obj_cgroup *objcg; =20 + if (!nmi_charging_allowed() && in_nmi()) + return NULL; + if (in_task()) { memcg =3D current->active_memcg; if (unlikely(memcg)) --=20 2.47.1 From nobody Fri Dec 19 18:52:14 2025 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AEB0227FD7A for ; Fri, 16 May 2025 18:32:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420368; cv=none; b=PErCYLlupHB+R+KJZ026KgebN+fwSk1PyGkOQ1NKnSrvs4OnnA5wQChBiFOwl1AjrLDa8XhZcuVf0UY6/iE4g0fKgMLH3adugWEDw9IAOBtd1PWLWpeh33HCOH1blNHO12c4mNQurpPfZawKeUNK21FWXUM2ueceVJvxtO3JFv8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420368; c=relaxed/simple; bh=/j5grWFzR0cjLnb6szug0veGlSKKF33wbGyFIYIE5hU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EuLwu5ijk/FMOYsdoCX7pebO9BEca8eXbUDoOX+5v5Mm4W8JSpRz7BV84Y1f56WY53cXo7V2m4uSakb3HQJm0VL43IIRdIRs5oyIVrlCTYS7LtbDjTseVP8WdZLFZj99P5aZvUrOjR1djbIN/NTNd0Bl/8P1Z61E1DMKNPaLOUU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=jdw9JAwJ; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="jdw9JAwJ" 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=1747420364; 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=evzcF8YYbapJWM/5H39TcTDHkMfCB1DFP3fd94phXVE=; b=jdw9JAwJea9s6TpFcnLTHiSqKvKTyjIlS2TvVYhMqApGexY3zMs4ot1is0MHQJaZwFmWkQ BahySWmK7l0vxeKRxbiFgP3mA+eFiytVL7Q2T/ke7PFkDzvdCFJtG6xmOl6Plq8sJm9ReJ AYSw46EVVEF69gxptIuFXp2YpOwD59E= 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 , Peter Zijlstra , Mathieu Desnoyers , Tejun Heo , bpf@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Meta kernel team Subject: [PATCH v3 2/5] memcg: nmi safe memcg stats for specific archs Date: Fri, 16 May 2025 11:32:28 -0700 Message-ID: <20250516183231.1615590-3-shakeel.butt@linux.dev> In-Reply-To: <20250516183231.1615590-1-shakeel.butt@linux.dev> References: <20250516183231.1615590-1-shakeel.butt@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" There are archs which have NMI but does not support this_cpu_* ops safely in the nmi context but they support safe atomic ops in nmi context. For such archs, let's add infra to use atomic ops for the memcg stats which can be updated in nmi. At the moment, the memcg stats which get updated in the objcg charging path are MEMCG_KMEM, NR_SLAB_RECLAIMABLE_B & NR_SLAB_UNRECLAIMABLE_B. Rather than adding support for all memcg stats to be nmi safe, let's just add infra to make these three stats nmi safe which this patch is doing. Signed-off-by: Shakeel Butt Acked-by: Vlastimil Babka --- include/linux/memcontrol.h | 20 ++++++++++++++-- mm/memcontrol.c | 49 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 53920528821f..b10ae2388c27 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -62,9 +62,15 @@ struct mem_cgroup_reclaim_cookie { =20 #ifdef CONFIG_MEMCG =20 -#if defined(CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS) || \ - !defined(CONFIG_HAVE_NMI) || defined(ARCH_HAVE_NMI_SAFE_CMPXCHG) +#if defined(CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS) || !defined(CONFIG_HAVE= _NMI) + +#define MEMCG_SUPPORTS_NMI_CHARGING + +#elif defined(ARCH_HAVE_NMI_SAFE_CMPXCHG) + #define MEMCG_SUPPORTS_NMI_CHARGING +#define MEMCG_NMI_NEED_ATOMIC + #endif =20 #define MEM_CGROUP_ID_SHIFT 16 @@ -118,6 +124,12 @@ struct mem_cgroup_per_node { CACHELINE_PADDING(_pad2_); unsigned long lru_zone_size[MAX_NR_ZONES][NR_LRU_LISTS]; struct mem_cgroup_reclaim_iter iter; + +#ifdef MEMCG_NMI_NEED_ATOMIC + /* slab stats for nmi context */ + atomic_t slab_reclaimable; + atomic_t slab_unreclaimable; +#endif }; =20 struct mem_cgroup_threshold { @@ -241,6 +253,10 @@ struct mem_cgroup { atomic_long_t memory_events[MEMCG_NR_MEMORY_EVENTS]; atomic_long_t memory_events_local[MEMCG_NR_MEMORY_EVENTS]; =20 +#ifdef MEMCG_NMI_NEED_ATOMIC + /* MEMCG_KMEM for nmi context */ + atomic_t kmem_stat; +#endif /* * Hint of reclaim pressure for socket memroy management. Note * that this indicator should NOT be used in legacy cgroup mode diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 0f182e4a9da0..a2f75f3537eb 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -3979,6 +3979,53 @@ static void mem_cgroup_stat_aggregate(struct aggrega= te_control *ac) } } =20 +#ifdef MEMCG_NMI_NEED_ATOMIC +static void flush_nmi_stats(struct mem_cgroup *memcg, struct mem_cgroup *p= arent, + int cpu) +{ + int nid; + + if (atomic_read(&memcg->kmem_stat)) { + int kmem =3D atomic_xchg(&memcg->kmem_stat, 0); + int index =3D memcg_stats_index(MEMCG_KMEM); + + memcg->vmstats->state[index] +=3D kmem; + if (parent) + parent->vmstats->state_pending[index] +=3D kmem; + } + + for_each_node_state(nid, N_MEMORY) { + struct mem_cgroup_per_node *pn =3D memcg->nodeinfo[nid]; + struct lruvec_stats *lstats =3D pn->lruvec_stats; + struct lruvec_stats *plstats =3D NULL; + + if (parent) + plstats =3D parent->nodeinfo[nid]->lruvec_stats; + + if (atomic_read(&pn->slab_reclaimable)) { + int slab =3D atomic_xchg(&pn->slab_reclaimable, 0); + int index =3D memcg_stats_index(NR_SLAB_RECLAIMABLE_B); + + lstats->state[index] +=3D slab; + if (plstats) + plstats->state_pending[index] +=3D slab; + } + if (atomic_read(&pn->slab_unreclaimable)) { + int slab =3D atomic_xchg(&pn->slab_unreclaimable, 0); + int index =3D memcg_stats_index(NR_SLAB_UNRECLAIMABLE_B); + + lstats->state[index] +=3D slab; + if (plstats) + plstats->state_pending[index] +=3D slab; + } + } +} +#else +static void flush_nmi_stats(struct mem_cgroup *memcg, struct mem_cgroup *p= arent, + int cpu) +{} +#endif + static void mem_cgroup_css_rstat_flush(struct cgroup_subsys_state *css, in= t cpu) { struct mem_cgroup *memcg =3D mem_cgroup_from_css(css); @@ -3987,6 +4034,8 @@ static void mem_cgroup_css_rstat_flush(struct cgroup_= subsys_state *css, int cpu) struct aggregate_control ac; int nid; =20 + flush_nmi_stats(memcg, parent, cpu); + statc =3D per_cpu_ptr(memcg->vmstats_percpu, cpu); =20 ac =3D (struct aggregate_control) { --=20 2.47.1 From nobody Fri Dec 19 18:52:14 2025 Received: from out-179.mta0.migadu.com (out-179.mta0.migadu.com [91.218.175.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C929A280025 for ; Fri, 16 May 2025 18:32:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420372; cv=none; b=FDmPj25IFaUVas2Erwrsio1qvAY4crB4NthWlKVCXzReyec4SeuRmlOgDkzDaITC9zry+H02bYK0iPOV6Q6Fndnm/we9ekkcLGNvMVZ3ShU7xwXAz0LpwYM9tQKJv3mqJkL4Y2Sg8FX00NkZVMDsGyYTsWMV1pr9IL264C2qlso= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420372; c=relaxed/simple; bh=A2u1i/MMllgBFbsfvmQnS7IiUU9ZPXbJqgMg+P07m1A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MLBOYHUb2vVxIM8WImVeXLyiLddbNaqQgEHwBkfBANptlfXjLfPTYmKbu9Yx7/brgm8SLwysJK2pWhiGiJ3bkBLW5Z6rVj+qxDeIe589zPwuXJX3vfPTy4cksuMTOWvZHS6nWdSKpM5Mf4GMNzg2utv7LiDHhgT5P05Ww91PTD0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=XfU57lfu; arc=none smtp.client-ip=91.218.175.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="XfU57lfu" 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=1747420367; 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=e7buLwUiQQ0DffKeVj3U+ImrNAav4xz6Np8Ze41l6/o=; b=XfU57lfuJWIcI//4FgUsBj/ZtAr/tsPZh7cX1goI/fmy5EwWHr3npMKZ9MJEZaIuDBjgeN yNITiCI2+LocitoWlqWFGJzsZcrfI9a19SfSbZbttlX1v47cz/28Ypvw3ZnTGHWdrf66j3 q3ZveCvIB1nP049XTKQll6oqranjMAE= 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 , Peter Zijlstra , Mathieu Desnoyers , Tejun Heo , bpf@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Meta kernel team Subject: [PATCH 3/5] memcg: add nmi-safe update for MEMCG_KMEM Date: Fri, 16 May 2025 11:32:29 -0700 Message-ID: <20250516183231.1615590-4-shakeel.butt@linux.dev> In-Reply-To: <20250516183231.1615590-1-shakeel.butt@linux.dev> References: <20250516183231.1615590-1-shakeel.butt@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" The objcg based kmem charging and uncharging code path needs to update MEMCG_KMEM appropriately. Let's add support to update MEMCG_KMEM in nmi-safe way for those code paths. Signed-off-by: Shakeel Butt Acked-by: Vlastimil Babka --- mm/memcontrol.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a2f75f3537eb..2c415ea7e2ec 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2729,6 +2729,23 @@ struct obj_cgroup *get_obj_cgroup_from_folio(struct = folio *folio) return objcg; } =20 +#ifdef MEMCG_NMI_NEED_ATOMIC +static inline void account_kmem_nmi_safe(struct mem_cgroup *memcg, int val) +{ + if (likely(!in_nmi())) { + mod_memcg_state(memcg, MEMCG_KMEM, val); + } else { + /* TODO: add to cgroup update tree once it is nmi-safe. */ + atomic_add(val, &memcg->kmem_stat); + } +} +#else +static inline void account_kmem_nmi_safe(struct mem_cgroup *memcg, int val) +{ + mod_memcg_state(memcg, MEMCG_KMEM, val); +} +#endif + /* * obj_cgroup_uncharge_pages: uncharge a number of kernel pages from a obj= cg * @objcg: object cgroup to uncharge @@ -2741,7 +2758,7 @@ static void obj_cgroup_uncharge_pages(struct obj_cgro= up *objcg, =20 memcg =3D get_mem_cgroup_from_objcg(objcg); =20 - mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages); + account_kmem_nmi_safe(memcg, -nr_pages); memcg1_account_kmem(memcg, -nr_pages); if (!mem_cgroup_is_root(memcg)) refill_stock(memcg, nr_pages); @@ -2769,7 +2786,7 @@ static int obj_cgroup_charge_pages(struct obj_cgroup = *objcg, gfp_t gfp, if (ret) goto out; =20 - mod_memcg_state(memcg, MEMCG_KMEM, nr_pages); + account_kmem_nmi_safe(memcg, nr_pages); memcg1_account_kmem(memcg, nr_pages); out: css_put(&memcg->css); --=20 2.47.1 From nobody Fri Dec 19 18:52:14 2025 Received: from out-186.mta1.migadu.com (out-186.mta1.migadu.com [95.215.58.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5F862275854 for ; Fri, 16 May 2025 18:33:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.186 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420398; cv=none; b=WI0TBr1VQryj6A9TBxAAsuuqK0LwP7oEUDRCDJuVgP2eVOOROL8+51umZuQa+Alb8DBxYMTUJpFMnbb24BzKbe9Z7I4CyWkdcr5q91Et1fR75IWIjMJm+A89YrdeuHsizdDp37qvTP8LojMneou0iEdyVidHWnYLLrucldef9tY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420398; c=relaxed/simple; bh=sBawP1zr7FrQ3gvHsHVDvJcA5o/k6MweXT2KHO4jc3o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fOBuF7AOGg1V3m/nF1rZe5MqnjIWEk44xSCXcz81B29UYoa5oUiX/60qIdE1WKXJGirMHEMD0bCmf3wf3ZFhMUpWvu5Wm+8XyP5oWmJvaFYPwMpmrMKDronSeEskTH2upsoNcf9zuMmY0DDHSI41bZ9vR5Tt6Dl8UxW43u/kUPY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=Di7RQo/2; arc=none smtp.client-ip=95.215.58.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="Di7RQo/2" 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=1747420393; 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=i/4zf437IrqL+bvg/IVOZSFq3ZgAp6BMJpR2kns0ovY=; b=Di7RQo/2oq5FZDJ19Yi6mGtoPlZoNhcA5ZzGc1n6W0uYVahbdnoCzg7sUbkeIoG/aQvzgY wxikgpCYcx1SZmEYyGqsMTgzhiqNZ0EB5W8EK/00iGK+Isis1LulOde5wKv+IXpQmPEokn CUOUQOOrMWMnl96odp3vqD8ra+rfIjg= 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 , Peter Zijlstra , Mathieu Desnoyers , Tejun Heo , bpf@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Meta kernel team Subject: [PATCH v3 4/5] memcg: nmi-safe slab stats updates Date: Fri, 16 May 2025 11:32:30 -0700 Message-ID: <20250516183231.1615590-5-shakeel.butt@linux.dev> In-Reply-To: <20250516183231.1615590-1-shakeel.butt@linux.dev> References: <20250516183231.1615590-1-shakeel.butt@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" The objcg based kmem [un]charging can be called in nmi context and it may need to update NR_SLAB_[UN]RECLAIMABLE_B stats. So, let's correctly handle the updates of these stats in the nmi context. Signed-off-by: Shakeel Butt Acked-by: Vlastimil Babka --- mm/memcontrol.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 2c415ea7e2ec..e96c5d1ca912 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2517,17 +2517,47 @@ static void commit_charge(struct folio *folio, stru= ct mem_cgroup *memcg) folio->memcg_data =3D (unsigned long)memcg; } =20 +#ifdef MEMCG_NMI_NEED_ATOMIC +static inline void account_slab_nmi_safe(struct mem_cgroup *memcg, + struct pglist_data *pgdat, + enum node_stat_item idx, int nr) +{ + struct lruvec *lruvec; + + if (likely(!in_nmi())) { + lruvec =3D mem_cgroup_lruvec(memcg, pgdat); + mod_memcg_lruvec_state(lruvec, idx, nr); + } else { + struct mem_cgroup_per_node *pn =3D memcg->nodeinfo[pgdat->node_id]; + + /* TODO: add to cgroup update tree once it is nmi-safe. */ + if (idx =3D=3D NR_SLAB_RECLAIMABLE_B) + atomic_add(nr, &pn->slab_reclaimable); + else + atomic_add(nr, &pn->slab_unreclaimable); + } +} +#else +static inline void account_slab_nmi_safe(struct mem_cgroup *memcg, + struct pglist_data *pgdat, + enum node_stat_item idx, int nr) +{ + struct lruvec *lruvec; + + lruvec =3D mem_cgroup_lruvec(memcg, pgdat); + mod_memcg_lruvec_state(lruvec, idx, nr); +} +#endif + static inline void mod_objcg_mlstate(struct obj_cgroup *objcg, struct pglist_data *pgdat, enum node_stat_item idx, int nr) { struct mem_cgroup *memcg; - struct lruvec *lruvec; =20 rcu_read_lock(); memcg =3D obj_cgroup_memcg(objcg); - lruvec =3D mem_cgroup_lruvec(memcg, pgdat); - mod_memcg_lruvec_state(lruvec, idx, nr); + account_slab_nmi_safe(memcg, pgdat, idx, nr); rcu_read_unlock(); } =20 --=20 2.47.1 From nobody Fri Dec 19 18:52:14 2025 Received: from out-174.mta1.migadu.com (out-174.mta1.migadu.com [95.215.58.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D1E0D27467D for ; Fri, 16 May 2025 18:33:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420417; cv=none; b=cTnmRbzyOVLpvhcup4sEznUqr2UZN/M6DHb8RsxcT5qlWUBUEIlPJkPQSeUyNnKQk6CR4spnhACbNI2h5SOubhZng6v5Y1Z8wezgFmsJPXBB2EMbLtfe5QgLVQtMQbGIKURil7PiWTk++yoAJYmExIt1yi28D3mKnESKHolWy08= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747420417; c=relaxed/simple; bh=L1FANs75GnyENPpCSObB44OAjAEmVoUmb9ZL9SNNgvw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PD0v8lNVroSKtGyt1NgT/hSgZ1JB2mMYpJr2rXbMCL4mVWyse4lyPYIyZ76dFoTrQEFyAK7+ugE/OTMfZEFRc0w8Ina6oTRIYAZjqt+/Y4IfIbbor5vTwTYGKqzarbyzk+KDwDKHjySJKC6J2fayX9zbLFE2GVaI/8v7C4ejtX4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=wGT+sTxw; arc=none smtp.client-ip=95.215.58.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="wGT+sTxw" 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=1747420413; 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=1SZJx0aaLO11/z+3A95G9xQwNAh1dQNdtZG0PH2m5B0=; b=wGT+sTxw8c5WygTZyHNWxHhaBeB2Db0T1IwGsnrjo6DRHxIVPalq/OKAbL348LKt8va1ok aKSVg6JumoxRhbeUydIJnLCYaUZl1g3qyRWzBYmuyhOu/Iqm6w+cA2tmqB2KV7rna+FWdP 5QoUGw+Hj0IkXGCzjaLre2twvGqg3tg= 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 , Peter Zijlstra , Mathieu Desnoyers , Tejun Heo , bpf@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Meta kernel team Subject: [PATCH v3 5/5] memcg: make memcg_rstat_updated nmi safe Date: Fri, 16 May 2025 11:32:31 -0700 Message-ID: <20250516183231.1615590-6-shakeel.butt@linux.dev> In-Reply-To: <20250516183231.1615590-1-shakeel.butt@linux.dev> References: <20250516183231.1615590-1-shakeel.butt@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Currently kernel maintains memory related stats updates per-cgroup to optimize stats flushing. The stats_updates is defined as atomic64_t which is not nmi-safe on some archs. Actually we don't really need 64bit atomic as the max value stats_updates can get should be less than nr_cpus * MEMCG_CHARGE_BATCH. A normal atomic_t should suffice. Also the function cgroup_rstat_updated() is still not nmi-safe but there is parallel effort to make it nmi-safe, so until then let's ignore it in the nmi context. Signed-off-by: Shakeel Butt Acked-by: Vlastimil Babka --- mm/memcontrol.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index e96c5d1ca912..2ace30fcd0e6 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -533,7 +533,7 @@ struct memcg_vmstats { unsigned long events_pending[NR_MEMCG_EVENTS]; =20 /* Stats updates since the last flush */ - atomic64_t stats_updates; + atomic_t stats_updates; }; =20 /* @@ -559,7 +559,7 @@ static u64 flush_last_time; =20 static bool memcg_vmstats_needs_flush(struct memcg_vmstats *vmstats) { - return atomic64_read(&vmstats->stats_updates) > + return atomic_read(&vmstats->stats_updates) > MEMCG_CHARGE_BATCH * num_online_cpus(); } =20 @@ -573,7 +573,9 @@ static inline void memcg_rstat_updated(struct mem_cgrou= p *memcg, int val, if (!val) return; =20 - cgroup_rstat_updated(memcg->css.cgroup, cpu); + /* TODO: add to cgroup update tree once it is nmi-safe. */ + if (!in_nmi()) + cgroup_rstat_updated(memcg->css.cgroup, cpu); statc_pcpu =3D memcg->vmstats_percpu; for (; statc_pcpu; statc_pcpu =3D statc->parent_pcpu) { statc =3D this_cpu_ptr(statc_pcpu); @@ -591,7 +593,7 @@ static inline void memcg_rstat_updated(struct mem_cgrou= p *memcg, int val, continue; =20 stats_updates =3D this_cpu_xchg(statc_pcpu->stats_updates, 0); - atomic64_add(stats_updates, &statc->vmstats->stats_updates); + atomic_add(stats_updates, &statc->vmstats->stats_updates); } } =20 @@ -599,7 +601,7 @@ static void __mem_cgroup_flush_stats(struct mem_cgroup = *memcg, bool force) { bool needs_flush =3D memcg_vmstats_needs_flush(memcg->vmstats); =20 - trace_memcg_flush_stats(memcg, atomic64_read(&memcg->vmstats->stats_updat= es), + trace_memcg_flush_stats(memcg, atomic_read(&memcg->vmstats->stats_updates= ), force, needs_flush); =20 if (!force && !needs_flush) @@ -4132,8 +4134,8 @@ static void mem_cgroup_css_rstat_flush(struct cgroup_= subsys_state *css, int cpu) } WRITE_ONCE(statc->stats_updates, 0); /* We are in a per-cpu loop here, only do the atomic write once */ - if (atomic64_read(&memcg->vmstats->stats_updates)) - atomic64_set(&memcg->vmstats->stats_updates, 0); + if (atomic_read(&memcg->vmstats->stats_updates)) + atomic_set(&memcg->vmstats->stats_updates, 0); } =20 static void mem_cgroup_fork(struct task_struct *task) --=20 2.47.1