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

2018-03-13 Thread Auger Eric
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 
Reviewed-by: Eric Auger 

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;
> 



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

2018-03-06 Thread Peter Xu
On Wed, Feb 28, 2018 at 01:14:46PM -0700, Alex Williamson wrote:
> This creates a common helper that we'll use for ioeventfd setup.
> 
> Signed-off-by: Alex Williamson 

Reviewed-by: Peter Xu 

-- 
Peter Xu



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

2018-02-28 Thread Alex Williamson
This creates a common helper that we'll use for ioeventfd setup.

Signed-off-by: Alex Williamson 
---
 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;