From: David Hildenbrand <david@redhat.com>
To: Matthew Wilcox <willy@infradead.org>
Cc: linux-mm@kvack.org, Oscar Salvador <osalvador@suse.de>
Subject: Re: [PATCH 0/5] Remove some races around folio_test_hugetlb
Date: Thu, 7 Mar 2024 10:20:15 +0100 [thread overview]
Message-ID: <bbbedbf5-604c-46d4-a3ca-c91febe283e7@redhat.com> (raw)
In-Reply-To: <ZelDHv_4_ftbrqrB@casper.infradead.org>
>>>
>>> IOW:
>>>
>>> word page0 page1
>>> 0 flags flags
>>> 1 lru.next head
>>> 2 lru.prev entire_mapcount + gap
>>> 3 mapping nr_pages_mapped + gap / hugetlb_id
>>> 4 index pincount + nr_pages
>>> 5 private unused
>>> 6 mapcount+refcount mapcount+refcount(0)
>>> 7 memcg_data -
>>>
>>> or on 32-bit
>>>
>>> word page0 page1
>>> 0 flags flags
>>> 1 lru.next head
>>> 2 lru.prev entire_mapcount
>>> 3 mapping nr_pages_mapped / hugetlb_id
>>
>> ^ In the worst case, I think, nr_pages_mapped with a lot of entire mappings
>> could end up matching hugetlb_id. We add a large value to nr_pages_mapped
>> every time we add an entire mapping ... (not sure if that could currently be
>> a problem with many entire mappings of a large folio)
>
> My understanding was that nr_pages_mapped was incremented by one for
> each page which has a non-zero mapcount. It was also incremented by
> ENTIRELY_MAPPED the first time that we increment ->entire_mapcount.
> As such, I don't think entire_mapcount can get the top bit set.
Right, I misremembered!
>
>>
>>> 4 index pincount
>>> 5 private unused
>>> 6 mapcount mapcount
>>> 7 refcount refcount
>>> 8 memcg_data -
>>> 9+ virtual? last_cpupid? whatever
>>>
>>> Does this fit with your plans?
>>
>> For the total mapcount this would do (and it would be better), but the
>> layout gets a bit "sparse" on 64bit that way, which will end up being
>> problematic for some other stuff I might want to put in there.
>>
>> Not that we have to resolve that now, just bringing it up, that maybe we can
>> do better right away :)
>
> How about this layout?
>
> @@ -350,8 +350,13 @@ struct folio {
> unsigned long _head_1;
> unsigned long _folio_avail;
> /* public: */
> - atomic_t _entire_mapcount;
> - atomic_t _nr_pages_mapped;
> + union {
> + unsigned long _hugetlb_id;
> + struct {
> + atomic_t _entire_mapcount;
> + atomic_t _nr_pages_mapped;
> + };
> + };
> atomic_t _pincount;
> #ifdef CONFIG_64BIT
> unsigned int _folio_nr_pages;
>
> That keeps _folio_avail as, well, available. It puts _hugetlb_id in
> the same bits as ->mapping. It continues to leave ->private unused
> on 64-bit. I think this does everything we want?
_entire_mapcount is (still) used for hugetlb folios.
With the total mapcount in place, I was thinking about renaming it to
"_pmd_mapcount" and stop using it for hugetlb folios, just like we'd not
be using _nr_pages_mapped for hugetlb folios.
[I also thought about moving the _pmd_mapcount to another subpage, where
we'd also have a _pud_mapcount in the future; but again, stuff for the
future]
Until then, wouldn't _hugetlb_id be problematic here? [I could move
_entire_mapcount/_pmd_mapcount later I guess]
--
Cheers,
David / dhildenb
next prev parent reply other threads:[~2024-03-07 9:20 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-01 21:47 [PATCH 0/5] Remove some races around folio_test_hugetlb Matthew Wilcox (Oracle)
2024-03-01 21:47 ` [PATCH 1/5] hugetlb: Make folio_test_hugetlb safer to call Matthew Wilcox (Oracle)
2024-03-05 6:43 ` Oscar Salvador
2024-03-05 8:39 ` David Hildenbrand
2024-03-01 21:47 ` [PATCH 2/5] hugetlb: Add hugetlb_pfn_folio Matthew Wilcox (Oracle)
2024-03-05 6:58 ` Oscar Salvador
2024-03-01 21:47 ` [PATCH 3/5] memory-failure: Use hugetlb_pfn_folio Matthew Wilcox (Oracle)
2024-03-01 21:47 ` [PATCH 4/5] memory-failure: Reorganise get_huge_page_for_hwpoison() Matthew Wilcox (Oracle)
2024-03-01 21:47 ` [PATCH 5/5] compaction: Use hugetlb_pfn_folio in isolate_migratepages_block Matthew Wilcox (Oracle)
2024-03-04 9:09 ` [PATCH 0/5] Remove some races around folio_test_hugetlb Miaohe Lin
2024-03-04 17:08 ` Matthew Wilcox
2024-03-06 7:58 ` Miaohe Lin
2024-03-07 21:16 ` Matthew Wilcox
2024-03-05 9:10 ` David Hildenbrand
2024-03-05 20:35 ` Matthew Wilcox
2024-03-06 15:18 ` David Hildenbrand
2024-03-07 4:31 ` Matthew Wilcox
2024-03-07 9:20 ` David Hildenbrand [this message]
2024-03-07 21:14 ` Matthew Wilcox
2024-03-07 21:38 ` David Hildenbrand
2024-03-08 4:31 ` Matthew Wilcox
2024-03-08 8:46 ` 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=bbbedbf5-604c-46d4-a3ca-c91febe283e7@redhat.com \
--to=david@redhat.com \
--cc=linux-mm@kvack.org \
--cc=osalvador@suse.de \
--cc=willy@infradead.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 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.