|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v1 02/13] xen/arm: introduce a special domain DOMID_SHARED
Hi Stefano
> -----Original Message-----
> From: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> Sent: Friday, March 18, 2022 9:59 AM
> To: Penny Zheng <Penny.Zheng@xxxxxxx>
> Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx; nd <nd@xxxxxxx>; Penny Zheng
> <penzhe01@xxxxxxxxxxxxxxxxxxxxxxxx>; Stefano Stabellini
> <sstabellini@xxxxxxxxxx>; Julien Grall <julien@xxxxxxx>; Bertrand Marquis
> <Bertrand.Marquis@xxxxxxx>; Volodymyr Babchuk
> <Volodymyr_Babchuk@xxxxxxxx>; Andrew Cooper
> <andrew.cooper3@xxxxxxxxxx>; George Dunlap <george.dunlap@xxxxxxxxxx>;
> Jan Beulich <jbeulich@xxxxxxxx>; Wei Liu <wl@xxxxxxx>
> Subject: Re: [PATCH v1 02/13] xen/arm: introduce a special domain
> DOMID_SHARED
>
> On Fri, 11 Mar 2022, Penny Zheng wrote:
> > From: Penny Zheng <penzhe01@xxxxxxxxxxxxxxxxxxxxxxxx>
> >
> > In case to own statically shared pages when owner domain is not
> > explicitly defined, this commits propose a special domain
> > DOMID_SHARED, and we assign it 0x7FF5, as one of the system domains.
> >
> > Statically shared memory reuses the same way of initialization with
> > static memory, hence this commits proposes a new Kconfig
> > CONFIG_STATIC_SHM to wrap related codes, and this option depends on
> static memory(CONFIG_STATIC_MEMORY).
>
> Why does it depend on CONFIG_STATIC_MEMORY? This is a genuine question,
> I am not trying to scope-creep the series. Is there an actual technical
> dependency on CONFIG_STATIC_MEMORY? If not, it would be super useful to
> be able to share memory statically even between normal dom0less guests (of
> course it would be responsibility of the user to provide the right addresses
> and
> avoid mapping clashes.) I know that some of our users have requested this
> feature in the past.
>
I may find a proper way to rephrase here. My poor English writing skill...
When I implemented domain on static allocation, statically configured guest RAM
is
treated as static memory in Xen and I introduced a few helpers to
initialize/allocate/free
static memory, like acquire_staticmem_pages, etc, and all these helpers are
guarded with
CONFIG_STATIC_MEMORY.
I want to reuse these helpers on static shared memory, so CONFIG_STATIC_SHM
depends
on CONFIG_STATIC_MEMORY.
So I'm not restricting sharing static memory between domain on static
allocation, current
Implementation is also useful to normal dom0less guests.
>
> > We intends to do shared domain creation after setup_virt_paging so
> > shared domain could successfully do p2m initialization.
> >
> > Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> > ---
> > xen/arch/arm/Kconfig | 7 +++++++
> > xen/arch/arm/domain.c | 12 ++++++++++--
> > xen/arch/arm/include/asm/domain.h | 6 ++++++
> > xen/arch/arm/setup.c | 22 ++++++++++++++++++++++
> > xen/common/domain.c | 11 +++++++----
> > xen/common/page_alloc.c | 5 +++++
> > xen/common/vsprintf.c | 9 +++++----
> > xen/include/public/xen.h | 6 ++++++
> > xen/include/xen/sched.h | 2 ++
> > 9 files changed, 70 insertions(+), 10 deletions(-)
> >
> > diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig index
> > ecfa6822e4..c54accefb1 100644
> > --- a/xen/arch/arm/Kconfig
> > +++ b/xen/arch/arm/Kconfig
> > @@ -106,6 +106,13 @@ config TEE
> >
> > source "arch/arm/tee/Kconfig"
> >
> > +config STATIC_SHM
> > + bool "Statically shared memory on a dom0less system" if UNSUPPORTED
> > + depends on STATIC_MEMORY
> > + default n
> > + help
> > + This option enables statically shared memory on a dom0less system.
> > +
> > endmenu
> >
> > menu "ARM errata workaround via the alternative framework"
> > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index
> > 8110c1df86..1ff1df5d3f 100644
> > --- a/xen/arch/arm/domain.c
> > +++ b/xen/arch/arm/domain.c
> > @@ -44,6 +44,10 @@
> >
> > DEFINE_PER_CPU(struct vcpu *, curr_vcpu);
> >
> > +#ifdef CONFIG_STATIC_SHM
> > +struct domain *__read_mostly dom_shared; #endif
>
> This one should probably go to xen/common/domain.c to stay close to the
> other special domains.
>
Ack. Thx
>
> > static void do_idle(void)
> > {
> > unsigned int cpu = smp_processor_id(); @@ -703,7 +707,7 @@ int
> > arch_domain_create(struct domain *d,
> > if ( is_idle_domain(d) )
> > return 0;
> >
> > - ASSERT(config != NULL);
> > + ASSERT(is_shared_domain(d) ? config == NULL : config != NULL);
> >
> > #ifdef CONFIG_IOREQ_SERVER
> > ioreq_domain_init(d);
> > @@ -712,12 +716,16 @@ int arch_domain_create(struct domain *d,
> > d->arch.directmap = flags & CDF_directmap;
> >
> > /* p2m_init relies on some value initialized by the IOMMU subsystem */
> > - if ( (rc = iommu_domain_init(d, config->iommu_opts)) != 0 )
> > + if ( (rc = iommu_domain_init(d, is_shared_domain(d) ? 0 :
> > + config->iommu_opts)) != 0 )
> > goto fail;
> >
> > if ( (rc = p2m_init(d)) != 0 )
> > goto fail;
> >
> > + /* DOMID_shared is sufficiently constructed after p2m initialization.
> > */
> > + if ( is_shared_domain(d) )
> > + return 0;
> > +
> > rc = -ENOMEM;
> > if ( (d->shared_info = alloc_xenheap_pages(0, 0)) == NULL )
> > goto fail;
> > diff --git a/xen/arch/arm/include/asm/domain.h
> > b/xen/arch/arm/include/asm/domain.h
> > index c56f6e4398..ea7a7219a3 100644
> > --- a/xen/arch/arm/include/asm/domain.h
> > +++ b/xen/arch/arm/include/asm/domain.h
> > @@ -31,6 +31,12 @@ enum domain_type {
> >
> > #define is_domain_direct_mapped(d) (d)->arch.directmap
> >
> > +#ifdef CONFIG_STATIC_SHM
> > +extern struct domain *dom_shared;
> > +#else
> > +#define dom_shared NULL
> > +#endif
>
> I think this should probably go to xen/include/xen/mm.h to stay close to the
> others (dom_xen, dom_io and dom_cow).
>
Ack, thx
>
> > /*
> > * Is the domain using the host memory layout?
> > *
> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index
> > d5d0792ed4..f6a3b04958 100644
> > --- a/xen/arch/arm/setup.c
> > +++ b/xen/arch/arm/setup.c
> > @@ -855,6 +855,20 @@ static bool __init is_dom0less_mode(void)
> > return ( !dom0found && domUfound ); }
> >
> > +#ifdef CONFIG_STATIC_SHM
> > +static void __init setup_shared_domain(void) {
> > + /*
> > + * Initialise our DOMID_SHARED domain.
> > + * This domain owns statically shared pages when owner domain is not
> > + * explicitly defined.
> > + */
> > + dom_shared = domain_create(DOMID_SHARED, NULL, CDF_directmap);
> > + if ( IS_ERR(dom_shared) )
> > + panic("Failed to create d[SHARED]: %ld\n",
> > +PTR_ERR(dom_shared)); } #endif
> > +
> > size_t __read_mostly dcache_line_bytes;
> >
> > /* C entry point for boot CPU */
> > @@ -1022,6 +1036,14 @@ void __init start_xen(unsigned long
> boot_phys_offset,
> > apply_alternatives_all();
> > enable_errata_workarounds();
> >
> > +#ifdef CONFIG_STATIC_SHM
> > + /*
> > + * This needs to be called **after** setup_virt_paging so shared
> > + * domains could successfully do p2m initialization.
> ^ domain
>
> I take you are talking about DOMID_SHARED rather than any domain sharing
> memory statically. Maybe it clearer if you say "so DOMID_SHARED could
> successfully do p2m initialization".
>
Ack, thx.
>
> > + */
> > + setup_shared_domain();
> > +#endif
> > +
> > /* Create initial domain 0. */
> > if ( !is_dom0less_mode() )
> > create_dom0();
> > diff --git a/xen/common/domain.c b/xen/common/domain.c index
> > 3742322d22..5cdd0b9f5b 100644
> > --- a/xen/common/domain.c
> > +++ b/xen/common/domain.c
> > @@ -643,11 +643,14 @@ struct domain *domain_create(domid_t domid,
> >
> > rangeset_domain_initialise(d);
> >
> > - /* DOMID_{XEN,IO,etc} (other than IDLE) are sufficiently constructed.
> > */
> > - if ( is_system_domain(d) && !is_idle_domain(d) )
> > + /*
> > + * DOMID_{XEN,IO,etc} (other than IDLE and DOMID_shared) are
> > + * sufficiently constructed.
> > + */
> > + if ( is_system_domain(d) && !is_idle_domain(d) &&
> > + !is_shared_domain(d) )
> > return d;
> >
> > - if ( !is_idle_domain(d) )
> > + if ( !is_idle_domain(d) && !is_shared_domain(d) )
> > {
> > if ( !is_hardware_domain(d) )
> > d->nr_pirqs = nr_static_irqs + extra_domU_irqs; @@ -663,7
> > +666,7 @@ struct domain *domain_create(domid_t domid,
> > goto fail;
> > init_status |= INIT_arch;
> >
> > - if ( !is_idle_domain(d) )
> > + if ( !is_idle_domain(d) && !is_shared_domain(d) )
> > {
> > watchdog_domain_init(d);
> > init_status |= INIT_watchdog; diff --git
> > a/xen/common/page_alloc.c b/xen/common/page_alloc.c index
> > f8749b0787..e5e357969d 100644
> > --- a/xen/common/page_alloc.c
> > +++ b/xen/common/page_alloc.c
> > @@ -2616,6 +2616,11 @@ struct domain *get_pg_owner(domid_t domid)
> >
> > switch ( domid )
> > {
> > +#ifdef CONFIG_STATIC_SHM
> > + case DOMID_SHARED:
> > + pg_owner = rcu_lock_domain(dom_shared);
> > + break;
> > +#endif
> > case DOMID_IO:
> > pg_owner = rcu_lock_domain(dom_io);
> > break;
> > diff --git a/xen/common/vsprintf.c b/xen/common/vsprintf.c index
> > b278961cc3..a22854001b 100644
> > --- a/xen/common/vsprintf.c
> > +++ b/xen/common/vsprintf.c
> > @@ -359,10 +359,11 @@ static char *print_domain(char *str, const char
> > *end, const struct domain *d)
> >
> > switch ( d->domain_id )
> > {
> > - case DOMID_IO: name = "[IO]"; break;
> > - case DOMID_XEN: name = "[XEN]"; break;
> > - case DOMID_COW: name = "[COW]"; break;
> > - case DOMID_IDLE: name = "[IDLE]"; break;
> > + case DOMID_IO: name = "[IO]"; break;
> > + case DOMID_XEN: name = "[XEN]"; break;
> > + case DOMID_COW: name = "[COW]"; break;
> > + case DOMID_IDLE: name = "[IDLE]"; break;
> > + case DOMID_SHARED: name = "[SHARED]"; break;
> > /*
> > * In principle, we could ASSERT_UNREACHABLE() in the default case.
> > * However, this path is used to print out crash information,
> > which diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
> > index e373592c33..2e00741f09 100644
> > --- a/xen/include/public/xen.h
> > +++ b/xen/include/public/xen.h
> > @@ -612,6 +612,12 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
> > /* DOMID_INVALID is used to identify pages with unknown owner. */
> > #define DOMID_INVALID xen_mk_uint(0x7FF4)
> >
> > +/*
> > + * DOMID_SHARED is used as the owner of statically shared pages, when
> > + * owner is not explicitly defined.
> > + */
> > +#define DOMID_SHARED xen_mk_uint(0x7FF5)
> > +
> > /* Idle domain. */
> > #define DOMID_IDLE xen_mk_uint(0x7FFF)
> >
> > diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index
> > 24a9a87f83..2fb236f4ea 100644
> > --- a/xen/include/xen/sched.h
> > +++ b/xen/include/xen/sched.h
> > @@ -618,6 +618,8 @@ static inline bool is_system_domain(const struct
> domain *d)
> > return d->domain_id >= DOMID_FIRST_RESERVED; }
> >
> > +#define is_shared_domain(d) ((d)->domain_id == DOMID_SHARED)
> > +
> > #define DOMAIN_DESTROYED (1u << 31) /* assumes atomic_t is >= 32 bits
> > */ #define put_domain(_d) \
> > if ( atomic_dec_and_test(&(_d)->refcnt) ) domain_destroy(_d)
> > --
> > 2.25.1
> >
Cheers,
---
Penny Zheng
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |