From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (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 CE2F83806DD for ; Thu, 9 Jul 2026 14:51:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783608708; cv=none; b=cZmC6e5rm/rJjnoBxZ5JhO0c1GMxkHzTUL7wox6ZuZRVv52I8Gqygl9nCyea81DiLXhDf4iJtFWU9gXKYxCFobMCHnZ1ugeHB1+/Or91vx0vDb6QngFoYZJ1FSMrcDI5yJPOqIRvECEIn31d/zdJFr8MEsVqGFi+6lWzy68nJfM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783608708; c=relaxed/simple; bh=u8kyhcVVA79XOsTXqJeZWB7vTD/1+9t4Iys7W++lkss=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TpnMXQ6mp5VDHTUHWtREJhAQAItEITwBr0+/UB1YTWadOtpocuEu98qBzFoSreFVp6+s8i4ORNq1gDaNVMv8JxM7L+kGzCIscoYAnHgBKcLPGB4AKLcKlTrZ1YYVhjipPOxOkMrFX41IpYbE4HN/18Apbyn70a1zOvVrJr5teos= 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=XQ/c2JrG; arc=none smtp.client-ip=209.85.214.174 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="XQ/c2JrG" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2cad68425a7so2596025ad.1 for ; Thu, 09 Jul 2026 07:51:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783608706; x=1784213506; 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:content-type; bh=HZxx8R8fiqL7iH7Cr5ccFQZpVZE6wUlCcBNvGW/3Kq4=; b=XQ/c2JrGi3sHEvVCXL9q7bieFBmQYvZtDVTGyqrtZuZbbm9O5X9YHWPmiNFeJ9k1G4 htQI1/EepV7rW30WIeDu86vFP1jA9rinJ83WeoP9G/RPaPWrfaqq4RrOqavaUMtZxR0m SeaZf6iusz+5Qn1Hcvz1luDFV+pjt6dDGFzxXZgon9iBhRmXCrWSTJqa8HzBF7PZUb1L YpRjGKKxqhdVR+VRpRh9oWcr+FXgFOZ5a5euXd0KkfgqA7fXD8HQQvkFOqxJIPsqudiS m17LnCW05Vxe5RtVcPZ+xVSrjTEjj3RNMVpG3UgxVkEFJb7VCyqDkm5t294fzgfRQMY2 V8Gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783608706; x=1784213506; 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:content-type; bh=HZxx8R8fiqL7iH7Cr5ccFQZpVZE6wUlCcBNvGW/3Kq4=; b=LkqLTzovuz8deXOYK8j2rCgw4MNlp2qlSreAfgdg8gxgVDL+GVSMPO/PGzoqLA3SvH dLaDUsqR/AuKduLxqi79w/kTuTyKLqUJWHkPFtFaism/k7muJim29D4xm7sbJxTdeuZV T0Em23qL9zxX1kNQ9uQ7HkKSC3gp8+O7hw9j4CrDm5Ly8RoLOQ1E6C9mNmjfVfSuYcSv zhQwwIOwh9+AXKCOxu6+DRkSNPQiXaRr29ucN+iUdPrxY0ORc5bjEL/SJ06z1tgh7Txl Ia22q/HKCHGQL8bb1WybY5yzcnyuXQ7tc3m+nnQ1RU7vkbD7Kl+/8JQh0uWD7HcRkW5c vU/A== X-Gm-Message-State: AOJu0Yypxi8Iwj5aiJBxEfGv4KjbxtlxFcqMinMgylZ/COn1MwyxMnon NEj7fZj1c1p8SN4+0kdjAiOU8ToPErELb3gZL+TW3ibB5kYQrLkS2vN9 X-Gm-Gg: AfdE7cmFVTcNtlPk24qMPTjJ//1QMVhy0SfnbFJF5lAGA8ZO8NHlaoUtgagh9J27Zwv 6naeBd+1VUqiF/SGU1//Gf7c69z0n4kLSNjIqEjhnRehSOwjL54Ch+uF7LIawxqb7YHoyGCPuat QORdXTSjqhKI9t9pYXAmZojT5NQExPmpuEHWQWT56fGd/DweQWKLaW2YOj2dw/1rTeadth68/0J fIPwlPDIgLvIIndCLWaFUjhBJsaDAaCUICB+j7Po/kCYqkwJlPkJINTFJOID3F5cXqRh8JRQ7nh SGjUwR88EsjadaA1JdIyxwcTAcF2ZwULrSvXyMSoy+wQX8g/5OlGIJvWxfkg7ehtlj8S3FuNXQI POxWafAIAd/E6zYCMeZk52OZo/BvR/3pYiox+PuRqxb5wgBK/Qlx8jtia/WojltDF/GrGcFurrp P7Eh25j84iPZPO3JcKWyKzy3LAJbeSCycC7EZhqljQaev3sKOpFCDK2oY+5aRLnxl00BYIlnBk/ LGowQtigBKZzkn3XQ== X-Received: by 2002:a17:90b:58c6:b0:36d:b30b:14ed with SMTP id 98e67ed59e1d1-38a1f1de22amr3604367a91.2.1783608705954; Thu, 09 Jul 2026 07:51:45 -0700 (PDT) Received: from debian.lan ([240e:391:ea3:6910:38e7:894b:82e3:a58b]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38a57dc5820sm1286917a91.10.2026.07.09.07.51.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2026 07:51:45 -0700 (PDT) From: Xueyuan Chen To: Andrew Morton , linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, Barry Song , Nanzhe Zhao , Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Youngjun Park , David Hildenbrand , Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Qi Zheng , Axel Rasmussen , Yuanchu Xie , Wei Xu , Xueyuan Chen Subject: [RFC PATCH v2 1/3] mm: add page_counter_margin() Date: Thu, 9 Jul 2026 22:51:22 +0800 Message-ID: <20260709145124.764807-2-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260709145124.764807-1-xueyuan.chen21@gmail.com> References: <20260709145124.764807-1-xueyuan.chen21@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 Add a helper to report the minimum remaining chargeable space from a page counter up to the root of its hierarchy. This makes the hierarchical margin calculation reusable by callers that need to know whether a smaller charge could still fit after a larger charge failed. Suggested-by: Johannes Weiner Signed-off-by: Xueyuan Chen --- include/linux/page_counter.h | 1 + mm/page_counter.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/linux/page_counter.h b/include/linux/page_counter.h index d649b6bbbc87..07b7cb12249c 100644 --- a/include/linux/page_counter.h +++ b/include/linux/page_counter.h @@ -68,6 +68,7 @@ static inline unsigned long page_counter_read(struct page_counter *counter) return atomic_long_read(&counter->usage); } +long page_counter_margin(struct page_counter *counter); void page_counter_cancel(struct page_counter *counter, unsigned long nr_pages); void page_counter_charge(struct page_counter *counter, unsigned long nr_pages); bool page_counter_try_charge(struct page_counter *counter, diff --git a/mm/page_counter.c b/mm/page_counter.c index 661e0f2a5127..6e55c7628025 100644 --- a/mm/page_counter.c +++ b/mm/page_counter.c @@ -171,6 +171,26 @@ bool page_counter_try_charge(struct page_counter *counter, return false; } +/** + * page_counter_margin - remaining chargeable pages within hierarchical limits + * @counter: counter + * + * Returns the smallest remaining margin between @counter and the root. + */ +long page_counter_margin(struct page_counter *counter) +{ + long margin = PAGE_COUNTER_MAX; + + for (; counter; counter = counter->parent) { + long limit = READ_ONCE(counter->max); + long usage = page_counter_read(counter); + + margin = min(margin, limit - usage); + } + + return margin; +} + /** * page_counter_uncharge - hierarchically uncharge pages * @counter: counter -- 2.47.3