From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH 1/8] x86/pdx: simplify calculation of domain struct allocation boundary
Date: Thu, 12 Jun 2025 12:46:37 +0200 [thread overview]
Message-ID: <aEqwDZc8u8FFW2Al@macbook.local> (raw)
In-Reply-To: <6abadf32-836f-45fb-bb3a-3afdf97e157b@suse.com>
On Thu, Jun 12, 2025 at 11:03:21AM +0200, Jan Beulich wrote:
> On 11.06.2025 19:16, Roger Pau Monne wrote:
> > @@ -498,14 +474,15 @@ struct domain *alloc_domain_struct(void)
> > * On systems with CONFIG_BIGMEM there's no packing, and so there's no
> > * such restriction.
> > */
> > -#if defined(CONFIG_BIGMEM) || !defined(CONFIG_PDX_COMPRESSION)
> > - const unsigned int bits = IS_ENABLED(CONFIG_BIGMEM) ? 0 :
> > - 32 + PAGE_SHIFT;
> > +#if defined(CONFIG_BIGMEM)
> > + const unsigned int bits = 0;
> > #else
> > - static unsigned int __read_mostly bits;
> > + static unsigned int __ro_after_init bits;
> >
> > if ( unlikely(!bits) )
> > - bits = _domain_struct_bits();
> > + bits = flsl(pfn_to_paddr(pdx_to_pfn(
> > + 1UL << (sizeof(((struct page_info *)NULL)->v.inuse._domain) * 8))))
> > + - 1;
>
> While Andrew did point you at sizeof_field(), we can have this even less verbose
> by utilizing that frame_table is of the right type and (almost) globally in scope.
>
> Further, why use pfn_to_paddr()?
>
> bits = flsl(pdx_to_pfn(1UL <<
> (sizeof(frame_table->v.inuse._domain) * 8))) +
> PAGE_SHIFT - 1;
I've introduced and used pdx_to_paddr(), which I think it's more
natural. We already had a paddr_to_pdx() which was missing it's
bidirectional equivalent. It's now:
bits = flsl(pdx_to_paddr(1UL << (sizeof_field(struct page_info,
v.inuse._domain) * 8)))
- 1;
> However, it further feels like this was off by one; we had similar issues over
> time in several places. There potentially being a gap between one less than
> the PDX used here and that very PDX, don't we need to calculate based on the
> "one less" value here? Hmm, there being a gap means no allocation would
> succeed for the precise value of "bits" (in the mask-compression scheme), so
> functionally all would be fine. Yet just to avoid setting a bad precedent I
> think we'd still be better off using
>
> bits = flsl(pdx_to_pfn((1UL <<
> (sizeof(frame_table->v.inuse._domain) * 8)) -
> 1)) + PAGE_SHIFT;
>
> If one would log the value of bits, the result would then also be less
> confusing in (at least) the mask-compression scheme.
Is the above correct tough?
Take for example the hypothetical case where pdx_to_pfn() returns
0x10. Then flsl() will return 5 (let's leave the PAGE_SHIFT
adjustment out for the example here). The allocation bit width would
be off-by-one, because allocating using a bit width of 5 would also
allow 0x11 to be allocated, and that won't be correct.
I think we need to get the bit width of the next pdx (so the
non-inclusive end of the range), and then subtract 1 from it,
otherwise the allocation bit width is possibly off-by-one.
Thanks, Roger.
next prev parent reply other threads:[~2025-06-12 10:46 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-11 17:16 [PATCH 0/8] pdx: introduce a new compression algorithm Roger Pau Monne
2025-06-11 17:16 ` [PATCH 1/8] x86/pdx: simplify calculation of domain struct allocation boundary Roger Pau Monne
2025-06-11 17:58 ` Andrew Cooper
2025-06-12 6:57 ` Roger Pau Monné
2025-06-12 9:03 ` Jan Beulich
2025-06-12 10:46 ` Roger Pau Monné [this message]
2025-06-12 12:00 ` Jan Beulich
2025-06-11 17:16 ` [PATCH 2/8] pdx: introduce function to calculate max PFN based on PDX compression Roger Pau Monne
2025-06-12 9:11 ` Jan Beulich
2025-06-12 10:48 ` Roger Pau Monné
2025-06-12 12:02 ` Jan Beulich
2025-06-11 17:16 ` [PATCH 3/8] kconfig: turn PDX compression into a choice Roger Pau Monne
2025-06-12 8:28 ` Jan Beulich
2025-06-11 17:16 ` [PATCH 4/8] pdx: provide a unified set of unit functions Roger Pau Monne
2025-06-12 8:32 ` Jan Beulich
2025-06-12 10:50 ` Roger Pau Monné
2025-06-12 8:36 ` Jan Beulich
2025-06-12 10:51 ` Roger Pau Monné
2025-06-12 12:03 ` Jan Beulich
2025-06-11 17:16 ` [PATCH 5/8] pdx: allow optimizing PDX conversion helpers Roger Pau Monne
2025-06-11 17:16 ` [PATCH 6/8] pdx: introduce a new compression algorithm based on offsets between regions Roger Pau Monne
2025-06-11 19:33 ` Andrew Cooper
2025-06-12 7:26 ` Roger Pau Monné
2025-06-12 7:59 ` Roger Pau Monné
2025-06-12 8:27 ` Jan Beulich
2025-06-12 14:03 ` Roger Pau Monné
2025-06-16 7:50 ` Jan Beulich
2025-06-18 13:02 ` Jan Beulich
2025-06-18 14:11 ` Roger Pau Monné
2025-06-11 17:16 ` [PATCH 7/8] pdx: introduce translation helpers for offset compression Roger Pau Monne
2025-06-11 17:16 ` [PATCH 8/8] pdx: introduce a command line option " Roger Pau Monne
2025-06-17 7:09 ` Oleksii Kurochko
2025-06-18 13:36 ` Jan Beulich
2025-06-18 14:12 ` Roger Pau Monné
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=aEqwDZc8u8FFW2Al@macbook.local \
--to=roger.pau@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=xen-devel@lists.xenproject.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.