All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kiryl Shutsemau <kas@kernel.org>
To: Muchun Song <muchun.song@linux.dev>
Cc: Oscar Salvador <osalvador@suse.de>,
	Mike Rapoport <rppt@kernel.org>,
	 Vlastimil Babka <vbabka@suse.cz>,
	Lorenzo Stoakes <lorenzo.stoakes@oracle.com>,
	 Zi Yan <ziy@nvidia.com>, Baoquan He <bhe@redhat.com>,
	Michal Hocko <mhocko@suse.com>,
	 Johannes Weiner <hannes@cmpxchg.org>,
	Jonathan Corbet <corbet@lwn.net>,
	kernel-team@meta.com,  linux-mm@kvack.org,
	linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
	 Andrew Morton <akpm@linux-foundation.org>,
	David Hildenbrand <david@kernel.org>,
	 Matthew Wilcox <willy@infradead.org>,
	Usama Arif <usamaarif642@gmail.com>,
	 Frank van der Linden <fvdl@google.com>
Subject: Re: [PATCHv4 09/14] mm/hugetlb: Remove fake head pages
Date: Wed, 28 Jan 2026 12:59:26 +0000	[thread overview]
Message-ID: <aXoHb5fYfZNQxmMe@thinkstation> (raw)
In-Reply-To: <25C01EB2-FC77-43A5-A737-7BD3D2D98EDE@linux.dev>

On Wed, Jan 28, 2026 at 10:43:13AM +0800, Muchun Song wrote:
> 
> 
> > On Jan 27, 2026, at 22:51, Kiryl Shutsemau <kas@kernel.org> wrote:
> > 
> > On Thu, Jan 22, 2026 at 03:00:03PM +0800, Muchun Song wrote:
> >>> + if (pfn)
> >>> + 	return pfn_to_page(pfn);
> >>> +
> >>> + tail = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0);
> >>> + if (!tail)
> >>> + 	return NULL;
> >>> +
> >>> + p = page_to_virt(tail);
> >>> + for (int i = 0; i < PAGE_SIZE / sizeof(struct page); i++)
> >>> + 	prep_compound_tail(p + i, NULL, order);
> >>> +
> >>> + spin_lock(&hugetlb_lock);
> >> 
> >> hugetlb_lock is considered a contended lock, better not to abuse it.
> >> cmpxchg() is enought in this case.
> > 
> > We hit the lock once per node (excluding races). Its contribution to the
> > lock contention is negligible. spin_lock() is easier to follow. I will
> > keep it.
> 
> I don't think cmpxchg() is hard to follow. It’s precisely because of
> your abuse that interrupts still have to be disabled here—hugetlb_lock
> must be an irq-off lock. Are you really going to use spin_lock_irq just
> because “it feels simpler” to you?

I looked again at it and reconsidered. I will use cmpxchg(), but mostly
because hugetlb_lock is a bad fit to protect anything in pg_data_t.
vmemmap_tails can be used by code outside hugetlb.

Here's the fixup.

diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
index 29e9bbb43178..63e7ca85c8c9 100644
--- a/mm/hugetlb_vmemmap.c
+++ b/mm/hugetlb_vmemmap.c
@@ -512,18 +512,11 @@ static struct page *vmemmap_get_tail(unsigned int order, int node)
 	for (int i = 0; i < PAGE_SIZE / sizeof(struct page); i++)
 		prep_compound_tail(p + i, NULL, order);
 
-	spin_lock(&hugetlb_lock);
-	if (!NODE_DATA(node)->vmemmap_tails[idx]) {
-		pfn = PHYS_PFN(virt_to_phys(p));
-		NODE_DATA(node)->vmemmap_tails[idx] = pfn;
-		tail = NULL;
-	} else {
-		pfn = NODE_DATA(node)->vmemmap_tails[idx];
-	}
-	spin_unlock(&hugetlb_lock);
-
-	if (tail)
+	pfn = PHYS_PFN(virt_to_phys(p));
+	if (cmpxchg(&NODE_DATA(node)->vmemmap_tails[idx], 0, pfn)) {
 		__free_page(tail);
+		pfn = READ_ONCE(NODE_DATA(node)->vmemmap_tails[idx]);
+	}
 
 	return pfn_to_page(pfn);
 }
-- 
  Kiryl Shutsemau / Kirill A. Shutemov

  reply	other threads:[~2026-01-28 12:59 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-21 16:22 [PATCHv4 00/14] mm: Eliminate fake head pages from vmemmap optimization Kiryl Shutsemau
2026-01-21 16:22 ` [PATCHv4 01/14] mm: Move MAX_FOLIO_ORDER definition to mmzone.h Kiryl Shutsemau
2026-01-21 16:29   ` Zi Yan
2026-01-22  2:24   ` Muchun Song
2026-01-21 16:22 ` [PATCHv4 02/14] mm: Change the interface of prep_compound_tail() Kiryl Shutsemau
2026-01-21 16:32   ` Zi Yan
2026-01-21 16:22 ` [PATCHv4 03/14] mm: Rename the 'compound_head' field in the 'struct page' to 'compound_info' Kiryl Shutsemau
2026-01-21 16:34   ` Zi Yan
2026-01-21 16:22 ` [PATCHv4 04/14] mm: Move set/clear_compound_head() next to compound_head() Kiryl Shutsemau
2026-01-21 16:35   ` Zi Yan
2026-01-21 16:22 ` [PATCHv4 05/14] mm: Rework compound_head() for power-of-2 sizeof(struct page) Kiryl Shutsemau
2026-01-21 17:12   ` Zi Yan
2026-01-22 11:29     ` Kiryl Shutsemau
2026-01-22 11:52       ` Muchun Song
2026-01-21 16:22 ` [PATCHv4 06/14] mm: Make page_zonenum() use head page Kiryl Shutsemau
2026-01-21 16:28   ` Zi Yan
2026-01-21 16:22 ` [PATCHv4 07/14] mm/sparse: Check memmap alignment for compound_info_has_mask() Kiryl Shutsemau
2026-01-21 17:58   ` Zi Yan
2026-01-22 11:22     ` Kiryl Shutsemau
2026-01-22  3:10   ` Muchun Song
2026-01-22 11:28     ` Kiryl Shutsemau
2026-01-22 11:33       ` Muchun Song
2026-01-22 11:42         ` Muchun Song
2026-01-22 12:42           ` Kiryl Shutsemau
2026-01-22 14:02             ` Muchun Song
2026-01-22 17:59               ` Kiryl Shutsemau
2026-01-23  2:32                 ` Muchun Song
2026-01-23 12:07                   ` Kiryl Shutsemau
2026-01-21 16:22 ` [PATCHv4 08/14] mm/hugetlb: Refactor code around vmemmap_walk Kiryl Shutsemau
2026-01-22  8:08   ` Muchun Song
2026-01-21 16:22 ` [PATCHv4 09/14] mm/hugetlb: Remove fake head pages Kiryl Shutsemau
2026-01-22  7:00   ` Muchun Song
2026-01-27 14:51     ` Kiryl Shutsemau
2026-01-28  2:43       ` Muchun Song
2026-01-28 12:59         ` Kiryl Shutsemau [this message]
2026-01-29  3:04           ` Muchun Song
2026-01-21 16:22 ` [PATCHv4 10/14] mm: Drop fake head checks Kiryl Shutsemau
2026-01-21 18:16   ` Zi Yan
2026-01-22 12:48     ` Kiryl Shutsemau
2026-01-21 16:22 ` [PATCHv4 11/14] hugetlb: Remove VMEMMAP_SYNCHRONIZE_RCU Kiryl Shutsemau
2026-01-21 16:22 ` [PATCHv4 12/14] mm/hugetlb: Remove hugetlb_optimize_vmemmap_key static key Kiryl Shutsemau
2026-01-21 16:22 ` [PATCHv4 13/14] mm: Remove the branch from compound_head() Kiryl Shutsemau
2026-01-21 18:21   ` Zi Yan
2026-01-21 16:22 ` [PATCHv4 14/14] hugetlb: Update vmemmap_dedup.rst Kiryl Shutsemau
2026-01-22  2:22   ` Muchun Song
2026-01-21 18:44 ` [PATCHv4 00/14] mm: Eliminate fake head pages from vmemmap optimization Vlastimil Babka
2026-01-21 20:31   ` Zi Yan
2026-01-22 11:21     ` Kiryl Shutsemau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aXoHb5fYfZNQxmMe@thinkstation \
    --to=kas@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=bhe@redhat.com \
    --cc=corbet@lwn.net \
    --cc=david@kernel.org \
    --cc=fvdl@google.com \
    --cc=hannes@cmpxchg.org \
    --cc=kernel-team@meta.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lorenzo.stoakes@oracle.com \
    --cc=mhocko@suse.com \
    --cc=muchun.song@linux.dev \
    --cc=osalvador@suse.de \
    --cc=rppt@kernel.org \
    --cc=usamaarif642@gmail.com \
    --cc=vbabka@suse.cz \
    --cc=willy@infradead.org \
    --cc=ziy@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.