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.129.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 25E7E3A1E70 for ; Tue, 21 Apr 2026 22:02:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776808933; cv=none; b=LEC+UMnJncS5QXN9DDiMk31cUuqxV7iOPiheni/6aNG5wmKTqmBKft2Wol6G0Z08OKi0Ioh2wSPArvsEaK8hMoVJhOaBgBpt/YDLEIht5XSyEZUfKVOM/6lEj/u+VxoE5kCvaCnnLMhlxWX1r9YC4HLrw/P+5UPVg59d1kKH/54= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776808933; c=relaxed/simple; bh=ArOZv9uCSES6WoLoP2qfLy3zOOTQa3tVnsSTEE/uUjI=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=RgzhHYylLC6RrC2D21jUnymrfvn6tmQUzT04iT6hXpQw6uGHCob4/UgkZI4fIoLUKQoQtaMvHCPGzzxPGZUx56dteO3wQPdVXpLCbJuN3WxOKZ9dwjVoQoLrTn6Wq7pu+4yfcwUG5JCQNiQGskaMNgGNMkzuB4tYwvDleGN8ShE= 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=N30hWXjj; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=V+VpvEZj; arc=none smtp.client-ip=170.10.129.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="N30hWXjj"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="V+VpvEZj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776808931; 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=b5ITR8zgbYah+ZxSMqe409RlUP6fQP6IKxEaDIol6Sg=; b=N30hWXjj9HibWjKM69cMF8kr3LAjS82uEgkkVsjdQpBPaTF1TVvKhbfhv9Z4sLrNZVTCD9 6p42Olou/P8B7AcrtzpLZDrk2t2VYi4An/ogFLZ0K5bnv9Wmla8NPtuevgH/W68Evaz6W9 Fn/i4Zo9Cu/JYGK5gIxFRzuH3wwb3RM= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-661-loCFxwP6Oc2gnhGfXCScKg-1; Tue, 21 Apr 2026 18:02:09 -0400 X-MC-Unique: loCFxwP6Oc2gnhGfXCScKg-1 X-Mimecast-MFC-AGG-ID: loCFxwP6Oc2gnhGfXCScKg_1776808929 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-43d77286244so3118433f8f.1 for ; Tue, 21 Apr 2026 15:02:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1776808928; x=1777413728; 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=b5ITR8zgbYah+ZxSMqe409RlUP6fQP6IKxEaDIol6Sg=; b=V+VpvEZjWrjvm5ewdDurUWRGyET8QZqoRIEi1nwjj6ypQsTMSFE5EHkabAxi/3UnF8 yKTlknEhGGkk6cBHhpwvmnCmimkt8b3D1OjP2r0Y0DufWSAqT5egowyC5Af388wQdGB0 KxXhPDeqmP5L0Cozcy/WxoKNLgVD+Y6OqUelbEfQukJ7i4nW4sPeCx7kvkQb1M8ozXVG giSCXJH+atGw3X1ZAV8QyG2bYHHmHhwZAK/cra6iJfpRKE1xT5XEOQyJGnWRf0kTLs6y A71BUgWe8281DVtE52ecz46e+oinUyPAfil2s29+r9n2jxnfhweOr7QlSeGeJBKHccbL 5d3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776808928; x=1777413728; 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=b5ITR8zgbYah+ZxSMqe409RlUP6fQP6IKxEaDIol6Sg=; b=BiUjmpfO0a82tQfIGymp8HbM80hIac+1FXa2QlERtECjBud2w7NPNbWISAQ88ZGCbY 10DJLgv3vtzPddvivSmoLY4bVRnOBAH1zfaFjo4o260P33UExfUVlwKxqG00b5pob3RG pjzRYT+YrIwLMXfior6FCbdSYDwCZqZli/V6l4K74/MNUfp5fxeurOHNV2Jm3pqaKG89 OdJl/0Sst7+C7u+nO60FFrijKr/KEXvc4YCgaDh7f/JdGbWnAGbSzrg+nfoow1tV+Pst eTh7IGI4MnLdyyOqgZ8ObiWOdaBPtV3F+Ym5clWhbCJfzyzIb73o+vBuQoh/VWdW555c 5axQ== X-Gm-Message-State: AOJu0Yw4DsihZ+6819DE86iVoR8GOctvZ9S+hoyTnj8n7Mf5SXqw2Gr/ wAdZN9mi4lXMZd/AnuHU/Z17hTna5UzEQawPLr7AuGL2LB6orz6G55Oy1UsH4hLyWrdV6x8duBb l2kdZPxi7PymrzhxwuF9qLR6nd9iBeDUssNpJ0betSj3LwIHrPChR9zmhm1yTlZBI7bX/OYHsHD w0YBFhmAsVhOpCypbfRuO6ipKKFXYWizCSyVuj4Be+YVQ= X-Gm-Gg: AeBDietO0mm9gkXbYWsSzWgnlmbkCCHKRI/G85amWyUS4/g6veOzC/bx4wgmKmAn2Il 6VEHblKPa6RyrJQ1ZhO0GLN561EY7O/hsDm2IUBgvi0x2YVbqH6whZhqIdzSRbgkfb0Ds99BXia ff52YU1cIdJAXxky6nX16Gy37M+kOeho4JCczipN6AGhrmpLzwAZn4+ZRBevEAs9/K/JhU2f0/N CYH7Ty4jCmjdf+H0Z/VXNFcic5HaIdYljNbakm2Rn+bVLLcChqyKjpT7aKI7C4b3ByWkdmUpJzq YCx8N7rfJMerX/udT5eqd9gDXm88ZGl0eJG/a+bLpUie4E37RQ1y2olQcFLeTjAxYjLDZKmPJ1u HbB/6qGos7+ITUU0vG5YLctSe7YmabNni/lXEL9eDjqgZTM9CJ9FwUg== X-Received: by 2002:a05:600c:1da1:b0:488:79a3:f04c with SMTP id 5b1f17b1804b1-488fb7863femr300220525e9.27.1776808928337; Tue, 21 Apr 2026 15:02:08 -0700 (PDT) X-Received: by 2002:a05:600c:1da1:b0:488:79a3:f04c with SMTP id 5b1f17b1804b1-488fb7863femr300219935e9.27.1776808927735; Tue, 21 Apr 2026 15:02:07 -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 5b1f17b1804b1-48a5549f582sm28914685e9.33.2026.04.21.15.02.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Apr 2026 15:02:06 -0700 (PDT) Date: Tue, 21 Apr 2026 18:02:03 -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 , Gregory Price , linux-mm@kvack.org, virtualization@lists.linux.dev, Lorenzo Stoakes , "Liam R. Howlett" , Mike Rapoport , Axel Rasmussen , Yuanchu Xie , Wei Xu , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Barry Song Subject: [PATCH RFC v3 16/19] mm: add put_page_zeroed and folio_put_zeroed 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 put_page_zeroed() / folio_put_zeroed() for callers that hold a reference to a page known to be zeroed. If this drops the last reference, the page goes through __folio_put_zeroed() which calls free_frozen_pages_zeroed() so the zeroed hint is preserved. If someone else still holds a reference, the hint is simply lost -- this is best-effort. This is useful for balloon drivers during deflation: the host has already zeroed the pages, and the balloon is typically the sole owner. But if the page happens to be shared, silently dropping the hint is safe and avoids the need for callers to check the refcount. Signed-off-by: Michael S. Tsirkin Assisted-by: Claude:claude-opus-4-6 --- include/linux/mm.h | 12 ++++++++++++ mm/swap.c | 18 ++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 821034dd33d1..878544830369 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_zeroed(struct folio *folio); 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_zeroed(struct folio *folio) +{ + if (folio_put_testzero(folio)) + __folio_put_zeroed(folio); +} + +static inline void put_page_zeroed(struct page *page) +{ + folio_put_zeroed(page_folio(page)); +} + /** * folio_put_refs - Reduce the reference count on a folio. * @folio: The folio. diff --git a/mm/swap.c b/mm/swap.c index bb19ccbece46..5d05a463b46a 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -94,7 +94,7 @@ static void page_cache_release(struct folio *folio) unlock_page_lruvec_irqrestore(lruvec, flags); } -void __folio_put(struct folio *folio) +static void ___folio_put(struct folio *folio, bool zeroed) { if (unlikely(folio_is_zone_device(folio))) { free_zone_device_folio(folio); @@ -109,10 +109,24 @@ void __folio_put(struct folio *folio) page_cache_release(folio); folio_unqueue_deferred_split(folio); mem_cgroup_uncharge(folio); - free_frozen_pages(&folio->page, folio_order(folio)); + if (zeroed) + free_frozen_pages_zeroed(&folio->page, folio_order(folio)); + else + free_frozen_pages(&folio->page, folio_order(folio)); +} + +void __folio_put(struct folio *folio) +{ + ___folio_put(folio, false); } EXPORT_SYMBOL(__folio_put); +void __folio_put_zeroed(struct folio *folio) +{ + ___folio_put(folio, true); +} +EXPORT_SYMBOL(__folio_put_zeroed); + typedef void (*move_fn_t)(struct lruvec *lruvec, struct folio *folio); static void lru_add(struct lruvec *lruvec, struct folio *folio) -- MST