qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 1/3] vfio/pci: Pull BAR mapping setup from read-


From: Auger Eric
Subject: Re: [Qemu-devel] [PATCH 1/3] vfio/pci: Pull BAR mapping setup from read-write path
Date: Tue, 13 Mar 2018 13:21:31 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0

Hi Alex,
On 28/02/18 21:14, Alex Williamson wrote:
> This creates a common helper that we'll use for ioeventfd setup.

> 
> Signed-off-by: Alex Williamson <address@hidden>
Reviewed-by: Eric Auger <address@hidden>

Thanks

Eric
> ---
>  drivers/vfio/pci/vfio_pci_rdwr.c |   39 
> ++++++++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/vfio/pci/vfio_pci_rdwr.c 
> b/drivers/vfio/pci/vfio_pci_rdwr.c
> index 357243d76f10..5f2b376dcebd 100644
> --- a/drivers/vfio/pci/vfio_pci_rdwr.c
> +++ b/drivers/vfio/pci/vfio_pci_rdwr.c
> @@ -113,6 +113,30 @@ static ssize_t do_io_rw(void __iomem *io, char __user 
> *buf,
>       return done;
>  }
>  
> +static int vfio_pci_setup_barmap(struct vfio_pci_device *vdev, int bar)
> +{
> +     struct pci_dev *pdev = vdev->pdev;
> +     int ret;
> +     void __iomem *io;
> +
> +     if (vdev->barmap[bar])
> +             return 0;
> +
> +     ret = pci_request_selected_regions(pdev, 1 << bar, "vfio");
> +     if (ret)
> +             return ret;
> +
> +     io = pci_iomap(pdev, bar, 0);
> +     if (!io) {
> +             pci_release_selected_regions(pdev, 1 << bar);
> +             return -ENOMEM;
> +     }
> +
> +     vdev->barmap[bar] = io;
> +
> +     return 0;
> +}
> +
>  ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,
>                       size_t count, loff_t *ppos, bool iswrite)
>  {
> @@ -147,22 +171,13 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, 
> char __user *buf,
>               if (!io)
>                       return -ENOMEM;
>               x_end = end;
> -     } else if (!vdev->barmap[bar]) {
> -             int ret;
> -
> -             ret = pci_request_selected_regions(pdev, 1 << bar, "vfio");
> +     } else {
> +             int ret = vfio_pci_setup_barmap(vdev, bar);
>               if (ret)
>                       return ret;
>  
> -             io = pci_iomap(pdev, bar, 0);
> -             if (!io) {
> -                     pci_release_selected_regions(pdev, 1 << bar);
> -                     return -ENOMEM;
> -             }
> -
> -             vdev->barmap[bar] = io;
> -     } else
>               io = vdev->barmap[bar];
> +     }
>  
>       if (bar == vdev->msix_bar) {
>               x_start = vdev->msix_offset;
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]