From: Oleksii Kurochko <oleksii.kurochko@gmail.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Alistair Francis" <alistair.francis@wdc.com>,
"Bob Eshleman" <bobbyeshleman@gmail.com>,
"Connor Davis" <connojdavis@gmail.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Anthony PERARD" <anthony.perard@vates.tech>,
"Michal Orzel" <michal.orzel@amd.com>,
"Julien Grall" <julien@xen.org>,
"Roger Pau Monné" <roger.pau@citrix.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
xen-devel@lists.xenproject.org
Subject: Re: [for 4.22 v5 18/18] xen/riscv: introduce metadata table to store P2M type
Date: Fri, 21 Nov 2025 10:37:52 +0100 [thread overview]
Message-ID: <60fc80c8-0f7b-41e4-8e38-e7ca915ec9bf@gmail.com> (raw)
In-Reply-To: <a1fc8b4b-735e-4f5d-a015-318b3e1f3550@suse.com>
[-- Attachment #1: Type: text/plain, Size: 5006 bytes --]
On 11/21/25 8:35 AM, Jan Beulich wrote:
> On 20.11.2025 17:52, Oleksii Kurochko wrote:
>> On 11/20/25 4:47 PM, Jan Beulich wrote:
>>> On 20.11.2025 16:38, Oleksii Kurochko wrote:
>>>> On 11/18/25 7:58 AM, Jan Beulich wrote:
>>>>> On 17.11.2025 20:51, Oleksii Kurochko wrote:
>>>>>> On 11/12/25 12:49 PM, Jan Beulich wrote:
>>>>>>> On 20.10.2025 17:58, Oleksii Kurochko wrote:
>>>>>>>> + if ( *md_pg )
>>>>>>>> + metadata = __map_domain_page(*md_pg);
>>>>>>>> +
>>>>>>>> + if ( t < p2m_first_external )
>>>>>>>> + {
>>>>>>>> pte->pte |= MASK_INSR(t, P2M_TYPE_PTE_BITS_MASK);
>>>>>>>> - return rc;
>>>>>>>> + if ( metadata )
>>>>>>>> + metadata[ctx->index].pte = p2m_invalid;
>>>>>>> Shouldn't this be accompanied with a BUILD_BUG_ON(p2m_invalid), as otherwise
>>>>>>> p2m_alloc_page()'s clearing of the page won't have the intended effect?
>>>>>> I think that, at least, at the moment we are always explicitly set p2m type and
>>>>>> do not rely on that by default 0==p2m_invalid.
>>>>> You don't, and ...
>>>>>
>>>>>> Just to be safe, I will add after "if ( metadata )" suggested
>>>>>> BUILD_BUG_ON(p2m_invalid):
>>>>>> if ( metadata )
>>>>>> metadata[ctx->index].type = p2m_invalid;
>>>>>> /*
>>>>>> * metadata.type is expected to be p2m_invalid (0) after the page is
>>>>>> * allocated and zero-initialized in p2m_alloc_page().
>>>>>> */
>>>>>> BUILD_BUG_ON(p2m_invalid);
>>>>>> ...
>>>>> ... this leaves me with the impression that you didn't read my reply correctly.
>>>>> p2m_alloc_page() clear the page, thus_implicitly_ setting all entries to
>>>>> p2m_invalid. That's where the BUILD_BUG_ON() would want to go (the call site,
>>>>> ftaod).
>>>> I think I still don’t fully understand what the issue would be if|p2m_invalid| were
>>>> ever equal to 1 instead of 0 in the context of a metadata page.
>>>>
>>>> Yes, if|p2m_invalid| were 1, there would be a problem if someone tried to read this
>>>> metadata pagebefore it was assigned any type. They would find a value of 0, which
>>>> corresponds to a valid type rather than to|p2m_invalid|, as one might expect.
>>>> However, I’m not sure I currently see a scenario in which the metadata page would
>>>> be read before being initialized.
>>> Are you sure walks can only happen for GFNs that were set up? What you need to
>>> do walks on is under guest control, after all.
>> If a GFN lies within the range[p2m->lowest_mapped_gfn, p2m->max_mapped_gfn], then
>> |p2m_set_entry()| must already have been called for this GFN.
> No. All you know from the pre-condition is that p2m_set_entry() was called for the
> lowest and highest GFNs in that range.
>
Oh, right. There could still be some GFNs inside the range for which|p2m_set_entry()| has
not yet been called. Then it probably makes sense to add a|BUILD_BUG_ON| here as well, before
"if ( type == p2m_ext_storage )":
static p2m_type_t p2m_get_type(const pte_t pte, const struct p2m_pte_ctx *ctx)
{
p2m_type_t type = MASK_EXTR(pte.pte, P2M_TYPE_PTE_BITS_MASK);
if ( type == p2m_ext_storage )
{
const pte_t *md = __map_domain_page(ctx->pt_page->v.md.pg);
type = md[ctx->index].pte;
unmap_domain_page(md);
}
return type;
}
I would expect that if|p2m_set_entry()| has not been called for a GFN, then|p2m_get_entry()|
(|p2m_get_type()| will be called somewhere inside|p2m_get_entry()|, for example) should return
the|p2m_invalid| type. I think we want to have the same check (as the one before the call to
|p2m_alloc_page()|), placed before the condition:
BUILD_BUG_ON(p2m_invalid);
~ Oleksii
>
>> This means that either
>> - a metadata page has been created and its entry filled with the appropriate type, or
>> - no metadata page was needed and the type was stored directly in|pte->pte|
>>
>> For a GFN outside the range(p2m->lowest_mapped_gfn, p2m->max_mapped_gfn),
>> |p2m_get_entry()| will not even attempt a walk because of the boundary checks:
>> static mfn_t p2m_get_entry(struct p2m_domain *p2m, gfn_t gfn,
>> p2m_type_t *t,
>> unsigned int *page_order)
>> ...
>> if ( check_outside_boundary(p2m, gfn, p2m->lowest_mapped_gfn, true,
>> &level) )
>> goto out;
>>
>> if ( check_outside_boundary(p2m, gfn, p2m->max_mapped_gfn, false, &level) )
>> goto out;
>>
>> If I am misunderstanding something and there are other cases where a walk can occur for
>> GFNs that were never set up, then such GFNs would have neither an allocated metadata
>> page nor a type stored in|pte->pte|, which looks like we are in trouble.
>>
>> ~ Oleksii
>>
[-- Attachment #2: Type: text/html, Size: 7103 bytes --]
prev parent reply other threads:[~2025-11-21 9:38 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-20 15:57 [for 4.22 v5 00/18] xen/riscv: introduce p2m functionality Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 01/18] xen/riscv: detect and initialize G-stage mode Oleksii Kurochko
2025-11-06 13:43 ` Jan Beulich
2025-11-13 16:18 ` Oleksii Kurochko
2025-11-13 16:32 ` Jan Beulich
2025-11-18 8:56 ` Oleksii Kurochko
2025-11-18 9:05 ` Jan Beulich
2025-10-20 15:57 ` [for 4.22 v5 02/18] xen/riscv: introduce VMID allocation and manegement Oleksii Kurochko
2025-11-06 14:05 ` Jan Beulich
2025-11-14 9:27 ` Oleksii Kurochko
2025-11-17 8:35 ` Jan Beulich
2025-10-20 15:57 ` [for 4.22 v5 03/18] xen/riscv: introduce things necessary for p2m initialization Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 04/18] xen/riscv: construct the P2M pages pool for guests Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 05/18] xen/riscv: add root page table allocation Oleksii Kurochko
2025-11-06 14:25 ` Jan Beulich
2025-11-14 10:53 ` Oleksii Kurochko
2025-11-17 8:43 ` Jan Beulich
2025-10-20 15:57 ` [for 4.22 v5 06/18] xen/riscv: introduce pte_{set,get}_mfn() Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 07/18] xen/riscv: add new p2m types and helper macros for type classification Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 08/18] xen/dom0less: abstract Arm-specific p2m type name for device MMIO mappings Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 09/18] xen/riscv: implement function to map memory in guest p2m Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 10/18] xen/riscv: implement p2m_set_range() Oleksii Kurochko
2025-11-10 14:53 ` Jan Beulich
2025-11-10 14:53 ` Jan Beulich
2025-11-14 17:04 ` Oleksii Kurochko
2025-11-17 8:56 ` Jan Beulich
2025-11-18 15:28 ` Oleksii Kurochko
2025-11-18 16:30 ` Jan Beulich
2025-10-20 15:57 ` [for 4.22 v5 11/18] xen/riscv: Implement p2m_free_subtree() and related helpers Oleksii Kurochko
2025-11-10 15:29 ` Jan Beulich
2025-11-17 11:36 ` Oleksii Kurochko
2025-11-17 14:22 ` Jan Beulich
2025-10-20 15:57 ` [for 4.22 v5 12/18] xen/riscv: Implement p2m_pte_from_mfn() and support PBMT configuration Oleksii Kurochko
2025-11-10 16:22 ` Jan Beulich
2025-11-17 12:12 ` Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 13/18] xen/riscv: implement p2m_next_level() Oleksii Kurochko
2025-11-10 16:25 ` Jan Beulich
2025-10-20 15:57 ` [for 4.22 v5 14/18] xen/riscv: Implement superpage splitting for p2m mappings Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 15/18] xen/riscv: implement put_page() Oleksii Kurochko
2025-10-20 15:57 ` [for 4.22 v5 16/18] xen/riscv: implement mfn_valid() and page reference, ownership handling helpers Oleksii Kurochko
2025-10-20 15:58 ` [for 4.22 v5 17/18] xen/riscv: add support of page lookup by GFN Oleksii Kurochko
2025-11-10 16:46 ` Jan Beulich
2025-11-17 15:52 ` Oleksii Kurochko
2025-11-17 16:00 ` Jan Beulich
2025-11-19 17:11 ` Oleksii Kurochko
2025-10-20 15:58 ` [for 4.22 v5 18/18] xen/riscv: introduce metadata table to store P2M type Oleksii Kurochko
2025-11-12 11:49 ` Jan Beulich
2025-11-17 19:51 ` Oleksii Kurochko
2025-11-18 6:58 ` Jan Beulich
2025-11-20 15:38 ` Oleksii Kurochko
2025-11-20 15:47 ` Jan Beulich
2025-11-20 16:52 ` Oleksii Kurochko
2025-11-21 7:35 ` Jan Beulich
2025-11-21 9:37 ` Oleksii Kurochko [this message]
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=60fc80c8-0f7b-41e4-8e38-e7ca915ec9bf@gmail.com \
--to=oleksii.kurochko@gmail.com \
--cc=alistair.francis@wdc.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=bobbyeshleman@gmail.com \
--cc=connojdavis@gmail.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--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.