[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] xen: Improve x86's alloc_vcpu_guest_context()
This essentially reverts c/s 2037f2adb "x86: introduce alloc_vcpu_guest_context()", including the newer arm bits, but achieves the same end goal by using the newer vmalloc() infrastructure. For both x86 and ARM, {alloc,free}_vcpu_guest_context() become arch-local static inlines (which avoids a call into a separate translation), and removes an x86 scalability limit when compiling with a large NR_CPUS. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Tim Deegan <tim@xxxxxxx> CC: Ian Campbell <ian.campbell@xxxxxxxxxx> CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx> CC: Julien Grall <julien.grall@xxxxxxxxxx> CC: Roger Pau Monne <roger.pau@xxxxxxxxxx> v2: * Retain the use of x{malloc,free}() on ARM Build tested on all architectures, functionally tested on x86. --- xen/arch/arm/domain.c | 11 ---------- xen/arch/x86/domain.c | 46 ------------------------------------------ xen/include/asm-arm/domain.h | 10 +++++++++ xen/include/asm-x86/domain.h | 10 +++++++++ xen/include/asm-x86/fixmap.h | 3 --- xen/include/xen/domain.h | 6 ------ 6 files changed, 20 insertions(+), 66 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 5bdc2e9..575745c 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -466,17 +466,6 @@ void free_vcpu_struct(struct vcpu *v) free_xenheap_page(v); } -struct vcpu_guest_context *alloc_vcpu_guest_context(void) -{ - return xmalloc(struct vcpu_guest_context); - -} - -void free_vcpu_guest_context(struct vcpu_guest_context *vgc) -{ - xfree(vgc); -} - int vcpu_initialise(struct vcpu *v) { int rc = 0; diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 5ff09e7..0b97912 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -48,7 +48,6 @@ #include <asm/cpuidle.h> #include <asm/mpspec.h> #include <asm/ldt.h> -#include <asm/fixmap.h> #include <asm/hvm/hvm.h> #include <asm/hvm/support.h> #include <asm/hvm/viridian.h> @@ -272,51 +271,6 @@ void free_vcpu_struct(struct vcpu *v) free_xenheap_page(v); } -static DEFINE_PER_CPU(struct page_info *[ - PFN_UP(sizeof(struct vcpu_guest_context))], vgc_pages); - -struct vcpu_guest_context *alloc_vcpu_guest_context(void) -{ - unsigned int i, cpu = smp_processor_id(); - enum fixed_addresses idx = FIX_VGC_BEGIN - - cpu * PFN_UP(sizeof(struct vcpu_guest_context)); - - BUG_ON(per_cpu(vgc_pages[0], cpu) != NULL); - - for ( i = 0; i < PFN_UP(sizeof(struct vcpu_guest_context)); ++i ) - { - struct page_info *pg = alloc_domheap_page(current->domain, - MEMF_no_owner); - - if ( unlikely(pg == NULL) ) - { - free_vcpu_guest_context(NULL); - return NULL; - } - __set_fixmap(idx - i, page_to_mfn(pg), __PAGE_HYPERVISOR_RW); - per_cpu(vgc_pages[i], cpu) = pg; - } - return (void *)fix_to_virt(idx); -} - -void free_vcpu_guest_context(struct vcpu_guest_context *vgc) -{ - unsigned int i, cpu = smp_processor_id(); - enum fixed_addresses idx = FIX_VGC_BEGIN - - cpu * PFN_UP(sizeof(struct vcpu_guest_context)); - - BUG_ON(vgc && vgc != (void *)fix_to_virt(idx)); - - for ( i = 0; i < PFN_UP(sizeof(struct vcpu_guest_context)); ++i ) - { - if ( !per_cpu(vgc_pages[i], cpu) ) - continue; - clear_fixmap(idx - i); - free_domheap_page(per_cpu(vgc_pages[i], cpu)); - per_cpu(vgc_pages[i], cpu) = NULL; - } -} - static int setup_compat_l4(struct vcpu *v) { struct page_info *pg; diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 7ddaeaa..c3f5a95 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -300,6 +300,16 @@ static inline register_t vcpuid_to_vaffinity(unsigned int vcpuid) return vaff; } +static inline struct vcpu_guest_context *alloc_vcpu_guest_context(void) +{ + return xmalloc(struct vcpu_guest_context); +} + +static inline void free_vcpu_guest_context(struct vcpu_guest_context *vgc) +{ + xfree(vgc); +} + #endif /* __ASM_DOMAIN_H__ */ /* diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index 59cf826..f0aeade 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -576,6 +576,16 @@ void domain_cpuid(struct domain *d, #define domain_max_vcpus(d) (is_hvm_domain(d) ? HVM_MAX_VCPUS : MAX_VIRT_CPUS) +static inline struct vcpu_guest_context *alloc_vcpu_guest_context(void) +{ + return vmalloc(sizeof(struct vcpu_guest_context)); +} + +static inline void free_vcpu_guest_context(struct vcpu_guest_context *vgc) +{ + vfree(vgc); +} + #endif /* __ASM_DOMAIN_H__ */ /* diff --git a/xen/include/asm-x86/fixmap.h b/xen/include/asm-x86/fixmap.h index 70eadff..1e24b11 100644 --- a/xen/include/asm-x86/fixmap.h +++ b/xen/include/asm-x86/fixmap.h @@ -47,9 +47,6 @@ enum fixed_addresses { FIX_COM_END, FIX_EHCI_DBGP, /* Everything else should go further down. */ - FIX_VGC_END, - FIX_VGC_BEGIN = FIX_VGC_END - + PFN_UP(sizeof(struct vcpu_guest_context)) * NR_CPUS - 1, FIX_APIC_BASE, FIX_IO_APIC_BASE_0, FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1, diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h index a469fe0..3dca3f6 100644 --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -31,12 +31,6 @@ struct vcpu *alloc_vcpu( struct vcpu *alloc_vcpu_struct(void); void free_vcpu_struct(struct vcpu *v); -/* Allocate/free a vcpu_guest_context structure. */ -#ifndef alloc_vcpu_guest_context -struct vcpu_guest_context *alloc_vcpu_guest_context(void); -void free_vcpu_guest_context(struct vcpu_guest_context *); -#endif - /* Allocate/free a PIRQ structure. */ #ifndef alloc_pirq_struct struct pirq *alloc_pirq_struct(struct domain *); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |