[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen: don't compile pv-specific parts if XEN_PV isn't configured



On 09/14/2017 08:38 AM, Juergen Gross wrote:
> xenbus_client.c contains some functions specific for pv guests.
> Enclose them with #ifdef CONFIG_XEN_PV to avoid compiling them when
> they are not needed (e.g. on ARM).
>
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
> ---
>  drivers/xen/xenbus/xenbus_client.c | 130 
> +++++++++++++++++++------------------
>  1 file changed, 67 insertions(+), 63 deletions(-)
>
> diff --git a/drivers/xen/xenbus/xenbus_client.c 
> b/drivers/xen/xenbus/xenbus_client.c
> index 82a8866758ee..a1c17000129b 100644
> --- a/drivers/xen/xenbus/xenbus_client.c
> +++ b/drivers/xen/xenbus/xenbus_client.c
> @@ -519,64 +519,6 @@ static int __xenbus_map_ring(struct xenbus_device *dev,
>       return err;
>  }
>  
> -static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev,
> -                                  grant_ref_t *gnt_refs,
> -                                  unsigned int nr_grefs,
> -                                  void **vaddr)
> -{
> -     struct xenbus_map_node *node;
> -     struct vm_struct *area;
> -     pte_t *ptes[XENBUS_MAX_RING_GRANTS];
> -     phys_addr_t phys_addrs[XENBUS_MAX_RING_GRANTS];
> -     int err = GNTST_okay;
> -     int i;
> -     bool leaked;
> -
> -     *vaddr = NULL;
> -
> -     if (nr_grefs > XENBUS_MAX_RING_GRANTS)
> -             return -EINVAL;
> -
> -     node = kzalloc(sizeof(*node), GFP_KERNEL);
> -     if (!node)
> -             return -ENOMEM;
> -
> -     area = alloc_vm_area(XEN_PAGE_SIZE * nr_grefs, ptes);
> -     if (!area) {
> -             kfree(node);
> -             return -ENOMEM;
> -     }
> -
> -     for (i = 0; i < nr_grefs; i++)
> -             phys_addrs[i] = arbitrary_virt_to_machine(ptes[i]).maddr;
> -
> -     err = __xenbus_map_ring(dev, gnt_refs, nr_grefs, node->handles,
> -                             phys_addrs,
> -                             GNTMAP_host_map | GNTMAP_contains_pte,
> -                             &leaked);
> -     if (err)
> -             goto failed;
> -
> -     node->nr_handles = nr_grefs;
> -     node->pv.area = area;
> -
> -     spin_lock(&xenbus_valloc_lock);
> -     list_add(&node->next, &xenbus_valloc_pages);
> -     spin_unlock(&xenbus_valloc_lock);
> -
> -     *vaddr = area->addr;
> -     return 0;
> -
> -failed:
> -     if (!leaked)
> -             free_vm_area(area);
> -     else
> -             pr_alert("leaking VM area %p size %u page(s)", area, nr_grefs);
> -
> -     kfree(node);
> -     return err;
> -}
> -
>  struct map_ring_valloc_hvm
>  {
>       unsigned int idx;
> @@ -725,6 +667,65 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, 
> void *vaddr)
>  }
>  EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
>  
> +#ifdef CONFIG_XEN_PV
> +static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev,
> +                                  grant_ref_t *gnt_refs,
> +                                  unsigned int nr_grefs,
> +                                  void **vaddr)
> +{
> +     struct xenbus_map_node *node;
> +     struct vm_struct *area;
> +     pte_t *ptes[XENBUS_MAX_RING_GRANTS];
> +     phys_addr_t phys_addrs[XENBUS_MAX_RING_GRANTS];
> +     int err = GNTST_okay;
> +     int i;
> +     bool leaked;
> +
> +     *vaddr = NULL;
> +
> +     if (nr_grefs > XENBUS_MAX_RING_GRANTS)
> +             return -EINVAL;
> +
> +     node = kzalloc(sizeof(*node), GFP_KERNEL);
> +     if (!node)
> +             return -ENOMEM;
> +
> +     area = alloc_vm_area(XEN_PAGE_SIZE * nr_grefs, ptes);
> +     if (!area) {
> +             kfree(node);
> +             return -ENOMEM;
> +     }
> +
> +     for (i = 0; i < nr_grefs; i++)
> +             phys_addrs[i] = arbitrary_virt_to_machine(ptes[i]).maddr;
> +
> +     err = __xenbus_map_ring(dev, gnt_refs, nr_grefs, node->handles,
> +                             phys_addrs,
> +                             GNTMAP_host_map | GNTMAP_contains_pte,
> +                             &leaked);
> +     if (err)
> +             goto failed;
> +
> +     node->nr_handles = nr_grefs;
> +     node->pv.area = area;
> +
> +     spin_lock(&xenbus_valloc_lock);
> +     list_add(&node->next, &xenbus_valloc_pages);
> +     spin_unlock(&xenbus_valloc_lock);
> +
> +     *vaddr = area->addr;
> +     return 0;
> +
> +failed:
> +     if (!leaked)
> +             free_vm_area(area);
> +     else
> +             pr_alert("leaking VM area %p size %u page(s)", area, nr_grefs);
> +
> +     kfree(node);
> +     return err;
> +}
> +

Did you make any changes in xenbus_map_ring_valloc_pv()? I don't see any
but the diff looks pretty big --- I'd expect only the preprocessor
directives to show up.

-boris



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.