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 53644C4345F for ; Wed, 1 May 2024 17:26:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A6C386B009E; Wed, 1 May 2024 13:26:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9CB976B009F; Wed, 1 May 2024 13:26:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 81FBC6B00A0; Wed, 1 May 2024 13:26:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 623996B009E for ; Wed, 1 May 2024 13:26:51 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 2CDCAC0B21 for ; Wed, 1 May 2024 17:26:51 +0000 (UTC) X-FDA: 82070507022.14.CD902CE Received: from out-172.mta0.migadu.com (out-172.mta0.migadu.com [91.218.175.172]) by imf23.hostedemail.com (Postfix) with ESMTP id 96959140016 for ; Wed, 1 May 2024 17:26:49 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=trfIiJqg; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf23.hostedemail.com: domain of shakeel.butt@linux.dev designates 91.218.175.172 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=1714584409; 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=GSfZvMT0meM6+Tg2n6OjVJNbS0vHa+pAGl0pke03oZo=; b=qp3JqKPXI8zxFKpEFD5He11k61G6iSSWtfKwP3AnoeGYclYiHzqZpRkwJ/2xNG17ev8mbB BBDx2fLq6fVMVpKYkrcfapIDsaVXWriwSMiC9yMEqxYEY1u3S3JBJujqQ4jdnVNy1ni33z J33MFfHGMOmPiYGvZtHai2Y5zAHfPgE= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=trfIiJqg; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf23.hostedemail.com: domain of shakeel.butt@linux.dev designates 91.218.175.172 as permitted sender) smtp.mailfrom=shakeel.butt@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1714584409; a=rsa-sha256; cv=none; b=Epns8QYxl2FjWLQmvicx1Mr27QDNF7JRlc2OmK/aniCWlznhWcaxVcbFPg5WZPZAdoCnTT qDU0lBOOCs+Qvnp3V4xnmZ+56FBhN2X/rBnjzYfk8gK0HXLmhjnW4Y/8n1w78W5sOgLkWu lQlh0yMl/JUmC0WzRkNtn3pfLXXz9Gg= 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=1714584408; 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=GSfZvMT0meM6+Tg2n6OjVJNbS0vHa+pAGl0pke03oZo=; b=trfIiJqgV4cZZHqhDCNO3VkVT22d/YhoirgzSeIxHk0Kyp4BRRYVdbzVdcRQUlf99KJVIB +sqEruaqw97BM6RkWEWKQYlkT3DaUVJvFUGmcuMT4MflewgGqt6Zg8xgqKU5yk0B6aoJF4 tPo0pBwMJJ1keoewuqZXlJvbt60TGN0= From: Shakeel Butt To: Andrew Morton , Johannes Weiner , Michal Hocko , Roman Gushchin , Muchun Song , Yosry Ahmed , "T . J . Mercier" Cc: kernel-team@meta.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 7/8] memcg: warn for unexpected events and stats Date: Wed, 1 May 2024 10:26:16 -0700 Message-ID: <20240501172617.678560-8-shakeel.butt@linux.dev> In-Reply-To: <20240501172617.678560-1-shakeel.butt@linux.dev> References: <20240501172617.678560-1-shakeel.butt@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Stat-Signature: 5urbcdydf8cxwckbxfk8wckcaxsu3pbd X-Rspamd-Queue-Id: 96959140016 X-Rspam-User: X-Rspamd-Server: rspam12 X-HE-Tag: 1714584409-90533 X-HE-Meta: U2FsdGVkX1+uT8pbw2K5C5pXSH+DVJpmlCwVhgNjAKlRv5sgMo3Iay6EtfCjLLLdNmxjqrqk4Uzz2GzkoybiCSJEoG2NpmCqt1zv2Vp7seBX//+Ufcf6MqBEG1xbAG+LyF4LhoYDDZIHz6Q7wLaDYxgIFIaIe3LcAEI3T9PgZWykMfowLn1y4UNSjcYAAxZ1owTOo2sLyV9awKEvjztiopYznktYjW6V/pZ+UtPVTQU9w1aDvszMRAg2N7vM5Yf3tHkt1fOt1OocsBfeLW3ZeINaibqYhl94mKGngY5jO1zF1vd4wAWfLuTJpsqLtvQvNakNPrdcAdDfezYeVmszx61abjqxM50wN6wuWQKNQA57baLmx7VxhCeGT6Tk1lPZn9E0nsmsSkUCiAv2XiAO82Z+VELkKyQUz7MUy9LJda9tPUYdQKUPp+tJ7mYOSTZlPp0M6sNRA4Nf0BzOzHN/PAK2F3hVfNskTRqpqrTpWOOV78Mrb+8qJuJHCx8CrD/655G/TXXuu3PDoe7rPfD7BX9cdUiBx86e+B2e/QWXxhu+SP6wCjgMjnUezzOiGk2AsuoMyp894VNrvGN2Y0GCUiMCG4+N0CTgWxh8q3kE5cT8jwgEu8QD+tAEGq0ZNdCMQOlkchaK28GxsVMJTgMyra59gBeMLZXI4ucKTD5ZJI7vsEAHzWa2s9y4KCmeszLxrfhZMSV45Gax0or5OpCX/TQCzWQC54UlxyJ2EDbcmewMaUuyTe3UtGHLGfmMyw+li5oMEQOqkZB/9hIt7m/xJjVF6BFWEU2u2AfYCcUgsqg= 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: To reduce memory usage by the memcg events and stats, the kernel uses indirection table and only allocate stats and events which are being used by the memcg code. To make this more robust, let's add warnings where unexpected stats and events indexes are used. Signed-off-by: Shakeel Butt --- Changes since v3: - N/A mm/memcontrol.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a78cf00dd537..b4a1b4bb599d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -671,7 +671,7 @@ unsigned long lruvec_page_state(struct lruvec *lruvec, enum node_stat_item idx) return node_page_state(lruvec_pgdat(lruvec), idx); i = memcg_stats_index(idx); - if (i < 0) + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx)) return 0; pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); @@ -687,14 +687,14 @@ unsigned long lruvec_page_state_local(struct lruvec *lruvec, enum node_stat_item idx) { struct mem_cgroup_per_node *pn; - long x = 0; + long x; int i; if (mem_cgroup_disabled()) return node_page_state(lruvec_pgdat(lruvec), idx); i = memcg_stats_index(idx); - if (i < 0) + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx)) return 0; pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); @@ -923,7 +923,7 @@ unsigned long memcg_page_state(struct mem_cgroup *memcg, int idx) long x; int i = memcg_stats_index(idx); - if (i < 0) + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx)) return 0; x = READ_ONCE(memcg->vmstats->state[i]); @@ -960,7 +960,10 @@ void __mod_memcg_state(struct mem_cgroup *memcg, int idx, int val) { int i = memcg_stats_index(idx); - if (mem_cgroup_disabled() || i < 0) + if (mem_cgroup_disabled()) + return; + + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx)) return; __this_cpu_add(memcg->vmstats_percpu->state[i], val); @@ -973,7 +976,7 @@ static unsigned long memcg_page_state_local(struct mem_cgroup *memcg, int idx) long x; int i = memcg_stats_index(idx); - if (i < 0) + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx)) return 0; x = READ_ONCE(memcg->vmstats->state_local[i]); @@ -992,7 +995,7 @@ static void __mod_memcg_lruvec_state(struct lruvec *lruvec, struct mem_cgroup *memcg; int i = memcg_stats_index(idx); - if (i < 0) + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx)) return; pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); @@ -1106,34 +1109,38 @@ void __mod_lruvec_kmem_state(void *p, enum node_stat_item idx, int val) void __count_memcg_events(struct mem_cgroup *memcg, enum vm_event_item idx, unsigned long count) { - int index = memcg_events_index(idx); + int i = memcg_events_index(idx); - if (mem_cgroup_disabled() || index < 0) + if (mem_cgroup_disabled()) + return; + + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, idx)) return; memcg_stats_lock(); - __this_cpu_add(memcg->vmstats_percpu->events[index], count); + __this_cpu_add(memcg->vmstats_percpu->events[i], count); memcg_rstat_updated(memcg, count); memcg_stats_unlock(); } static unsigned long memcg_events(struct mem_cgroup *memcg, int event) { - int index = memcg_events_index(event); + int i = memcg_events_index(event); - if (index < 0) + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, event)) return 0; - return READ_ONCE(memcg->vmstats->events[index]); + + return READ_ONCE(memcg->vmstats->events[i]); } static unsigned long memcg_events_local(struct mem_cgroup *memcg, int event) { - int index = memcg_events_index(event); + int i = memcg_events_index(event); - if (index < 0) + if (WARN_ONCE(i < 0, "%s: missing stat item %d\n", __func__, event)) return 0; - return READ_ONCE(memcg->vmstats->events_local[index]); + return READ_ONCE(memcg->vmstats->events_local[i]); } static void mem_cgroup_charge_statistics(struct mem_cgroup *memcg, -- 2.43.0