|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] xen/grant-table: remove support for V2 tables
On Wed, Jul 02, 2014 at 11:25:29AM +0100, David Vrabel wrote:
> Since 11c7ff17c9b6dbf3a4e4f36be30ad531a6cf0ec9 (xen/grant-table: Force
> to use v1 of grants.) the code for V2 grant tables is not used.
.. and if we ever need it we can resurrect it.
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> ---
> arch/arm/xen/grant-table.c | 9 +-
> arch/x86/xen/grant-table.c | 60 +--------
> drivers/xen/grant-table.c | 309
> +-------------------------------------------
> include/xen/grant_table.h | 30 +----
> 4 files changed, 13 insertions(+), 395 deletions(-)
>
> diff --git a/arch/arm/xen/grant-table.c b/arch/arm/xen/grant-table.c
> index 91cf08b..e437918 100644
> --- a/arch/arm/xen/grant-table.c
> +++ b/arch/arm/xen/grant-table.c
> @@ -45,14 +45,7 @@ void arch_gnttab_unmap(void *shared, unsigned long
> nr_gframes)
> return;
> }
>
> -int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
> - unsigned long max_nr_gframes,
> - grant_status_t **__shared)
> -{
> - return -ENOSYS;
> -}
> -
> -int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
> +int arch_gnttab_init(unsigned long nr_shared)
> {
> return 0;
> }
> diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
> index 27301df..c1ef6b2 100644
> --- a/arch/x86/xen/grant-table.c
> +++ b/arch/x86/xen/grant-table.c
> @@ -48,7 +48,7 @@
> static struct gnttab_vm_area {
> struct vm_struct *area;
> pte_t **ptes;
> -} gnttab_shared_vm_area, gnttab_status_vm_area;
> +} gnttab_shared_vm_area;
>
> int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
> unsigned long max_nr_gframes,
> @@ -72,43 +72,16 @@ int arch_gnttab_map_shared(unsigned long *frames,
> unsigned long nr_gframes,
> return 0;
> }
>
> -int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
> - unsigned long max_nr_gframes,
> - grant_status_t **__shared)
> -{
> - grant_status_t *shared = *__shared;
> - unsigned long addr;
> - unsigned long i;
> -
> - if (shared == NULL)
> - *__shared = shared = gnttab_status_vm_area.area->addr;
> -
> - addr = (unsigned long)shared;
> -
> - for (i = 0; i < nr_gframes; i++) {
> - set_pte_at(&init_mm, addr, gnttab_status_vm_area.ptes[i],
> - mfn_pte(frames[i], PAGE_KERNEL));
> - addr += PAGE_SIZE;
> - }
> -
> - return 0;
> -}
> -
> void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
> {
> - pte_t **ptes;
> unsigned long addr;
> unsigned long i;
>
> - if (shared == gnttab_status_vm_area.area->addr)
> - ptes = gnttab_status_vm_area.ptes;
> - else
> - ptes = gnttab_shared_vm_area.ptes;
> -
> addr = (unsigned long)shared;
>
> for (i = 0; i < nr_gframes; i++) {
> - set_pte_at(&init_mm, addr, ptes[i], __pte(0));
> + set_pte_at(&init_mm, addr, gnttab_shared_vm_area.ptes[i],
> + __pte(0));
> addr += PAGE_SIZE;
> }
> }
> @@ -129,35 +102,12 @@ static int __init arch_gnttab_valloc(struct
> gnttab_vm_area *area,
> return 0;
> }
>
> -static void __init arch_gnttab_vfree(struct gnttab_vm_area *area)
> +int __init arch_gnttab_init(unsigned long nr_shared)
> {
> - free_vm_area(area->area);
> - kfree(area->ptes);
> -}
> -
> -int __init arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
> -{
> - int ret;
> -
> if (!xen_pv_domain())
> return 0;
>
> - ret = arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);
> - if (ret < 0)
> - return ret;
> -
> - /*
> - * Always allocate the space for the status frames in case
> - * we're migrated to a host with V2 support.
> - */
> - ret = arch_gnttab_valloc(&gnttab_status_vm_area, nr_status);
> - if (ret < 0)
> - goto err;
> -
> - return 0;
> - err:
> - arch_gnttab_vfree(&gnttab_shared_vm_area);
> - return -ENOMEM;
> + return arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);
> }
>
> #ifdef CONFIG_XEN_PVH
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index eeba754..c254ae0 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -69,7 +69,6 @@ struct grant_frames xen_auto_xlat_grant_frames;
>
> static union {
> struct grant_entry_v1 *v1;
> - union grant_entry_v2 *v2;
> void *addr;
> } gnttab_shared;
>
> @@ -120,36 +119,10 @@ struct gnttab_ops {
> * by bit operations.
> */
> int (*query_foreign_access)(grant_ref_t ref);
> - /*
> - * Grant a domain to access a range of bytes within the page referred by
> - * an available grant entry. Ref parameter is reference of a grant entry
> - * which will be sub-page accessed, domid is id of grantee domain, frame
> - * is frame address of subpage grant, flags is grant type and flag
> - * information, page_off is offset of the range of bytes, and length is
> - * length of bytes to be accessed.
> - */
> - void (*update_subpage_entry)(grant_ref_t ref, domid_t domid,
> - unsigned long frame, int flags,
> - unsigned page_off, unsigned length);
> - /*
> - * Redirect an available grant entry on domain A to another grant
> - * reference of domain B, then allow domain C to use grant reference
> - * of domain B transitively. Ref parameter is an available grant entry
> - * reference on domain A, domid is id of domain C which accesses grant
> - * entry transitively, flags is grant type and flag information,
> - * trans_domid is id of domain B whose grant entry is finally accessed
> - * transitively, trans_gref is grant entry transitive reference of
> - * domain B.
> - */
> - void (*update_trans_entry)(grant_ref_t ref, domid_t domid, int flags,
> - domid_t trans_domid, grant_ref_t trans_gref);
> };
>
> static struct gnttab_ops *gnttab_interface;
>
> -/*This reflects status of grant entries, so act as a global value*/
> -static grant_status_t *grstatus;
> -
> static int grant_table_version;
> static int grefs_per_grant_frame;
>
> @@ -231,7 +204,7 @@ static void put_free_entry(grant_ref_t ref)
> }
>
> /*
> - * Following applies to gnttab_update_entry_v1 and gnttab_update_entry_v2.
> + * Following applies to gnttab_update_entry_v1.
> * Introducing a valid entry into the grant table:
> * 1. Write ent->domid.
> * 2. Write ent->frame:
> @@ -250,15 +223,6 @@ static void gnttab_update_entry_v1(grant_ref_t ref,
> domid_t domid,
> gnttab_shared.v1[ref].flags = flags;
> }
>
> -static void gnttab_update_entry_v2(grant_ref_t ref, domid_t domid,
> - unsigned long frame, unsigned flags)
> -{
> - gnttab_shared.v2[ref].hdr.domid = domid;
> - gnttab_shared.v2[ref].full_page.frame = frame;
> - wmb();
> - gnttab_shared.v2[ref].hdr.flags = GTF_permit_access | flags;
> -}
> -
> /*
> * Public grant-issuing interface functions
> */
> @@ -285,132 +249,11 @@ int gnttab_grant_foreign_access(domid_t domid,
> unsigned long frame,
> }
> EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
>
> -static void gnttab_update_subpage_entry_v2(grant_ref_t ref, domid_t domid,
> - unsigned long frame, int flags,
> - unsigned page_off, unsigned length)
> -{
> - gnttab_shared.v2[ref].sub_page.frame = frame;
> - gnttab_shared.v2[ref].sub_page.page_off = page_off;
> - gnttab_shared.v2[ref].sub_page.length = length;
> - gnttab_shared.v2[ref].hdr.domid = domid;
> - wmb();
> - gnttab_shared.v2[ref].hdr.flags =
> - GTF_permit_access | GTF_sub_page | flags;
> -}
> -
> -int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
> - unsigned long frame, int flags,
> - unsigned page_off,
> - unsigned length)
> -{
> - if (flags & (GTF_accept_transfer | GTF_reading |
> - GTF_writing | GTF_transitive))
> - return -EPERM;
> -
> - if (gnttab_interface->update_subpage_entry == NULL)
> - return -ENOSYS;
> -
> - gnttab_interface->update_subpage_entry(ref, domid, frame, flags,
> - page_off, length);
> -
> - return 0;
> -}
> -EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage_ref);
> -
> -int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
> - int flags, unsigned page_off,
> - unsigned length)
> -{
> - int ref, rc;
> -
> - ref = get_free_entries(1);
> - if (unlikely(ref < 0))
> - return -ENOSPC;
> -
> - rc = gnttab_grant_foreign_access_subpage_ref(ref, domid, frame, flags,
> - page_off, length);
> - if (rc < 0) {
> - put_free_entry(ref);
> - return rc;
> - }
> -
> - return ref;
> -}
> -EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage);
> -
> -bool gnttab_subpage_grants_available(void)
> -{
> - return gnttab_interface->update_subpage_entry != NULL;
> -}
> -EXPORT_SYMBOL_GPL(gnttab_subpage_grants_available);
> -
> -static void gnttab_update_trans_entry_v2(grant_ref_t ref, domid_t domid,
> - int flags, domid_t trans_domid,
> - grant_ref_t trans_gref)
> -{
> - gnttab_shared.v2[ref].transitive.trans_domid = trans_domid;
> - gnttab_shared.v2[ref].transitive.gref = trans_gref;
> - gnttab_shared.v2[ref].hdr.domid = domid;
> - wmb();
> - gnttab_shared.v2[ref].hdr.flags =
> - GTF_permit_access | GTF_transitive | flags;
> -}
> -
> -int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
> - int flags, domid_t trans_domid,
> - grant_ref_t trans_gref)
> -{
> - if (flags & (GTF_accept_transfer | GTF_reading |
> - GTF_writing | GTF_sub_page))
> - return -EPERM;
> -
> - if (gnttab_interface->update_trans_entry == NULL)
> - return -ENOSYS;
> -
> - gnttab_interface->update_trans_entry(ref, domid, flags, trans_domid,
> - trans_gref);
> -
> - return 0;
> -}
> -EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans_ref);
> -
> -int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
> - domid_t trans_domid,
> - grant_ref_t trans_gref)
> -{
> - int ref, rc;
> -
> - ref = get_free_entries(1);
> - if (unlikely(ref < 0))
> - return -ENOSPC;
> -
> - rc = gnttab_grant_foreign_access_trans_ref(ref, domid, flags,
> - trans_domid, trans_gref);
> - if (rc < 0) {
> - put_free_entry(ref);
> - return rc;
> - }
> -
> - return ref;
> -}
> -EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans);
> -
> -bool gnttab_trans_grants_available(void)
> -{
> - return gnttab_interface->update_trans_entry != NULL;
> -}
> -EXPORT_SYMBOL_GPL(gnttab_trans_grants_available);
> -
> static int gnttab_query_foreign_access_v1(grant_ref_t ref)
> {
> return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
> }
>
> -static int gnttab_query_foreign_access_v2(grant_ref_t ref)
> -{
> - return grstatus[ref] & (GTF_reading|GTF_writing);
> -}
> -
> int gnttab_query_foreign_access(grant_ref_t ref)
> {
> return gnttab_interface->query_foreign_access(ref);
> @@ -433,29 +276,6 @@ static int gnttab_end_foreign_access_ref_v1(grant_ref_t
> ref, int readonly)
> return 1;
> }
>
> -static int gnttab_end_foreign_access_ref_v2(grant_ref_t ref, int readonly)
> -{
> - gnttab_shared.v2[ref].hdr.flags = 0;
> - mb();
> - if (grstatus[ref] & (GTF_reading|GTF_writing)) {
> - return 0;
> - } else {
> - /* The read of grstatus needs to have acquire
> - semantics. On x86, reads already have
> - that, and we just need to protect against
> - compiler reorderings. On other
> - architectures we may need a full
> - barrier. */
> -#ifdef CONFIG_X86
> - barrier();
> -#else
> - mb();
> -#endif
> - }
> -
> - return 1;
> -}
> -
> static inline int _gnttab_end_foreign_access_ref(grant_ref_t ref, int
> readonly)
> {
> return gnttab_interface->end_foreign_access_ref(ref, readonly);
> @@ -616,37 +436,6 @@ static unsigned long
> gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
> return frame;
> }
>
> -static unsigned long gnttab_end_foreign_transfer_ref_v2(grant_ref_t ref)
> -{
> - unsigned long frame;
> - u16 flags;
> - u16 *pflags;
> -
> - pflags = &gnttab_shared.v2[ref].hdr.flags;
> -
> - /*
> - * If a transfer is not even yet started, try to reclaim the grant
> - * reference and return failure (== 0).
> - */
> - while (!((flags = *pflags) & GTF_transfer_committed)) {
> - if (sync_cmpxchg(pflags, flags, 0) == flags)
> - return 0;
> - cpu_relax();
> - }
> -
> - /* If a transfer is in progress then wait until it is completed. */
> - while (!(flags & GTF_transfer_completed)) {
> - flags = *pflags;
> - cpu_relax();
> - }
> -
> - rmb(); /* Read the frame number /after/ reading completion status. */
> - frame = gnttab_shared.v2[ref].full_page.frame;
> - BUG_ON(frame == 0);
> -
> - return frame;
> -}
> -
> unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
> {
> return gnttab_interface->end_foreign_transfer_ref(ref);
> @@ -962,12 +751,6 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref
> *unmap_ops,
> }
> EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
>
> -static unsigned nr_status_frames(unsigned nr_grant_frames)
> -{
> - BUG_ON(grefs_per_grant_frame == 0);
> - return (nr_grant_frames * grefs_per_grant_frame + SPP - 1) / SPP;
> -}
> -
> static int gnttab_map_frames_v1(xen_pfn_t *frames, unsigned int nr_gframes)
> {
> int rc;
> @@ -985,55 +768,6 @@ static void gnttab_unmap_frames_v1(void)
> arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
> }
>
> -static int gnttab_map_frames_v2(xen_pfn_t *frames, unsigned int nr_gframes)
> -{
> - uint64_t *sframes;
> - unsigned int nr_sframes;
> - struct gnttab_get_status_frames getframes;
> - int rc;
> -
> - nr_sframes = nr_status_frames(nr_gframes);
> -
> - /* No need for kzalloc as it is initialized in following hypercall
> - * GNTTABOP_get_status_frames.
> - */
> - sframes = kmalloc(nr_sframes * sizeof(uint64_t), GFP_ATOMIC);
> - if (!sframes)
> - return -ENOMEM;
> -
> - getframes.dom = DOMID_SELF;
> - getframes.nr_frames = nr_sframes;
> - set_xen_guest_handle(getframes.frame_list, sframes);
> -
> - rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
> - &getframes, 1);
> - if (rc == -ENOSYS) {
> - kfree(sframes);
> - return -ENOSYS;
> - }
> -
> - BUG_ON(rc || getframes.status);
> -
> - rc = arch_gnttab_map_status(sframes, nr_sframes,
> - nr_status_frames(gnttab_max_grant_frames()),
> - &grstatus);
> - BUG_ON(rc);
> - kfree(sframes);
> -
> - rc = arch_gnttab_map_shared(frames, nr_gframes,
> - gnttab_max_grant_frames(),
> - &gnttab_shared.addr);
> - BUG_ON(rc);
> -
> - return 0;
> -}
> -
> -static void gnttab_unmap_frames_v2(void)
> -{
> - arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
> - arch_gnttab_unmap(grstatus, nr_status_frames(nr_grant_frames));
> -}
> -
> static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
> {
> struct gnttab_setup_table setup;
> @@ -1101,43 +835,13 @@ static struct gnttab_ops gnttab_v1_ops = {
> .query_foreign_access = gnttab_query_foreign_access_v1,
> };
>
> -static struct gnttab_ops gnttab_v2_ops = {
> - .map_frames = gnttab_map_frames_v2,
> - .unmap_frames = gnttab_unmap_frames_v2,
> - .update_entry = gnttab_update_entry_v2,
> - .end_foreign_access_ref = gnttab_end_foreign_access_ref_v2,
> - .end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v2,
> - .query_foreign_access = gnttab_query_foreign_access_v2,
> - .update_subpage_entry = gnttab_update_subpage_entry_v2,
> - .update_trans_entry = gnttab_update_trans_entry_v2,
> -};
> -
> static void gnttab_request_version(void)
> {
> - int rc;
> - struct gnttab_set_version gsv;
> + /* Only version 1 is used, which will always be available. */
> + grant_table_version = 1;
> + grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1);
> + gnttab_interface = &gnttab_v1_ops;
>
> - gsv.version = 1;
> -
> - rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
> - if (rc == 0 && gsv.version == 2) {
> - grant_table_version = 2;
> - grefs_per_grant_frame = PAGE_SIZE / sizeof(union
> grant_entry_v2);
> - gnttab_interface = &gnttab_v2_ops;
> - } else if (grant_table_version == 2) {
> - /*
> - * If we've already used version 2 features,
> - * but then suddenly discover that they're not
> - * available (e.g. migrating to an older
> - * version of Xen), almost unbounded badness
> - * can happen.
> - */
> - panic("we need grant tables version 2, but only version 1 is
> available");
> - } else {
> - grant_table_version = 1;
> - grefs_per_grant_frame = PAGE_SIZE / sizeof(struct
> grant_entry_v1);
> - gnttab_interface = &gnttab_v1_ops;
> - }
> pr_info("Grant tables using version %d layout\n", grant_table_version);
> }
>
> @@ -1225,8 +929,7 @@ int gnttab_init(void)
> }
> }
>
> - ret = arch_gnttab_init(max_nr_grant_frames,
> - nr_status_frames(max_nr_grant_frames));
> + ret = arch_gnttab_init(max_nr_grant_frames);
> if (ret < 0)
> goto ini_nomem;
>
> diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
> index 5c1aba1..3387465 100644
> --- a/include/xen/grant_table.h
> +++ b/include/xen/grant_table.h
> @@ -64,24 +64,6 @@ int gnttab_resume(void);
>
> int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
> int readonly);
> -int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
> - int flags, unsigned page_off,
> - unsigned length);
> -int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
> - domid_t trans_domid,
> - grant_ref_t trans_gref);
> -
> -/*
> - * Are sub-page grants available on this version of Xen? Returns true if
> they
> - * are, and false if they're not.
> - */
> -bool gnttab_subpage_grants_available(void);
> -
> -/*
> - * Are transitive grants available on this version of Xen? Returns true if
> they
> - * are, and false if they're not.
> - */
> -bool gnttab_trans_grants_available(void);
>
> /*
> * End access through the given grant reference, iff the grant entry is no
> @@ -128,13 +110,6 @@ void gnttab_cancel_free_callback(struct
> gnttab_free_callback *callback);
>
> void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
> unsigned long frame, int readonly);
> -int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
> - unsigned long frame, int flags,
> - unsigned page_off,
> - unsigned length);
> -int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
> - int flags, domid_t trans_domid,
> - grant_ref_t trans_gref);
>
> void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
> unsigned long pfn);
> @@ -170,13 +145,10 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref
> *unmap, phys_addr_t addr,
> unmap->dev_bus_addr = 0;
> }
>
> -int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status);
> +int arch_gnttab_init(unsigned long nr_shared);
> int arch_gnttab_map_shared(xen_pfn_t *frames, unsigned long nr_gframes,
> unsigned long max_nr_gframes,
> void **__shared);
> -int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
> - unsigned long max_nr_gframes,
> - grant_status_t **__shared);
> void arch_gnttab_unmap(void *shared, unsigned long nr_gframes);
>
> struct grant_frames {
> --
> 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 |