From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 A53852D662F for ; Tue, 28 Apr 2026 03:07:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777345641; cv=none; b=UeR4rKglNTrSBIdLe0z7Gtelz4DKbXjPLAZpj44tQLPT35A7N5/fCfPtpveT0p0YnMDOJZdwdkCEOOjRj8FshtsRLg0pP38AJvvTMPX8jkhLg28th0y+N1OggrkU1f5cVhz7HzDt4Up0KPAMIkUE+c6LlJehMeCkNneAHHlDmlc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777345641; c=relaxed/simple; bh=xZWazzWlXku0HQ4SF9iHPxDs+4v2JEr8pFFDP4PFtYc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZHcjtiRpJ75B4BzJ9L8n1lOIOy3u14vn/6/RIsfAPbn+mhmWRCYBPTglGOVaWwjQvUh+UVEMb+1P/jpcxPVtumLdhgnmsK9XW7dQkH32WIkHpNut54aAmwKqRLBRPiDe3UrrUNiiNFs8H8WI5OgdTucU+g8PXoC1MYi8TsxZz1w= 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=WoHagAj9; arc=none smtp.client-ip=209.85.214.170 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="WoHagAj9" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2b24fede2acso71654765ad.3 for ; Mon, 27 Apr 2026 20:07:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777345640; x=1777950440; 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=UWpmesrib8YdfGGI0hDM8gVfRzPJHHWK0tDw7HDbtCM=; b=WoHagAj9wsxIYAISplyF8dfn+ZDYnKCR4XLf3eW5Cu6H7ktFjXP6v+Wd4BBRQw7p0b 3o3rORn1i9LuSaMiikJlJnGT6xyrze7xtaj//yKny2vT0w/BWDbJsBMHRazyXKlfbMTt QUV9s7JG+8QEcMHp6FVUGbs9LH2HBpU+gBrB+shDZSddD+c5W92f8ribnLtXAm5bkng9 68A22Aqzr1bFEXnCK30ouTVme+xp4HbpIqEq/DpGIEUj2JsNPqwbzT4ltAgexZRVENRg b4/jG5/SbZDsi3EMrUA7CTTB4edpXIpQ78xFEp1jAZbxT98fM9fc4YHjBN6G3Wa23HYS 2L2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777345640; x=1777950440; 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=UWpmesrib8YdfGGI0hDM8gVfRzPJHHWK0tDw7HDbtCM=; b=JkGlVvScZ4vd7TATT9s57F2hEKYFiI3ZbEtOw+7qBl/lZtNdBR6FhFXCoqKThAr8A+ z43bEmOamOkZk3/RwoM4hzCqSW369E7cb4fcgpvrbhLStT0KYsYhiEXrwL8HZUaWI49w f2oAdYL+fK6Vi94rUDTlsoAoLZg2HTRgws0HPcwUmPkJjViogs/ITEaEz09+MGhhf2UU z5k3TRCdjrbwLGOMVug2FnDRps4Og82MbxK2kwjO2N9e6peJpCp74o1ASEGsLaQQPVqZ T/f5vT8zXk7pXsxyY23CV0a0GgYVPKcce8spwzwgcKYkjECFQ66oB4U3HCifs/RsfeIW sD1A== X-Forwarded-Encrypted: i=1; AFNElJ/HlkUgj0EHxnXnZOx6TSJz61uRjadDiw0sNmO+wdYqFCCIR8ibCEMetNYBsrMetlskq3JlAjudz4BoEno=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5ZadorY7fgbxZO2M7mvN8fReil8Az/vMIBFOtSS26S44S48OC ZfyXHSwp+agetaaol3OsErVYX/plkjiCwu4lLalWHwuQM5O9yV4eJRmDfmdkkd5BbKMg4u/w X-Gm-Gg: AeBDietnbNJaM+pnLID1F/xs6w57W60lHY8grcCx42xRq3n3mnBqJ3AVBOGjrr1qMEK WOauY5bTvjL02bUzCzEznLL6vbK3SCDYcNSI4cvx48ToYm/AVa5NbVVJ4BiC5D0QEe51Z8JGY9S OCwWZKMwjlN7dK2Mw3/f8H8MSDU3+42RDoh7E4qEIkGWqnVUevzjE/0q9LbBjoG5m100y+5qois IFqm/Qtx+4V/H/Whj9z+0tih3H+tdDC/nXQSdAW5dkoXsA8sRcOxp16d6OWksIspNyS8Zk1xVLZ bvCHIsSme8VAwIX1f72jdrird6KDI8v9BmnG10ohXXk2FIyKi/tE+ItXfXLp17avditt0hxwsmE KK7/ceeJN932QIK6TTU/IVcp/OMpqe57/4U/AmqtM8CbW3FCl05nLZWbk2BGwHsJ1e9sjl16c73 x2g42MILlsHbwWehJc1ZC7h7sCvc90bxYDbr90OHRULAjW09rlc24568f3VGBt60Vlgg== X-Received: by 2002:a17:903:1585:b0:2b2:67ca:5ff9 with SMTP id d9443c01a7336-2b97c0198ddmr11959685ad.0.1777345639920; Mon, 27 Apr 2026 20:07:19 -0700 (PDT) Received: from KRHW1CJW23.bytedance.net ([203.208.189.7]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b97aca83e1sm8897915ad.78.2026.04.27.20.07.16 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 27 Apr 2026 20:07:19 -0700 (PDT) From: Zhao Li To: Andrew Morton Cc: Muchun Song , Oscar Salvador , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] mm/hugetlb: fix subpool accounting after cgroup charge failure Date: Tue, 28 Apr 2026 11:07:13 +0800 Message-ID: <20260428030712.66256-2-enderaoelyther@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260427145247.84157-2-enderaoelyther@gmail.com> References: <20260427145247.84157-2-enderaoelyther@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 alloc_hugetlb_folio() calls hugepage_subpool_get_pages() when map_chg is set. For subpools with max_hpages, that increments used_hpages. If the later hugetlb cgroup charge fails, the unwind must undo that charge even when gbl_chg > 0. hugepage_subpool_put_pages() can also restore rsv_hpages if concurrent frees move used_hpages below min_hpages between the get and put. When that happens on the gbl_chg > 0 path, restore the matching global reservation as well. Skip the gbl_chg > 0 put when max_hpages is unset. For a min_size-only subpool, get_pages() did not change subpool state and put_pages() would create a false reservation. Signed-off-by: Zhao Li --- Changes in v2: - Handle rsv_hpages restoration when racing frees cross min_hpages. - Skip gbl_chg > 0 put_pages() when max_hpages is unset. mm/hugetlb.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index f24bf49be047e..4065d66fdcb5c 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -3026,12 +3026,23 @@ struct folio *alloc_hugetlb_folio(struct vm_area_struct *vma, h_cg); out_subpool_put: /* - * put page to subpool iff the quota of subpool's rsv_hpages is used - * during hugepage_subpool_get_pages. + * map_chg means hugepage_subpool_get_pages() succeeded above. + * If max_hpages accounting was touched, undo it. If racing frees + * moved the subpool below min_hpages, the put path may restore a + * subpool reservation. Restore the matching global reservation too. */ - if (map_chg && !gbl_chg) { - gbl_reserve = hugepage_subpool_put_pages(spool, 1); - hugetlb_acct_memory(h, -gbl_reserve); + if (map_chg) { + if (!gbl_chg) { + gbl_reserve = hugepage_subpool_put_pages(spool, 1); + hugetlb_acct_memory(h, -gbl_reserve); + } else if (spool && spool->max_hpages != -1) { + gbl_reserve = hugepage_subpool_put_pages(spool, 1); + if (!gbl_reserve) { + spin_lock_irq(&hugetlb_lock); + h->resv_huge_pages++; + spin_unlock_irq(&hugetlb_lock); + } + } } -- 2.50.1 (Apple Git-155)