qemu-devel
[Top][All Lists]
Advanced

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

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


From: Alex Williamson
Subject: [Qemu-devel] [PATCH 1/3] vfio/pci: Pull BAR mapping setup from read-write path
Date: Wed, 28 Feb 2018 13:14:46 -0700
User-agent: StGit/0.18-102-gdf9f

This creates a common helper that we'll use for ioeventfd setup.

Signed-off-by: Alex Williamson <address@hidden>
---
 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]