[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 02/13] xen/arm: introduce a special domain DOMID_SHARED
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). 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 + 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 + /* * 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. + */ + 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |