|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1] xen: move alloc/free_vcpu_struct() to common code
alloc_vcpu_struct() and free_vcpu_struct() contain little architecture-specific logic and are suitable for sharing across architectures. Move both helpers to common code. To support the remaining architectural differences, introduce arch_vcpu_struct_memflags(), allowing architectures to override the memory flags passed to alloc_xenheap_pages(). This is currently needed by x86, which may require MEMF_bits(32) for HVM guests using shadow paging. Move the definition of MAX_PAGES_PER_VCPU to xen/domain.h and default it to 1. Retain the ARM64 exception (with CONFIG_NEW_VGIC) where two pages are required due to larger per-IRQ structures. The ARM implementation of alloc/free_vcpu_struct() is removed and replaced by the common version. Stub implementations are also dropped from PPC and RISC-V. Finally, make alloc_vcpu_struct() and free_vcpu_struct() static to common/domain.c, as they are no longer used outside common code. No functional changes. Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> --- CI tests: https://gitlab.com/xen-project/people/olkur/xen/-/pipelines/2219693055 Shouldn't we make alloc_domain_struct() and free_domain_struct() static and drop their declarations from xen/domain.h, since these functions are only used in common/domain.c? --- xen/arch/arm/domain.c | 32 ------------------------------- xen/arch/arm/include/asm/domain.h | 8 ++++++++ xen/arch/ppc/stubs.c | 10 ---------- xen/arch/riscv/stubs.c | 10 ---------- xen/arch/x86/domain.c | 23 ++-------------------- xen/arch/x86/include/asm/domain.h | 3 +++ xen/common/domain.c | 27 ++++++++++++++++++++++++++ xen/include/xen/domain.h | 8 ++++---- 8 files changed, 44 insertions(+), 77 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 47973f99d9..507df807ed 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -473,38 +473,6 @@ void dump_pageframe_info(struct domain *d) } -/* - * The new VGIC has a bigger per-IRQ structure, so we need more than one - * page on ARM64. Cowardly increase the limit in this case. - */ -#if defined(CONFIG_NEW_VGIC) && defined(CONFIG_ARM_64) -#define MAX_PAGES_PER_VCPU 2 -#else -#define MAX_PAGES_PER_VCPU 1 -#endif - -struct vcpu *alloc_vcpu_struct(const struct domain *d) -{ - struct vcpu *v; - - BUILD_BUG_ON(sizeof(*v) > MAX_PAGES_PER_VCPU * PAGE_SIZE); - v = alloc_xenheap_pages(get_order_from_bytes(sizeof(*v)), 0); - if ( v != NULL ) - { - unsigned int i; - - for ( i = 0; i < DIV_ROUND_UP(sizeof(*v), PAGE_SIZE); i++ ) - clear_page((void *)v + i * PAGE_SIZE); - } - - return v; -} - -void free_vcpu_struct(struct vcpu *v) -{ - free_xenheap_pages(v, get_order_from_bytes(sizeof(*v))); -} - int arch_vcpu_create(struct vcpu *v) { int rc = 0; diff --git a/xen/arch/arm/include/asm/domain.h b/xen/arch/arm/include/asm/domain.h index 758ad807e4..f33d886bb8 100644 --- a/xen/arch/arm/include/asm/domain.h +++ b/xen/arch/arm/include/asm/domain.h @@ -12,6 +12,14 @@ #include <asm/vpl011.h> #include <public/hvm/params.h> +/* + * The new VGIC has a bigger per-IRQ structure, so we need more than one + * page on ARM64. Cowardly increase the limit in this case. + */ +#if defined(CONFIG_NEW_VGIC) && defined(CONFIG_ARM_64) +#define MAX_PAGES_PER_VCPU 2 +#endif + struct hvm_domain { uint64_t params[HVM_NR_PARAMS]; diff --git a/xen/arch/ppc/stubs.c b/xen/arch/ppc/stubs.c index 9953ea1c6c..f7f6e7ed97 100644 --- a/xen/arch/ppc/stubs.c +++ b/xen/arch/ppc/stubs.c @@ -152,11 +152,6 @@ void dump_pageframe_info(struct domain *d) BUG_ON("unimplemented"); } -void free_vcpu_struct(struct vcpu *v) -{ - BUG_ON("unimplemented"); -} - int arch_vcpu_create(struct vcpu *v) { BUG_ON("unimplemented"); @@ -264,11 +259,6 @@ void vcpu_kick(struct vcpu *v) BUG_ON("unimplemented"); } -struct vcpu *alloc_vcpu_struct(const struct domain *d) -{ - BUG_ON("unimplemented"); -} - unsigned long hypercall_create_continuation(unsigned int op, const char *format, ...) { diff --git a/xen/arch/riscv/stubs.c b/xen/arch/riscv/stubs.c index fe7d85ee1d..579c4215c8 100644 --- a/xen/arch/riscv/stubs.c +++ b/xen/arch/riscv/stubs.c @@ -126,11 +126,6 @@ void dump_pageframe_info(struct domain *d) BUG_ON("unimplemented"); } -void free_vcpu_struct(struct vcpu *v) -{ - BUG_ON("unimplemented"); -} - int arch_vcpu_create(struct vcpu *v) { BUG_ON("unimplemented"); @@ -238,11 +233,6 @@ void vcpu_kick(struct vcpu *v) BUG_ON("unimplemented"); } -struct vcpu *alloc_vcpu_struct(const struct domain *d) -{ - BUG_ON("unimplemented"); -} - unsigned long hypercall_create_continuation(unsigned int op, const char *format, ...) { diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 7632d5e2d6..0e3f7de524 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -493,28 +493,9 @@ unsigned int arch_domain_struct_memflags(void) return MEMF_bits(bits); } -struct vcpu *alloc_vcpu_struct(const struct domain *d) +unsigned int arch_vcpu_struct_memflags(const struct domain *d) { - struct vcpu *v; - /* - * This structure contains embedded PAE PDPTEs, used when an HVM guest - * runs on shadow pagetables outside of 64-bit mode. In this case the CPU - * may require that the shadow CR3 points below 4GB, and hence the whole - * structure must satisfy this restriction. Thus we specify MEMF_bits(32). - */ - unsigned int memflags = - (is_hvm_domain(d) && paging_mode_shadow(d)) ? MEMF_bits(32) : 0; - - BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE); - v = alloc_xenheap_pages(0, memflags); - if ( v != NULL ) - clear_page(v); - return v; -} - -void free_vcpu_struct(struct vcpu *v) -{ - free_xenheap_page(v); + return (is_hvm_domain(d) && paging_mode_shadow(d)) ? MEMF_bits(32) : 0; } /* Initialise various registers to their architectural INIT/RESET state. */ diff --git a/xen/arch/x86/include/asm/domain.h b/xen/arch/x86/include/asm/domain.h index 7e5cbd11a4..576f9202b4 100644 --- a/xen/arch/x86/include/asm/domain.h +++ b/xen/arch/x86/include/asm/domain.h @@ -15,6 +15,9 @@ unsigned int arch_domain_struct_memflags(void); #define arch_domain_struct_memflags arch_domain_struct_memflags +unsigned int arch_vcpu_struct_memflags(const struct domain *d); +#define arch_vcpu_struct_memflags arch_vcpu_struct_memflags + #define has_32bit_shinfo(d) ((d)->arch.has_32bit_shinfo) /* diff --git a/xen/common/domain.c b/xen/common/domain.c index 93c71bc766..3982d9e466 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -13,6 +13,7 @@ #include <xen/sched.h> #include <xen/sections.h> #include <xen/domain.h> +#include <xen/macros.h> #include <xen/mm.h> #include <xen/event.h> #include <xen/vm_event.h> @@ -392,6 +393,32 @@ static int vcpu_teardown(struct vcpu *v) return 0; } +static struct vcpu *alloc_vcpu_struct(const struct domain *d) +{ +#ifndef arch_vcpu_struct_memflags +# define arch_vcpu_struct_memflags(d) 0 +#endif + struct vcpu *v; + unsigned int order = get_order_from_bytes(sizeof(*v)); + + BUILD_BUG_ON(sizeof(*v) > MAX_PAGES_PER_VCPU * PAGE_SIZE); + v = alloc_xenheap_pages(order, arch_vcpu_struct_memflags(d)); + if ( v ) + { + unsigned int i; + + for ( i = 0; i < DIV_ROUND_UP(sizeof(*v), PAGE_SIZE); i++ ) + clear_page((void *)v + i * PAGE_SIZE); + } + + return v; +} + +static void free_vcpu_struct(struct vcpu *v) +{ + free_xenheap_pages(v, get_order_from_bytes(sizeof(*v))); +} + /* * Destoy a vcpu once all references to it have been dropped. Used either * from domain_destroy()'s RCU path, or from the vcpu_create() error path diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h index 8aab05ae93..3946ec9dad 100644 --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -15,6 +15,10 @@ struct guest_area { #include <asm/domain.h> +#ifndef MAX_PAGES_PER_VCPU +#define MAX_PAGES_PER_VCPU 1 +#endif + typedef union { struct vcpu_guest_context *nat; struct compat_vcpu_guest_context *cmp; @@ -70,10 +74,6 @@ void domid_free(domid_t domid); struct domain *alloc_domain_struct(void); void free_domain_struct(struct domain *d); -/* Allocate/free a VCPU structure. */ -struct vcpu *alloc_vcpu_struct(const struct domain *d); -void free_vcpu_struct(struct vcpu *v); - /* Allocate/free a PIRQ structure. */ #ifndef alloc_pirq_struct struct pirq *alloc_pirq_struct(struct domain *d); -- 2.52.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |