[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v6 10/12] xen/arm: move arch specific grant table bits into grant_table.c
Instead of attaching the ARM specific grant table data to the domain structure add it to struct grant_table. Add the needed arch functions to the asm-*/grant_table.h includes. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- xen/arch/arm/domain.c | 2 -- xen/common/grant_table.c | 27 ++++++++++++++++++++------- xen/include/asm-arm/domain.h | 1 - xen/include/asm-arm/grant_table.h | 26 +++++++++++++++++++------- xen/include/asm-x86/grant_table.h | 12 +++++++----- xen/include/xen/grant_table.h | 3 ++- 6 files changed, 48 insertions(+), 23 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 6512f01463..ee4643f52a 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -486,13 +486,11 @@ struct domain *alloc_domain_struct(void) return NULL; clear_page(d); - d->arch.grant_table_gfn = xzalloc_array(gfn_t, max_grant_frames); return d; } void free_domain_struct(struct domain *d) { - xfree(d->arch.grant_table_gfn); free_xenheap_page(d); } diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index bf6f32b27f..64e78e31f6 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -39,6 +39,7 @@ #include <xen/vmap.h> #include <xsm/xsm.h> #include <asm/flushtlb.h> +#include <asm/grant_table.h> /* Per-domain grant information. */ struct grant_table { @@ -72,6 +73,8 @@ struct grant_table { struct active_grant_entry **active; /* Mapping tracking table per vcpu. */ struct grant_mapping **maptrack; + + struct grant_table_arch arch; }; #ifndef DEFAULT_MAX_NR_GRANT_FRAMES /* to allow arch to override */ @@ -1658,6 +1661,8 @@ gnttab_unpopulate_status_frames(struct domain *d, struct grant_table *gt) static int grant_table_init(struct grant_table *gt) { + int ret = -ENOMEM; + if ( gt->active ) return -EBUSY; @@ -1665,34 +1670,40 @@ grant_table_init(struct grant_table *gt) gt->active = xzalloc_array(struct active_grant_entry *, max_nr_active_grant_frames); if ( gt->active == NULL ) - goto no_mem; + goto out; /* Tracking of mapped foreign frames table */ gt->maptrack = vzalloc(max_maptrack_frames * sizeof(*gt->maptrack)); if ( gt->maptrack == NULL ) - goto no_mem; + goto out; /* Shared grant table. */ gt->shared_raw = xzalloc_array(void *, max_grant_frames); if ( gt->shared_raw == NULL ) - goto no_mem; + goto out; /* Status pages for grant table - for version 2 */ gt->status = xzalloc_array(grant_status_t *, grant_to_status_frames(max_grant_frames)); if ( gt->status == NULL ) - goto no_mem; + goto out; + + ret = gnttab_init_arch(gt); + if ( ret ) + goto out; return 0; - no_mem: + out: + xfree(gt->status); + gt->status = NULL; xfree(gt->shared_raw); gt->shared_raw = NULL; vfree(gt->maptrack); gt->maptrack = NULL; xfree(gt->active); gt->active = NULL; - return -ENOMEM; + return ret; } /* @@ -3603,6 +3614,8 @@ grant_table_destroy( if ( t == NULL ) return; + gnttab_destroy_arch(t); + for ( i = 0; i < nr_grant_frames(t); i++ ) free_xenheap_page(t->shared_raw[i]); xfree(t->shared_raw); @@ -3728,7 +3741,7 @@ int gnttab_map_frame(struct domain *d, unsigned long idx, gfn_t gfn, rc = -EINVAL; } - gnttab_set_frame_gfn(d, idx, gfn); + gnttab_set_frame_gfn(gt, idx, gfn); grant_write_unlock(gt); diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 8dfc1d1ec2..a22a0f5101 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -50,7 +50,6 @@ struct arch_domain struct p2m_domain p2m; struct hvm_domain hvm_domain; - gfn_t *grant_table_gfn; struct vmmio vmmio; diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h index 0a248a765a..0870b5b782 100644 --- a/xen/include/asm-arm/grant_table.h +++ b/xen/include/asm-arm/grant_table.h @@ -6,6 +6,10 @@ #define INITIAL_NR_GRANT_FRAMES 4 +struct grant_table_arch { + gfn_t *gfn; +}; + void gnttab_clear_flag(unsigned long nr, uint16_t *addr); int create_grant_host_mapping(unsigned long gpaddr, unsigned long mfn, unsigned int flags, unsigned int @@ -22,11 +26,19 @@ static inline int replace_grant_supported(void) return 1; } -static inline void gnttab_set_frame_gfn(struct domain *d, unsigned long idx, - gfn_t gfn) -{ - d->arch.grant_table_gfn[idx] = gfn; -} +#define gnttab_init_arch(gt) \ + ( ((gt)->arch.gfn = xzalloc_array(gfn_t, max_grant_frames)) == 0 \ + ? 0 : -ENOMEM ) + +#define gnttab_destroy_arch(gt) \ + do { \ + xfree((gt)->arch.gfn); \ + } while ( 0 ) + +#define gnttab_set_frame_gfn(gt, idx, gfn) \ + do { \ + (gt)->arch.gfn[idx] = gfn; \ + } while ( 0 ) #define gnttab_create_shared_page(d, t, i) \ do { \ @@ -36,8 +48,8 @@ static inline void gnttab_set_frame_gfn(struct domain *d, unsigned long idx, } while ( 0 ) #define gnttab_shared_gmfn(d, t, i) \ - ( ((i >= nr_grant_frames(d->grant_table)) && \ - (i < max_grant_frames)) ? 0 : gfn_x(d->arch.grant_table_gfn[i])) + ( ((i >= nr_grant_frames(t)) && \ + (i < max_grant_frames)) ? 0 : gfn_x(t->arch.gfn[i])) #define gnttab_need_iommu_mapping(d) \ (is_domain_direct_mapped(d) && need_iommu(d)) diff --git a/xen/include/asm-x86/grant_table.h b/xen/include/asm-x86/grant_table.h index c865999a33..1b93c5720d 100644 --- a/xen/include/asm-x86/grant_table.h +++ b/xen/include/asm-x86/grant_table.h @@ -14,6 +14,9 @@ #define INITIAL_NR_GRANT_FRAMES 4 +struct grant_table_arch { +}; + /* * Caller must own caller's BIGLOCK, is responsible for flushing the TLB, and * must hold a reference to the page. @@ -36,6 +39,10 @@ static inline int replace_grant_host_mapping(uint64_t addr, unsigned long frame, return replace_grant_pv_mapping(addr, frame, new_addr, flags); } +#define gnttab_init_arch(gt) 0 +#define gnttab_destroy_arch(gt) do {} while ( 0 ) +#define gnttab_set_frame_gfn(gt, idx, gfn) do {} while ( 0 ) + #define gnttab_create_shared_page(d, t, i) \ do { \ share_xen_page_with_guest( \ @@ -75,11 +82,6 @@ static inline void gnttab_clear_flag(unsigned int nr, uint16_t *st) asm volatile ("lock btrw %w1,%0" : "=m" (*st) : "Ir" (nr), "m" (*st)); } -static inline void gnttab_set_frame_gfn(struct domain *d, unsigned long idx, - gfn_t gfn) -{ -} - /* Foreign mappings of HHVM-guest pages do not modify the type count. */ #define gnttab_host_mapping_get_page_type(ro, ld, rd) \ (!(ro) && (((ld) == (rd)) || !paging_mode_external(rd))) diff --git a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h index df11b31264..f3f2fb9ebc 100644 --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -27,7 +27,8 @@ #include <xen/rwlock.h> #include <public/grant_table.h> #include <asm/page.h> -#include <asm/grant_table.h> + +struct grant_table; /* The maximum size of a grant table. */ extern unsigned int max_grant_frames; -- 2.12.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |