From nobody Thu Apr 2 19:17:22 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 B460E20298C for ; Thu, 12 Feb 2026 00:37:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770856655; cv=none; b=Bpm7NVab8pvmvHGP9+1Jri8qcrl3D31lEOGLrXEHqxJB/rmtoSUu5FxDjRqNxOonNISsw1xR3uSScZSENibT/T8VrYrUL747jvlIyhdajD1opYuImrgc3MtZAAbsxjJ7meo+FwcUnmaF8NdR6k7n0I2Be1S5wIRB05UlvlNv/RA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770856655; c=relaxed/simple; bh=kKS15axEk0LsRuKNrmNoFDsiye0vhaIHHxcdpf45fME=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NUFnMxcfbk5YZKACcc442RyJUM+ZKEkR4hcIXuYq+d64DaNg0xvoyuxDTMICbSQyGMymQqyq5kZlW/OS5gH7Lfe8UEiehpjLJ6zyATMAJDDPt/YAD4iEajL0r0+yvfpPYrEOQq7vLfHYCaGwuMQ01NHuXB85T7q1G9v7w0YSe4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=BoQsVpqB; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="BoQsVpqB" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2a13cd9a784so58179465ad.2 for ; Wed, 11 Feb 2026 16:37:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1770856654; x=1771461454; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Pe2F5DK4zZDtXkI/xhYQlRYGmZxVF2QOYK8cN8BDaKU=; b=BoQsVpqBtetDc2ujO21ye/Cdy2gQmK3Xi63AXlvOiTTQazLjjWA6ZRQ7MfRCq68jhX p9hS20ja/67qa62rmx0oV3riclxWmZrN7/wSxwqRM2LTWe+n5I0DQsqs+elzIozHWIQH pzQ75osmzL+T1DUCmZv1sfCppcc9vsTnF4s+YZh+tkKZ/gt6JUUvGbCaJRmN5oAVMN68 YW/Q6KaNd/23FaTjcFuPOVPdHaJs0pnbmyAL1Ft+K3a93iT41bhsNqNMn4wxyY4e+fMl u6QmVfYvuWv2apqGNP9aL+mfDiDBhIG3Z1kKK2Q32L3J9Z6+oig7F/c68lb/vqs70dp3 pmOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770856654; x=1771461454; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Pe2F5DK4zZDtXkI/xhYQlRYGmZxVF2QOYK8cN8BDaKU=; b=FuxbWot5AN5A6iKwvUFEXgi6I3tKxChlLMOJqcWUjOS/jK9paz5Ap/ZTU6EQFIa6Ic LAcEaAamHhSr0gDBDNZgP15Wqs4Ja/BytNtorkRk+ofcS20sgMeVM+h4vLjcRqwPNVvc lbDELh/MvR47Q/n8Nm++ptU2o44ZDm66CmbO4jOKQNJKYyUydH3WSFxHbJBUxPRKSYH0 dD4vwFu59viZ6PCZB9Fs10vfpO5NZSskaikQpFdBF2PKCrCOabSmPId/AYGqirowf1Uf 1OHl83MxXVhcrajTF31OgVllBkMc/smMOun4nneK51lCAHdNHAFiDv2kCmRvVp1EwOkW 1xvg== X-Forwarded-Encrypted: i=1; AJvYcCUeX+F/xcE+a1fGO6cJ0FAAxTC7C/dDJFQsj8kAccnouU7OM1C0zAt68qhBKWC+k8tfbQ70mO8LrDnXDCQ=@vger.kernel.org X-Gm-Message-State: AOJu0YygQ8B8Ltcak5fzf6FVt1iL82LEhDaxOBwj1BUv+0NEx5nWOdzD PuttRx8gUS2cw5LIIoq5N/Ctc6vDzHyNcd2UwMNxwukA3LmCUn97lszKO4t+5USj+aTLarvdBm8 YNTQ6LTx7P9ReyiXLj8bLWPHDnA== X-Received: from pllo10.prod.google.com ([2002:a17:902:778a:b0:2a7:80ac:dd82]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:17cd:b0:2a0:8e35:969d with SMTP id d9443c01a7336-2ab39b16ed4mr9131845ad.39.1770856654111; Wed, 11 Feb 2026 16:37:34 -0800 (PST) Date: Wed, 11 Feb 2026 16:37:16 -0800 In-Reply-To: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.53.0.310.g728cabbaf7-goog Message-ID: <28d1cd5b7b9a628d6ca6550b8fcafe887190a9e6.1770854662.git.ackerleytng@google.com> Subject: [RFC PATCH v1 5/7] mm: hugetlb: Adopt memcg try-commit-cancel protocol From: Ackerley Tng To: akpm@linux-foundation.org, dan.j.williams@intel.com, david@kernel.org, fvdl@google.com, hannes@cmpxchg.org, jgg@nvidia.com, jiaqiyan@google.com, jthoughton@google.com, kalyazin@amazon.com, mhocko@kernel.org, michael.roth@amd.com, muchun.song@linux.dev, osalvador@suse.de, pasha.tatashin@soleen.com, pbonzini@redhat.com, peterx@redhat.com, pratyush@kernel.org, rick.p.edgecombe@intel.com, rientjes@google.com, roman.gushchin@linux.dev, seanjc@google.com, shakeel.butt@linux.dev, shivankg@amd.com, vannapurve@google.com, yan.y.zhao@intel.com Cc: ackerleytng@google.com, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor alloc_hugetlb_folio() to use the memcg try-commit-cancel protocol. Do this to allow the core of allocating a hugetlb folio and associated memcg charging to be refactored out in a later patch. In addition, checking cgroup memory limits before allocating avoids unnecessary allocation if the limits had already been hit. Update error code propagation in the failure paths so that existing error cases still return -ENOSPC, but if the memory limit is reached, return -ENOMEM as before. Signed-off-by: Ackerley Tng --- mm/hugetlb.c | 53 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 74b5136fdeb54..70e91edc47dc1 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -2881,6 +2881,8 @@ struct folio *alloc_hugetlb_folio(struct vm_area_stru= ct *vma, int ret, idx; struct hugetlb_cgroup *h_cg =3D NULL; gfp_t gfp =3D htlb_alloc_mask(h); + bool memory_charged =3D false; + struct mem_cgroup *memcg; struct mempolicy *mpol; nodemask_t *nodemask; int nid; @@ -2917,8 +2919,10 @@ struct folio *alloc_hugetlb_folio(struct vm_area_str= uct *vma, */ if (map_chg) { gbl_chg =3D hugepage_subpool_get_pages(spool, 1); - if (gbl_chg < 0) + if (gbl_chg < 0) { + ret =3D -ENOSPC; goto out_end_reservation; + } } else { /* * If we have the vma reservation ready, no need for extra @@ -2934,13 +2938,25 @@ struct folio *alloc_hugetlb_folio(struct vm_area_st= ruct *vma, if (map_chg) { ret =3D hugetlb_cgroup_charge_cgroup_rsvd( idx, pages_per_huge_page(h), &h_cg); - if (ret) + if (ret) { + ret =3D -ENOSPC; goto out_subpool_put; + } } =20 ret =3D hugetlb_cgroup_charge_cgroup(idx, pages_per_huge_page(h), &h_cg); - if (ret) + if (ret) { + ret =3D -ENOSPC; goto out_uncharge_cgroup_reservation; + } + + memcg =3D get_mem_cgroup_from_current(); + ret =3D mem_cgroup_hugetlb_try_charge(memcg, gfp | __GFP_RETRY_MAYFAIL, + pages_per_huge_page(h)); + if (ret =3D=3D -ENOMEM) + goto out_put_memcg; + + memory_charged =3D !ret; =20 spin_lock_irq(&hugetlb_lock); =20 @@ -2961,7 +2977,8 @@ struct folio *alloc_hugetlb_folio(struct vm_area_stru= ct *vma, folio =3D alloc_buddy_hugetlb_folio_with_mpol(h, mpol, nid, nodemask); if (!folio) { mpol_cond_put(mpol); - goto out_uncharge_cgroup; + ret =3D -ENOSPC; + goto out_uncharge_memory; } spin_lock_irq(&hugetlb_lock); list_add(&folio->lru, &h->hugepage_activelist); @@ -2991,6 +3008,12 @@ struct folio *alloc_hugetlb_folio(struct vm_area_str= uct *vma, =20 spin_unlock_irq(&hugetlb_lock); =20 + lruvec_stat_mod_folio(folio, NR_HUGETLB, pages_per_huge_page(h)); + + if (memory_charged) + mem_cgroup_commit_charge(folio, memcg); + mem_cgroup_put(memcg); + hugetlb_set_folio_subpool(folio, spool); =20 if (map_chg !=3D MAP_CHG_ENFORCED) { @@ -3021,22 +3044,14 @@ struct folio *alloc_hugetlb_folio(struct vm_area_st= ruct *vma, } } =20 - ret =3D mem_cgroup_charge_hugetlb(folio, gfp | __GFP_RETRY_MAYFAIL); - /* - * Unconditionally increment NR_HUGETLB here. If it turns out that - * mem_cgroup_charge_hugetlb failed, then immediately free the page and - * decrement NR_HUGETLB. - */ - lruvec_stat_mod_folio(folio, NR_HUGETLB, pages_per_huge_page(h)); - - if (ret =3D=3D -ENOMEM) { - free_huge_folio(folio); - return ERR_PTR(-ENOMEM); - } - return folio; =20 -out_uncharge_cgroup: +out_uncharge_memory: + if (memory_charged) + mem_cgroup_cancel_charge(memcg, pages_per_huge_page(h)); +out_put_memcg: + mem_cgroup_put(memcg); + hugetlb_cgroup_uncharge_cgroup(idx, pages_per_huge_page(h), h_cg); out_uncharge_cgroup_reservation: if (map_chg) @@ -3056,7 +3071,7 @@ struct folio *alloc_hugetlb_folio(struct vm_area_stru= ct *vma, out_end_reservation: if (map_chg !=3D MAP_CHG_ENFORCED) vma_end_reservation(h, vma, addr); - return ERR_PTR(-ENOSPC); + return ERR_PTR(ret); } =20 static __init void *alloc_bootmem(struct hstate *h, int nid, bool node_exa= ct) --=20 2.53.0.310.g728cabbaf7-goog