linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: linux-mm@kvack.org
Cc: David Hildenbrand <david@redhat.com>, Jason Gunthorpe <jgg@nvidia.com>
Subject: Where to put page->memdesc initially
Date: Tue, 2 Sep 2025 20:03:57 +0100	[thread overview]
Message-ID: <aLc_nckaDc2ePRv7@casper.infradead.org> (raw)

With the recent patches to slab, I'm just about ready to allocate struct
slab separately from struct page.  This will not be an immediate win,
of course.  Indeed, it will likely be a slowdown (overhead of a second
allocation per slab).  So there's no urgency to do this until we're
ready to shrink struct page, when we can at least point to that win
as justification.

Still, we should understand how we're going to get to Page2025 [1] one
step at a time.  I had been thinking about coopting compound_head to point
to struct slab.  But looking at the places which call folio_test_slab()
[an oxymoron in the New York Interpretation], it becomes apparent that
we need to keep compound_head() and page_folio() working for all pages
for a while.

As a reminder, compound_head() will _eventually_ return NULL for
slabs & folios.  It will only be defined to work for page allocations.
Likewise page_folio() will return NULL for any pages not part of a folio
and page_slab() will return NULL for any pages not part of a slab.

My best offer right now is to use page->lru.prev.  At least one of the
bottom two bits will be set to indicate that it's a memdesc (we're only
going to use thirteen of the memdesc types initially).

There are a few overlapping uses of these bits in struct page, so if we do
nothing we may get confused.  We can deal with mlock_count and order (for
pcp_llist).  But the biggest problem is the first tail page of a folio.
Depending on word size and endianness, there are four different atomic_t
fields that overlap with page->lru.prev.  That can't be solved by using
a different field in struct page; the first tail page is jam-packed.

So, page_slab() will first load page->memdesc (the same bits as
page->lru.prev), check the bottom four bits match the slab memdesc, and
also check page->page_type matches PGTY_slab.  I don't like this a lot,
because it's two loads rather than one atomic load, but it should only
be present for one commit.

In the next commit, we can separately allocate struct folio, make
page->memdesc point to struct folio and drop the PGTY_slab check (as
there will be no more uses of the first tail page for the mapcount stuff).

[1] https://kernelnewbies.org/MatthewWilcox/Memdescs/Path


             reply	other threads:[~2025-09-02 19:04 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-02 19:03 Matthew Wilcox [this message]
2025-09-02 20:08 ` Jason Gunthorpe
2025-09-02 20:09 ` David Hildenbrand
2025-09-02 21:06   ` Matthew Wilcox
2025-09-02 21:15     ` Jason Gunthorpe
2025-09-02 23:24       ` Matthew Wilcox
2025-09-02 23:57         ` Jason Gunthorpe
2025-09-03  4:46           ` Matthew Wilcox
2025-09-03  9:38             ` David Hildenbrand
2025-09-03 12:28             ` Jason Gunthorpe
2025-09-03 12:43             ` Jason Gunthorpe
2025-09-03  9:33     ` David Hildenbrand

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=aLc_nckaDc2ePRv7@casper.infradead.org \
    --to=willy@infradead.org \
    --cc=david@redhat.com \
    --cc=jgg@nvidia.com \
    --cc=linux-mm@kvack.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox