From patchwork Thu Mar 6 02:31:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Muchun Song X-Patchwork-Id: 14003766 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 F418EC19F32 for ; Thu, 6 Mar 2025 02:31:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 28E90280006; Wed, 5 Mar 2025 21:31:56 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 218F5280002; Wed, 5 Mar 2025 21:31:56 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 092C7280006; Wed, 5 Mar 2025 21:31:56 -0500 (EST) 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 DD46B280002 for ; Wed, 5 Mar 2025 21:31:55 -0500 (EST) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id E9626120EAE for ; Thu, 6 Mar 2025 02:31:57 +0000 (UTC) X-FDA: 83189551074.05.7D22E2E Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) by imf21.hostedemail.com (Postfix) with ESMTP id 05E451C0012 for ; Thu, 6 Mar 2025 02:31:54 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=STTU8KXX; spf=pass (imf21.hostedemail.com: domain of songmuchun@bytedance.com designates 209.85.214.177 as permitted sender) smtp.mailfrom=songmuchun@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741228315; 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:references:dkim-signature; bh=iO6wA6XWmxnHhVJNEGwMRLVJm1A8Q49xyow/a4mczm0=; b=JRWF8KeVzbTBs96NKd+NP4eVvy3ffnyPhOtGMQdNAA5RTH7K+tV3FDZaGq29jwz9lCgPPX RCxhNP5QNeGX7dimudK2XhzcNpSxz0xXn9irJOSO4YsJ0lAxulGQHRjqycZM+fZVW64MyK JVt+dHx2TjlMZN4gLU3IdZzBat40ejU= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=STTU8KXX; spf=pass (imf21.hostedemail.com: domain of songmuchun@bytedance.com designates 209.85.214.177 as permitted sender) smtp.mailfrom=songmuchun@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741228315; a=rsa-sha256; cv=none; b=k0v2K/EFTFlpphpBtkYcjy2H/qdcPFAPrHHlYt96KzpHTt66ZJz5v3vWoFpFvrmk2fpWEC k73HAV8PW9w+JFee//IWwLtBmsEf/j5DT0hG6onXBVZ0iVLO0+G3wMyq6FhbI8nqKRvIFw R1MWVt5XJgaoMCxWiT1+uXwBtl/01dw= Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-22356471820so1775565ad.0 for ; Wed, 05 Mar 2025 18:31:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1741228313; x=1741833113; darn=kvack.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=iO6wA6XWmxnHhVJNEGwMRLVJm1A8Q49xyow/a4mczm0=; b=STTU8KXXjlPARVOcdGu9hzLhcPrOLVbBFM9O5bMLG5qkGsZ566CIPKS6RIliWhc2vc /j7N3iOZc38kHg3QzZyHfo9xEerNoeg4msnYdWdlDF4ZvIkIXedCXh5KH/gp1OSnJa6D nzdnWLGeyWrT2oCNzRHwncgE/O86Ua0wRiCzAuoJyYslhl3stPnDZ7leOaXwx4EqzWRQ 4RVT7kFqTkWd8+iShLV74CjHDuFX8yqSqEXJ3UIXAwP34hCWnCadxuOJyH0QfNTCSr81 S0aPHp2LniQud9Up9t72v/HV3ZPru+2gnEDN7KrAFWOoZHYXh4cX3Msopv1LJ5NF/JDt 8m9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741228313; x=1741833113; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=iO6wA6XWmxnHhVJNEGwMRLVJm1A8Q49xyow/a4mczm0=; b=mcs/FR817BSsxp+23qBXS8lqIQkM0jqjDI0+fZcoPvzNCvz5vc6H9+hmpupG/No9iS P1b9dqxbzYVkF6UTVAMXl9k1mFBXEK/dZuFMLF/hFq70d188jDUSEE9svGjP5nm3kuad FB+m7aa2c2cDtar9BSKsby6nurLdQdJA/Me4Ui0H2xpx391hqvjzrTKWO2LHSeDUj93Z 4JBktQfu8C+mYP9IG5GWdlZ1kNluhL0JOyaRetgP45p8ZDnJCJsjWHniBKe5xUGUVaq8 zzXWV2XShwVs6gjQBDimF/31f+cnG/Vg6N+LPDf4Lo/7Ov2ldhitZs8GRc2uAKrO9QYB iQ3g== X-Forwarded-Encrypted: i=1; AJvYcCWW6bII9nW0+va4CmhxIHACRprY5+eA/31usgxx5GfOz/yCIdl4yMDileVN68y9jmOkQMDReC1Shg==@kvack.org X-Gm-Message-State: AOJu0YxFw458ufx+nxC1CgrYmS4mTcLyYISiEEmw12gTyReD4wCUnHfH 95HwfWCbQgHxBoBInZGVf4zzDsAeQYLYI6807wbaHChe9OoT7VQ4tLgQsCcvQx0= X-Gm-Gg: ASbGncvoVhFWjkYj8ENIkVGAj/SKPYg5gblI/guaqZSLE2GyK0yc6b74P/aI7f9xaKj VNs8RWVNzmRneApFQvx2yTcKFSiV4AXTGio/iWRQk7NPHnfJgSYmTJcWESKeTDyb5LV8Bn6GIWW EjB9C4h26bOHkgdA0IBZgncoOXEjJFrYUhKdP3VOovv5UufkbaowDCa3WD1IiGUKaHZpJ4mkktF KfNjaERTtvjZmZaKDrX6wd6jurpyYb2RW8iD0ssSrpQggVXOfsMJuQO1uPnfa1tHIHBDJwAst0S whqfEPzPDlBLK6a3uBY0Jz9OHv030HETbKoKotxfl3gjxx6c13+utoRFI+v8VDlh9hIiY0H5EiB 4DG+N X-Google-Smtp-Source: AGHT+IFwn29sDeYBmdp4CEswbdIWIO0mgSzC0Fu02o+1MLOPwdvWyiKyshtyKjhFx5G7dBzbMS/5rQ== X-Received: by 2002:a17:902:f683:b0:223:5c77:7ef1 with SMTP id d9443c01a7336-223f1c982c4mr86775385ad.21.1741228313590; Wed, 05 Mar 2025 18:31:53 -0800 (PST) Received: from PXLDJ45XCM.bytedance.net ([139.177.225.250]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-224109ddcaesm1318185ad.28.2025.03.05.18.31.48 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 05 Mar 2025 18:31:52 -0800 (PST) From: Muchun Song To: hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, akpm@linux-foundation.org, kasong@tencent.com, chrisl@kernel.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org, Muchun Song , stable@vger.kernel.org Subject: [PATCH] mm: memcontrol: fix swap counter leak from offline cgroup Date: Thu, 6 Mar 2025 10:31:33 +0800 Message-Id: <20250306023133.44838-1-songmuchun@bytedance.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 05E451C0012 X-Rspamd-Server: rspam09 X-Stat-Signature: 5w8y6m886n9wnxzh174dkyjfi8ff431j X-HE-Tag: 1741228314-615023 X-HE-Meta: U2FsdGVkX19/pNch0HEdcyx6XWuSHCIyy63Nvq3rpRE0yB3t4CA7LZkBhhfoKUZ3wZg6V0wkv+XXFF8MbczZnzvYw5ov7BpgBtjEIziVwVVIx+1QrFCvcUOg4kFqNIxfBKE76jrNwnqOL21TZ9Lo+ppkdsD0Hurk4LxVlat4nNoRzsDoUkVuWrTictvJ5H3ubB5DcnzCPzXCWQaiY5hZOmljqHKsQF9OyYYU7DDlVwXGHnNjo+NI8x5rqAAXJ2uxtfcSYStWfcJ4btNYdsIINTj3a5QEWal45gU8pmmOVRZ5FVt3Qe6Fv8R2UEZawNhdWyhCzR49PF1FnOsxgVJ3Wwlg5gnCyGp32qYnnCbmmQPlNwDc4AeHtrA4YQ6R5t22GfUO5iTuWOeTX3kyOrTNs9ReFe5YxrcPzyNLc1YqvPGPh7NUqiErRPKZyfxpXpdnJqh7JevQDgrQBWHwW9+wVnBcsr1wFZA5rMfs0uFasxumIrvl160Zitp4YWZS9ffVs9EteuDRDICATHR7Jv88Cq6PYzj8SfW1lg+NHlxoREV2SaKLecTKPVuYQqFLekyLJlWnwJWL+eVxzuEh8GfAoIWGSLpksn4SdiH+CZapInG5jjb9LwSO4WVAc8s2cIMmrX62+nkOSNU8CS/FFpdcqBqtfDjVWjyy6igf6ffAse2+JdZsdDqsNsaTG4CQGPhxqV1O/aEqXVxRtI+0c3M3+ruva3UVKnj5dT2Zi8juXrAces3jjbGxxDO2/kI+3ufRdQDxZTv025U8V3+K8+bpkRZhFCTE6L7MsvXAvXcwzxOJmtAK/DT9MVRV09RVPIaDudnGjoyG9FGuKXDO3JDU1xFRhWf1u/xAyq9uZEmqP17UNpRXjiWbDny71/jM1KUdgPwxUOoDb1LKafZSMCAzAkfTj5i/feDfhaSfbMYkSTpfWPHCa5OWhEWOTzOX4UXCHeEnI3HT5rcAVU99Cni PbxHk5lx 6Tn94JKNOC4J0Hbu+OKWhL11G9g2+TGp2K4o769xS/FJz65nvh85Z4a8Yd/teS4VNg1e1q9f4BwVsFNe6OxoYZjbksbKM7mDKHjdEtbBBnYDmPHUK05oXdQb/l1LGk+aTOqKwubfB27scphUKdfXP2xGHu7Ju2bSejTBc8v8zgTcGdnQ+/k0pGQ4vSrqesEQ0LsbTN+6o6N3HAbN4EnR3NOu0N+lvCeJ+sNsk0Y7jr9neQLREWqc7M70UWrh+Am18cBST5wjhdKmA5iT3rK8ES/e1jUtdmjORQ1wTMBeND4XL1fwL3CeOj2rRVC//awaUdktLGScLmJK/nVQ= 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: The commit 6769183166b3 has removed the parameter of id from swap_cgroup_record() and get the memcg id from mem_cgroup_id(folio_memcg(folio)). However, the caller of it may update a different memcg's counter instead of folio_memcg(folio). E.g. in the caller of mem_cgroup_swapout(), @swap_memcg could be different with @memcg and update the counter of @swap_memcg, but swap_cgroup_record() records the wrong memcg's ID. When it is uncharged from __mem_cgroup_uncharge_swap(), the swap counter will leak since the wrong recorded ID. Fix it by bring the parameter of id back. Fixes: 6769183166b3 ("mm/swap_cgroup: decouple swap cgroup recording and clearing") Cc: Signed-off-by: Muchun Song Reviewed-by: Kairui Song Acked-by: Johannes Weiner Signed-off-by: Johannes Weiner Reviewed-by: Muchun Song --- include/linux/swap_cgroup.h | 4 ++-- mm/memcontrol.c | 4 ++-- mm/swap_cgroup.c | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/include/linux/swap_cgroup.h b/include/linux/swap_cgroup.h index b5ec038069dab..91cdf12190a03 100644 --- a/include/linux/swap_cgroup.h +++ b/include/linux/swap_cgroup.h @@ -6,7 +6,7 @@ #if defined(CONFIG_MEMCG) && defined(CONFIG_SWAP) -extern void swap_cgroup_record(struct folio *folio, swp_entry_t ent); +extern void swap_cgroup_record(struct folio *folio, unsigned short id, swp_entry_t ent); extern unsigned short swap_cgroup_clear(swp_entry_t ent, unsigned int nr_ents); extern unsigned short lookup_swap_cgroup_id(swp_entry_t ent); extern int swap_cgroup_swapon(int type, unsigned long max_pages); @@ -15,7 +15,7 @@ extern void swap_cgroup_swapoff(int type); #else static inline -void swap_cgroup_record(struct folio *folio, swp_entry_t ent) +void swap_cgroup_record(struct folio *folio, unsigned short id, swp_entry_t ent) { } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a5d870fbb4321..a5ab603806fbb 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4988,7 +4988,7 @@ void mem_cgroup_swapout(struct folio *folio, swp_entry_t entry) mem_cgroup_id_get_many(swap_memcg, nr_entries - 1); mod_memcg_state(swap_memcg, MEMCG_SWAP, nr_entries); - swap_cgroup_record(folio, entry); + swap_cgroup_record(folio, mem_cgroup_id(swap_memcg), entry); folio_unqueue_deferred_split(folio); folio->memcg_data = 0; @@ -5050,7 +5050,7 @@ int __mem_cgroup_try_charge_swap(struct folio *folio, swp_entry_t entry) mem_cgroup_id_get_many(memcg, nr_pages - 1); mod_memcg_state(memcg, MEMCG_SWAP, nr_pages); - swap_cgroup_record(folio, entry); + swap_cgroup_record(folio, mem_cgroup_id(memcg), entry); return 0; } diff --git a/mm/swap_cgroup.c b/mm/swap_cgroup.c index be39078f255be..1007c30f12e2c 100644 --- a/mm/swap_cgroup.c +++ b/mm/swap_cgroup.c @@ -58,9 +58,11 @@ static unsigned short __swap_cgroup_id_xchg(struct swap_cgroup *map, * entries must not have been charged * * @folio: the folio that the swap entry belongs to + * @id: mem_cgroup ID to be recorded * @ent: the first swap entry to be recorded */ -void swap_cgroup_record(struct folio *folio, swp_entry_t ent) +void swap_cgroup_record(struct folio *folio, unsigned short id, + swp_entry_t ent) { unsigned int nr_ents = folio_nr_pages(folio); struct swap_cgroup *map; @@ -72,8 +74,7 @@ void swap_cgroup_record(struct folio *folio, swp_entry_t ent) map = swap_cgroup_ctrl[swp_type(ent)].map; do { - old = __swap_cgroup_id_xchg(map, offset, - mem_cgroup_id(folio_memcg(folio))); + old = __swap_cgroup_id_xchg(map, offset, id); VM_BUG_ON(old); } while (++offset != end); }