From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ot1-f44.google.com (mail-ot1-f44.google.com [209.85.210.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 341F23A9D89 for ; Fri, 10 Apr 2026 21:07:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775855271; cv=none; b=GcUAC8inj7X9KQ5X65r8mbFqYHXGfhM6mgWv/G2hyNug99iiNVfGjSRCOzEKJvkesyfvBKHHi8eYuIpluwt09Nu7dudvSu+6N5ZQNcJoEEWjLHHzxWN8E2caoNYnksd40XUc6D4eDrVPWMFjDIdPQ6pG5i0SfMJRyGohisZPWAI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775855271; c=relaxed/simple; bh=CVQ20RllDi00A02ezby1KNQZkIpJboxutLoOO03cGmU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q9GkwGOKQoPh2J5cW9rtOxD1osVNlVFHhgB/egWIlhK4eJZrC5Q7bXeJbP7rwP4CL5EFFwmktmz8uSocAn2HjEPdevK8UFxxQ9FPsCe2d+UIGg0nT6Mbdf5JlJPtz2pZJSozEYMgU4DFvo+6pgQ3nb+f2Gm5Wubrz9H6LYVH3r0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Wu2WG49k; arc=none smtp.client-ip=209.85.210.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Wu2WG49k" Received: by mail-ot1-f44.google.com with SMTP id 46e09a7af769-7d86eb7c854so1287982a34.3 for ; Fri, 10 Apr 2026 14:07:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775855269; x=1776460069; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZqJC8Gmg2c8f/XCk9+e6dccXNeaFU07UyyA9/we+nYU=; b=Wu2WG49ktKAmJXvTovsACGm3LDfDYHFhdEwe8Fsc/lVmBZy1Ylbb2yPhDrMovubJwn YmXzek3EOMAScdzdCwffzxSHjbwOkhI1RqCseKOc7ZAYmXoNMhLi2wZ/poeVgyQ0znQi tR4HA8uvfu+69lJinKjRHL/n7cZ/Wlb0hba/EJ/pruegfSzA8ekLJV0iJJAPgzG+fH3N vmlgQBw3GNhYKjJRvwENAyCZMZYWesJiPO5esJ4vAOL/h1a3GiM+LGwlSi3bD0708+fx iCjQJBqjVM/GLNDM0zinsom10FZoWzcXNszR2sTYMJQxORDHBOG7BF2lu1ulAjJ5E9cM vpkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775855269; x=1776460069; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZqJC8Gmg2c8f/XCk9+e6dccXNeaFU07UyyA9/we+nYU=; b=ro+z68OzEtUNyIyWE3IVoR6s9LaENAi+LsR6Kb+QlAyrlSddaoUjtXnglGrEXwi8m8 Otuw4LgHxnpOwPrs84USp69yVNzC8uLlKUuh81Hr/E/st0tjHxakRsGDilARQHMCvKTN w1r83OSXgpBbGq7ykDpFHdV2QxEElxDsw/mKlGHL6digi3R9g9EFFEYaog/XXFHRE+tN wkbRqIZj+d+EOqRTQeVYNPyahwV09h8iF01ZZhjxrrpGKxRxKn3lrQdmAP6qijOIzbpY 1zc811AaGQ2GyvcBbtWcCXQr69VhITDARZdpNgrqvsYDklyjdwZEg464/p5eugjL6Lrn Ub6A== X-Forwarded-Encrypted: i=1; AJvYcCWuDDuvLZdDyg1ua+6HlslXL4aBsAwiReNJnObnYzM2nxj2280rLsXsd7g9/C7QfyP2ngl5NptM23QA3Vs=@vger.kernel.org X-Gm-Message-State: AOJu0YzlsDhhbflzlONWwDa7auL8aqtNPLLWLY8+L4E/svPm1caOLG7f 9Y3etkZzB8TOjazHwrDJqyvzcqdw9Ox4h5oR9/c56vsL7LTbtZ5UblIR X-Gm-Gg: AeBDiev/FEAUnrv2gwXtKzi0bXjIJVMZVY6Jrf/NE1AM9JyKUt0MGoAxbBZY5XqREUZ rrSXRQ+pudxxWE7e2hkx0YVfQjHLDnXiSmP2ya3rDQ3Adg8YkdvKZEHGhJ0EfP4qYqeWaP5ANG3 PA8dePFnpu1LhUcfHA1HKUB1CggshQflQJQ32dGVBhRRvtl6sXRA2KF91ZWuoo2CeKpZBRFfIG9 wrm7vvwm+Ik5bt0ah3minmHlWFd/B2xSL7TFav/6VpEPhEkm5gNZDViopkLUxRdvgztUX3WfYlk DSH2jiV3MMfgqBfGqhhn3VaO4W8JoXF4pNW77t5MRvbybZT3gZWXCGXJhXTFIJ0OT0nVb7mj6ii mzaHwUeWq1GqilpZHuBbaCxqokQ61QfZ3OhpulKC+51aNuwgDNTRaPPlyXyvBN3vV0Yrj6ZEeGD 7c13LJ5KG1P9xAu1GbsoKizQ== X-Received: by 2002:a05:6830:3747:b0:7dc:18e:b5b2 with SMTP id 46e09a7af769-7dc27cb91acmr3191143a34.9.1775855269238; Fri, 10 Apr 2026 14:07:49 -0700 (PDT) Received: from localhost ([2a03:2880:10ff:56::]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7dc269402b9sm2561044a34.20.2026.04.10.14.07.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Apr 2026 14:07:48 -0700 (PDT) From: Joshua Hahn To: Johannes Weiner Cc: Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH 3/8 RFC] mm/page_counter: use page_counter_stock in page_counter_uncharge Date: Fri, 10 Apr 2026 14:06:57 -0700 Message-ID: <20260410210742.550489-4-joshua.hahnjy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260410210742.550489-1-joshua.hahnjy@gmail.com> References: <20260410210742.550489-1-joshua.hahnjy@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Make page_counter_uncharge() stock-aware. We preserve the same semantics as the existing stock handling logic in try_charge_memcg: 1. Instead of immediately walking the page_counter hierarchy, see if depositing the charge to the stock puts it over the batch limit. If not, deposit the charge and return immediately. 2. If we put the stock over the batch limit, walk up the page_counter hierarchy and uncharge the excess. Extract the repeated work of hierarchically cancelling page_counter charges into a helper function as well. As of this patch, the page_counter_stock is unused, as it has not been enabled on any memcg yet. No functional changes intended. Suggested-by: Johannes Weiner Signed-off-by: Joshua Hahn --- mm/page_counter.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/mm/page_counter.c b/mm/page_counter.c index 7a921872079b8..7be214034bfad 100644 --- a/mm/page_counter.c +++ b/mm/page_counter.c @@ -207,6 +207,15 @@ bool page_counter_try_charge(struct page_counter *counter, return false; } +static void page_counter_cancel_hierarchy(struct page_counter *counter, + unsigned long nr_pages) +{ + struct page_counter *c; + + for (c = counter; c; c = c->parent) + page_counter_cancel(c, nr_pages); +} + /** * page_counter_uncharge - hierarchically uncharge pages * @counter: counter @@ -214,10 +223,23 @@ bool page_counter_try_charge(struct page_counter *counter, */ void page_counter_uncharge(struct page_counter *counter, unsigned long nr_pages) { - struct page_counter *c; + unsigned long charge = nr_pages; - for (c = counter; c; c = c->parent) - page_counter_cancel(c, nr_pages); + if (counter->stock && local_trylock(&counter->stock->lock)) { + struct page_counter_stock *stock = this_cpu_ptr(counter->stock); + + stock->nr_pages += nr_pages; + if (stock->nr_pages > counter->batch) { + charge = stock->nr_pages - counter->batch; + stock->nr_pages = counter->batch; + local_unlock(&counter->stock->lock); + } else { + local_unlock(&counter->stock->lock); + return; + } + } + + page_counter_cancel_hierarchy(counter, charge); } /** @@ -364,12 +386,8 @@ void page_counter_disable_stock(struct page_counter *counter) stock_to_drain += stock->nr_pages; } - if (stock_to_drain) { - struct page_counter *c; - - for (c = counter; c; c = c->parent) - page_counter_cancel(c, stock_to_drain); - } + if (stock_to_drain) + page_counter_cancel_hierarchy(counter, stock_to_drain); /* This prevents future charges from trying to deposit pages */ counter->batch = 0; -- 2.52.0