From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: [PATCH v2] xen: Improve x86's alloc_vcpu_guest_context() Date: Thu, 17 Sep 2015 17:52:43 +0100 Message-ID: <1442508763-32164-1-git-send-email-andrew.cooper3@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Xen-devel Cc: Ian Campbell , Andrew Cooper , Tim Deegan , Julien Grall , Stefano Stabellini , Jan Beulich , Roger Pau Monne List-Id: xen-devel@lists.xenproject.org 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 --- CC: Jan Beulich CC: Tim Deegan CC: Ian Campbell CC: Stefano Stabellini CC: Julien Grall CC: Roger Pau Monne 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 #include #include -#include #include #include #include @@ -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