| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/3] xen/virtio: restructure xen grant dma setup
 
On 06.10.22 10:14, Juergen Gross wrote:
Hello Juergen
> In order to prepare supporting other means than device tree for
> setting up virtio devices under Xen, restructure the functions
> xen_is_grant_dma_device() and xen_grant_setup_dma_ops() a little bit.
>
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Patch looks good,
one NIT, xen_dt_grant_setup_dma_ops() down the code doesn't actually 
setup DMA OPS, it retrieves the backend domid via device-tree means and 
stores it,
so I would rename to it, maybe something like 
xen_dt_grant_setup_backend_domid() or xen_dt_grant_init_backend_domid(), 
but I am not sure it would be good alternative.
So, w/ or w/o renaming:
Reviewed-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
also
Tested-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx> # Arm64 
only
> ---
>   drivers/xen/grant-dma-ops.c | 68 +++++++++++++++++++++++--------------
>   1 file changed, 43 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c
> index 8973fc1e9ccc..f29759d5301f 100644
> --- a/drivers/xen/grant-dma-ops.c
> +++ b/drivers/xen/grant-dma-ops.c
> @@ -273,22 +273,28 @@ static const struct dma_map_ops xen_grant_dma_ops = {
>       .dma_supported = xen_grant_dma_supported,
>   };
>   
> -bool xen_is_grant_dma_device(struct device *dev)
> +static bool xen_is_dt_grant_dma_device(struct device *dev)
>   {
>       struct device_node *iommu_np;
>       bool has_iommu;
>   
> -     /* XXX Handle only DT devices for now */
> -     if (!dev->of_node)
> -             return false;
> -
>       iommu_np = of_parse_phandle(dev->of_node, "iommus", 0);
> -     has_iommu = iommu_np && of_device_is_compatible(iommu_np, 
> "xen,grant-dma");
> +     has_iommu = iommu_np &&
> +                 of_device_is_compatible(iommu_np, "xen,grant-dma");
>       of_node_put(iommu_np);
>   
>       return has_iommu;
>   }
>   
> +bool xen_is_grant_dma_device(struct device *dev)
> +{
> +     /* XXX Handle only DT devices for now */
> +     if (dev->of_node)
> +             return xen_is_dt_grant_dma_device(dev);
> +
> +     return false;
> +}
> +
>   bool xen_virtio_mem_acc(struct virtio_device *dev)
>   {
>       if (IS_ENABLED(CONFIG_XEN_VIRTIO_FORCE_GRANT))
> @@ -297,45 +303,56 @@ bool xen_virtio_mem_acc(struct virtio_device *dev)
>       return xen_is_grant_dma_device(dev->dev.parent);
>   }
>   
> -void xen_grant_setup_dma_ops(struct device *dev)
> +static int xen_dt_grant_setup_dma_ops(struct device *dev,
> +                                    struct xen_grant_dma_data *data)
>   {
> -     struct xen_grant_dma_data *data;
>       struct of_phandle_args iommu_spec;
>   
> -     data = find_xen_grant_dma_data(dev);
> -     if (data) {
> -             dev_err(dev, "Xen grant DMA data is already created\n");
> -             return;
> -     }
> -
> -     /* XXX ACPI device unsupported for now */
> -     if (!dev->of_node)
> -             goto err;
> -
>       if (of_parse_phandle_with_args(dev->of_node, "iommus", "#iommu-cells",
>                       0, &iommu_spec)) {
>               dev_err(dev, "Cannot parse iommus property\n");
> -             goto err;
> +             return -ESRCH;
>       }
>   
>       if (!of_device_is_compatible(iommu_spec.np, "xen,grant-dma") ||
>                       iommu_spec.args_count != 1) {
>               dev_err(dev, "Incompatible IOMMU node\n");
>               of_node_put(iommu_spec.np);
> -             goto err;
> +             return -ESRCH;
>       }
>   
>       of_node_put(iommu_spec.np);
>   
> +     /*
> +      * The endpoint ID here means the ID of the domain where the
> +      * corresponding backend is running
> +      */
> +     data->backend_domid = iommu_spec.args[0];
> +
> +     return 0;
> +}
> +
> +void xen_grant_setup_dma_ops(struct device *dev)
> +{
> +     struct xen_grant_dma_data *data;
> +
> +     data = find_xen_grant_dma_data(dev);
> +     if (data) {
> +             dev_err(dev, "Xen grant DMA data is already created\n");
> +             return;
> +     }
> +
>       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
>       if (!data)
>               goto err;
>   
> -     /*
> -      * The endpoint ID here means the ID of the domain where the 
> corresponding
> -      * backend is running
> -      */
> -     data->backend_domid = iommu_spec.args[0];
> +     if (dev->of_node) {
> +             if (xen_dt_grant_setup_dma_ops(dev, data))
> +                     goto err;
> +     } else {
> +             /* XXX ACPI device unsupported for now */
> +             goto err;
> +     }
>   
>       if (xa_err(xa_store(&xen_grant_dma_devices, (unsigned long)dev, data,
>                       GFP_KERNEL))) {
> @@ -348,6 +365,7 @@ void xen_grant_setup_dma_ops(struct device *dev)
>       return;
>   
>   err:
> +     devm_kfree(dev, data);
>       dev_err(dev, "Cannot set up Xen grant DMA ops, retain platform DMA 
> ops\n");
>   }
>   
-- 
Regards,
Oleksandr Tyshchenko
 
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |