[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v7 13/16] xen/arm: move arch specific grant table bits into grant_table.c
> -----Original Message----- > From: Xen-devel [mailto:xen-devel-bounces@xxxxxxxxxxxxx] On Behalf Of > Juergen Gross > Sent: 19 September 2017 10:59 > To: xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Juergen Gross <jgross@xxxxxxxx>; sstabellini@xxxxxxxxxx; Wei Liu > <wei.liu2@xxxxxxxxxx>; George Dunlap <George.Dunlap@xxxxxxxxxx>; > Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Ian Jackson > <Ian.Jackson@xxxxxxxxxx>; Tim (Xen.org) <tim@xxxxxxx>; > julien.grall@xxxxxxx; jbeulich@xxxxxxxx; dgdegra@xxxxxxxxxxxxx > Subject: [Xen-devel] [PATCH v7 13/16] 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> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > V7: > - re-add #include <asm/grant-table.h> in grant_table.h (Julien Grall) > --- > xen/arch/arm/domain.c | 2 -- > xen/common/grant_table.c | 26 +++++++++++++++++++------- > 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 | 2 ++ > 6 files changed, 47 insertions(+), 22 deletions(-) > > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c > index 784ae392cf..e39a79885c 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 f66940551e..26f9a32656 100644 > --- a/xen/common/grant_table.c > +++ b/xen/common/grant_table.c > @@ -72,6 +72,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 +1660,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 +1669,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 +3613,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); > @@ -3729,7 +3741,7 @@ int gnttab_map_frame(struct domain *d, unsigned > long idx, gfn_t gfn, > } > > if ( !rc ) > - 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 b174c65080..ce9b6a4032 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..d2bd2416c4 100644 > --- a/xen/include/xen/grant_table.h > +++ b/xen/include/xen/grant_table.h > @@ -29,6 +29,8 @@ > #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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |