From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2F1193A4F30 for ; Mon, 20 Apr 2026 12:51:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776689475; cv=none; b=LEH/S7NVSpqCo8RVd7bA4v7FgrXxqOOiMW89i3pBkaQvPHwYk1vYmpBSL9g3SLMesmQH5p6GfStQjrLAe330wVHFCfvuw3H3qWsffH23eEVLwJtydwDVvC18acxs6RclqMY0Ocg5Ff8ZRSOWR0MeMV4tEcP9evwHz1gsvT4kH8U= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776689475; c=relaxed/simple; bh=b0uEgPLjU9RqUL8qCkAp6CionPNtPZx5K8nQiG2MheA=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=gGN8xL5TnAaErTWEFAbd/Q9PP72xNbonGC4LUTfOMlrWI1g0J7+AcGi8dFsgCBXsanKWVhBsd5Z16PbSNE2N/fN+OpKyRzaxLhJmzow4wg6GmOEW5eOEHvTYYLB8S/QGYRuUr6Rj17KqZLVikZQnYnrKxSxjZ5XYEPYMHtZXJB0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=HwxB/CZ+; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=RlrvglR9; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="HwxB/CZ+"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="RlrvglR9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776689473; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Bi57iZ++pwWctggr2TvdW1CtXtPNYbcTAE7BCEX37cw=; b=HwxB/CZ+vBrlhpgVxDKjQQkuhKh6kuxAVPWzD7rMpf9wfxUqxaxYPRiUmmBwjFfIpXPiMW IRF8n15CL7GEzyUkb/2kRycvgW/Yh3aYSmmwDY4c5RjTqMumijHtNYZE1dGQvaQbDxuWgu obFsDk20yrgBJIbjSvKIloOlQ/6vvWc= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-434-mk5G55NvMj-0Cgjxxx93mQ-1; Mon, 20 Apr 2026 08:51:12 -0400 X-MC-Unique: mk5G55NvMj-0Cgjxxx93mQ-1 X-Mimecast-MFC-AGG-ID: mk5G55NvMj-0Cgjxxx93mQ_1776689471 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-4411a2c034fso527014f8f.3 for ; Mon, 20 Apr 2026 05:51:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1776689471; x=1777294271; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=Bi57iZ++pwWctggr2TvdW1CtXtPNYbcTAE7BCEX37cw=; b=RlrvglR9LqasD2Bextw3jxpabOpdIxi376K3w+RRuqI/M0LglK5JQgu5egIg9WKV10 vTMgBoZFCejgvqXvKMe0Cr6d5h8JTrRKklEAB+q+/+yU6cUYaM0+bHw/N3kA012gq3ni 0OIh/kIm71zrR61d2Tm87gT8aPMerz/GiolBpGPCnt0C3HsH/4jkugDJ8wJwa/2+alWA O8Dr8vbTTm9NXWkdvGL+6pdZLy0S53rKEnaQ1zSmml4lHk7t+k/STkfsAWDqbq3oMQWc LVclPEjX9dQtkFamGremxTgYzIK/EYzdfv7PLkC1ks+6MSpEluOGhtNJqpVn3ifGJH1M QncQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776689471; x=1777294271; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Bi57iZ++pwWctggr2TvdW1CtXtPNYbcTAE7BCEX37cw=; b=hX/w7K2lyKeqq28cImsz1I7Pvz9N4CTsKp0KIwMG3qKFgNAemUWoudjJf/19ZOIT1o ZBjMNDMmhwJD2cxmVLQGWfeTb1TCJ9qfc+yvApHH0U+LVedKJ3bvF7EKlNQlfEMEv64R vCGlLjLqoZYEJayRTw0EN2FjfY7KYnfC989+xVH/fUN6t/PO2R7nvtmnfszKRji/lKRY mhgWooXJnmFKtUYcgeGXex/ERcPyFZn/YYier4n/V9nUzdXGjkg1jrSqlQFOJWqDc4c7 rdOjdzcfrEeF+6f/hhb9wxwFmooGMvcv/tfHzbiE+pnRtNt8kdEfiiqi/3DI8xQikVvj sW3g== X-Gm-Message-State: AOJu0Yxhyg4fKCll0FsOZayYF6wytmToXDmTfJM5iLsJPQGdreJNJI83 86FxruCxC5maUdbsX8dM85PKmvUVMbjQK8d4tWPxZvhz/3zbJHML7vodiZvsjew4WYbYzoEkdE1 AfxciCJ+h+WfDzd02/lz413VpWlrwxsGUPKGkKljZa5nxwsGG7NvVFFgCGuGl5Kmf/Bi8rbtKe/ 1EcbGU6YvWFptXmrNiFw1cmFz0xDD3Ne1UZ4lJFEvHk34= X-Gm-Gg: AeBDieuGsaanqA+WqQ2QfrncGluozj4U30oJ+3A4Eg4nuMu0MR14rzI/ZloWAqnwAc8 S+Jhxb48zb7TGfaCUD9l4PLqxCZuCwNo6aSZkGPTo56EJzyM1QmtBqFOaJBkqpcEAaxJTrS6Dvx 15onBknur6IwHiEc+MlCyBU5wlo7gAshaogtxL24caqyj8W+SqvN8JRrnF9TddMvHw4Hair4N9U K2bkoeJ9qWi2pblBG8nHcdoyOs3YCWUJ7nUxon+UQiI2nXesV9pktnypCEJSF/xzIyZ5OE8nhQL L/3xdxFDN0CQEtoYqDwvnIcY10j++IUVbEcAcrANTqpYBHFhaucIwbmQEhx2b/K3e5DN9V9lD1r zPfRvDvNbHzFE4NS9keF8FcdKkESH0kxk2J0QMbCsJdwxeSxt/ycLkA== X-Received: by 2002:a05:6000:18a6:b0:43d:4e65:303d with SMTP id ffacd0b85a97d-43fe3e14f76mr20125460f8f.37.1776689470702; Mon, 20 Apr 2026 05:51:10 -0700 (PDT) X-Received: by 2002:a05:6000:18a6:b0:43d:4e65:303d with SMTP id ffacd0b85a97d-43fe3e14f76mr20125355f8f.37.1776689469912; Mon, 20 Apr 2026 05:51:09 -0700 (PDT) Received: from redhat.com (IGLD-80-230-25-21.inter.net.il. [80.230.25.21]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43fe4e4633bsm28592720f8f.26.2026.04.20.05.51.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Apr 2026 05:51:09 -0700 (PDT) Date: Mon, 20 Apr 2026 08:51:06 -0400 From: "Michael S. Tsirkin" To: linux-kernel@vger.kernel.org Cc: Andrew Morton , David Hildenbrand , Vlastimil Babka , Brendan Jackman , Michal Hocko , Suren Baghdasaryan , Jason Wang , Andrea Arcangeli , linux-mm@kvack.org, virtualization@lists.linux.dev, Lorenzo Stoakes , "Liam R. Howlett" , Mike Rapoport , Johannes Weiner , Zi Yan , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu Subject: [PATCH RFC v2 17/18] mm: add free_frozen_pages_hint and put_page_hint APIs Message-ID: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Mailer: git-send-email 2.27.0.106.g8ac3dc51b1 X-Mutt-Fcc: =sent Add free_frozen_pages_hint(page, order, hints) to free a page while marking it as pre-zeroed when PGHINT_ZEROED is set. The PG_zeroed flag is set after __free_pages_prepare so it survives on the free list. Add __folio_put_hint(), folio_put_hint(), and put_page_hint() wrappers for the put_page path. These APIs are intended for balloon drivers during deflation when the host has zeroed the pages. Signed-off-by: Michael S. Tsirkin Assisted-by: Claude:claude-opus-4-6 Assisted-by: cursor-agent:GPT-5.4-xhigh --- include/linux/gfp.h | 2 ++ include/linux/mm.h | 12 ++++++++++++ mm/page_alloc.c | 21 +++++++++++++++------ mm/swap.c | 19 +++++++++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 14433a20e60c..b226d5e1930e 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -404,6 +404,8 @@ __meminit void *alloc_pages_exact_nid_noprof(int nid, size_t size, gfp_t gfp_mas extern void __free_pages(struct page *page, unsigned int order); extern void free_pages_nolock(struct page *page, unsigned int order); extern void free_pages(unsigned long addr, unsigned int order); +void free_frozen_pages_hint(struct page *page, unsigned int order, + pghint_t hints); #define __free_page(page) __free_pages((page), 0) #define free_page(addr) free_pages((addr), 0) diff --git a/include/linux/mm.h b/include/linux/mm.h index abb4963c1f06..f4e28c55e2c9 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1640,6 +1640,7 @@ static inline struct folio *virt_to_folio(const void *x) } void __folio_put(struct folio *folio); +void __folio_put_hint(struct folio *folio, pghint_t hints); void split_page(struct page *page, unsigned int order); void folio_copy(struct folio *dst, struct folio *src); @@ -1817,6 +1818,17 @@ static inline void folio_put(struct folio *folio) __folio_put(folio); } +static inline void folio_put_hint(struct folio *folio, pghint_t hints) +{ + if (folio_put_testzero(folio)) + __folio_put_hint(folio, hints); +} + +static inline void put_page_hint(struct page *page, pghint_t hints) +{ + folio_put_hint(page_folio(page), hints); +} + /** * folio_put_refs - Reduce the reference count on a folio. * @folio: The folio. diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a4cfd645599a..f04813db3015 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3000,7 +3000,7 @@ static bool free_frozen_page_commit(struct zone *zone, * Free a pcp page */ static void __free_frozen_pages(struct page *page, unsigned int order, - fpi_t fpi_flags) + fpi_t fpi_flags, pghint_t hints) { unsigned long UP_flags; struct per_cpu_pages *pcp; @@ -3016,6 +3016,9 @@ static void __free_frozen_pages(struct page *page, unsigned int order, if (!__free_pages_prepare(page, order, fpi_flags)) return; + if (hints & PGHINT_ZEROED) + __SetPageZeroed(page); + /* * We only track unmovable, reclaimable and movable on pcp lists. * Place ISOLATE pages on the isolated list because they are being @@ -3051,12 +3054,18 @@ static void __free_frozen_pages(struct page *page, unsigned int order, void free_frozen_pages(struct page *page, unsigned int order) { - __free_frozen_pages(page, order, FPI_NONE); + __free_frozen_pages(page, order, FPI_NONE, 0); +} + +void free_frozen_pages_hint(struct page *page, unsigned int order, + pghint_t hints) +{ + __free_frozen_pages(page, order, FPI_NONE, hints); } void free_frozen_pages_nolock(struct page *page, unsigned int order) { - __free_frozen_pages(page, order, FPI_TRYLOCK); + __free_frozen_pages(page, order, FPI_TRYLOCK, 0); } /* @@ -5385,7 +5394,7 @@ static void ___free_pages(struct page *page, unsigned int order, struct alloc_tag *tag = pgalloc_tag_get(page); if (put_page_testzero(page)) - __free_frozen_pages(page, order, fpi_flags); + __free_frozen_pages(page, order, fpi_flags, 0); else if (!head) { pgalloc_tag_sub_pages(tag, (1 << order) - 1); while (order-- > 0) { @@ -5396,7 +5405,7 @@ static void ___free_pages(struct page *page, unsigned int order, */ clear_page_tag_ref(page + (1 << order)); __free_frozen_pages(page + (1 << order), order, - fpi_flags); + fpi_flags, 0); } } } @@ -7879,7 +7888,7 @@ struct page *alloc_frozen_pages_nolock_noprof(gfp_t gfp_flags, int nid, unsigned if (memcg_kmem_online() && page && (gfp_flags & __GFP_ACCOUNT) && unlikely(__memcg_kmem_charge_page(page, alloc_gfp, order) != 0)) { - __free_frozen_pages(page, order, FPI_TRYLOCK); + __free_frozen_pages(page, order, FPI_TRYLOCK, 0); page = NULL; } trace_mm_page_alloc(page, order, alloc_gfp, ac.migratetype); diff --git a/mm/swap.c b/mm/swap.c index bb19ccbece46..1dfd232d3944 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -113,6 +113,25 @@ void __folio_put(struct folio *folio) } EXPORT_SYMBOL(__folio_put); +void __folio_put_hint(struct folio *folio, pghint_t hints) +{ + if (unlikely(folio_is_zone_device(folio))) { + free_zone_device_folio(folio); + return; + } + + if (folio_test_hugetlb(folio)) { + free_huge_folio(folio); + return; + } + + page_cache_release(folio); + folio_unqueue_deferred_split(folio); + mem_cgroup_uncharge(folio); + free_frozen_pages_hint(&folio->page, folio_order(folio), hints); +} +EXPORT_SYMBOL(__folio_put_hint); + typedef void (*move_fn_t)(struct lruvec *lruvec, struct folio *folio); static void lru_add(struct lruvec *lruvec, struct folio *folio) -- MST