|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 5/5] xen/arm: Support ARM standard PV time for domains created via toolstack
On Mon, Jul 07, 2025 at 10:01:47AM +0200, Jan Beulich wrote:
> On 05.07.2025 16:27, Koichiro Den wrote:
> > --- a/xen/arch/arm/mm.c
> > +++ b/xen/arch/arm/mm.c
> > @@ -180,7 +180,21 @@ int xenmem_add_to_physmap_one(
> > case XENMAPSPACE_dev_mmio:
> > rc = map_dev_mmio_page(d, gfn, _mfn(idx));
> > return rc;
> > + case XENMAPSPACE_pv_time:
> > +#ifdef CONFIG_ARM_64
>
> These two lines want to change places, I think.
Will fix it, thank you.
>
> > + ASSERT(IS_POWER_OF_TWO(sizeof(struct pv_time_region)));
>
> BUILD_BUG_ON() please, so that an issue here can be spotted at build time
> rather than only at runtime.
>
> > + if ( idx >= DIV_ROUND_UP(d->max_vcpus * sizeof(struct
> > pv_time_region),
> > + PAGE_SIZE) )
> > + return -EINVAL;
> > +
> > + if ( idx == 0 )
> > + d->arch.pv_time_regions_gfn = gfn;
>
> This looks fragile, as it'll break once d->max_vcpus can grow large enough to
> permit a non-zero idx by way of the earlier if() falling through. Imo you'll
> need at least one further BUILD_BUG_ON() here.
get_pv_region() can legitimately call xc_domain_add_to_physmap(..,
XENMAPSPACE_pv_time, ..) with idx > 0, but only if the preceding call with
idx == 0 succeeded. So while this may look odd at first glance, I think
this is not broken. What do you think?
>
> >
> > + mfn = virt_to_mfn(d->arch.pv_time_regions[idx]);
> > + t = p2m_ram_ro;
>
> Is this the correct type to use here? That is, do you really mean guest write
> attempts to be silently dropped, rather than being reported to the guest as a
> fault? Then again I can't see such behavior being implemented on Arm, despite
> the comment on the enumerator saying so (likely inherited from x86).
No I didn't intend the "silently drop" behavior. IIUC, we may as well
correct the comment on the enum for Arm:
diff --git a/xen/arch/arm/include/asm/p2m.h b/xen/arch/arm/include/asm/p2m.h
index 2d53bf9b6177..927c588dbcb0 100644
--- a/xen/arch/arm/include/asm/p2m.h
+++ b/xen/arch/arm/include/asm/p2m.h
@@ -123,7 +123,7 @@ struct p2m_domain {
typedef enum {
p2m_invalid = 0, /* Nothing mapped here */
p2m_ram_rw, /* Normal read/write guest RAM */
- p2m_ram_ro, /* Read-only; writes are silently dropped */
+ p2m_ram_ro, /* Read-only */
>
> > + break;
> > +#endif
> > default:
> > return -ENOSYS;
> > }
>
> As to style: Please, rather than absorbing the blank line that was there, make
> sure non-fall-through case blocks are separated from adjacent ones by a blank
> line.
Will do so in the next take.
>
> > --- a/xen/include/public/memory.h
> > +++ b/xen/include/public/memory.h
> > @@ -217,6 +217,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t);
> > Stage-2 using the Normal Memory
> > Inner/Outer Write-Back Cacheable
> > memory attribute. */
> > +#define XENMAPSPACE_pv_time 6 /* PV time shared region (ARM64 only) */
>
> The comment isn't specific enough. As per the struct declaration in patch 4,
> this interface is solely about stolen time. There's a wider PV interface,
> which at least x86 Linux also uses, and which has been adopted by KVM as
> well iirc. Hence this new type wants to clarify what exactly it's used for
> right now, while leaving open other uses on other architectures.
That sounds reasonable, I'll update it in the next iteration.
Thanks for the review.
-Koichiro
>
> Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |