Message ID | 20230921124040.145386-9-yishaih@nvidia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Introduce a vfio driver over virtio devices | expand |
On 21/09/2023 19:35, Alex Williamson wrote: > On Thu, 21 Sep 2023 15:40:37 +0300 > Yishai Hadas <yishaih@nvidia.com> wrote: > >> Expose vfio_pci_core_setup_barmap() to be used by drivers. >> >> This will let drivers to mmap a BAR and re-use it from both vfio and the >> driver when it's applicable. >> >> This API will be used in the next patches by the vfio/virtio coming >> driver. >> >> Signed-off-by: Yishai Hadas <yishaih@nvidia.com> >> --- >> drivers/vfio/pci/vfio_pci_core.c | 25 +++++++++++++++++++++++++ >> drivers/vfio/pci/vfio_pci_rdwr.c | 28 ++-------------------------- >> include/linux/vfio_pci_core.h | 1 + >> 3 files changed, 28 insertions(+), 26 deletions(-) >> >> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c >> index 1929103ee59a..b56111ed8a8c 100644 >> --- a/drivers/vfio/pci/vfio_pci_core.c >> +++ b/drivers/vfio/pci/vfio_pci_core.c >> @@ -684,6 +684,31 @@ void vfio_pci_core_disable(struct vfio_pci_core_device *vdev) >> } >> EXPORT_SYMBOL_GPL(vfio_pci_core_disable); >> >> +int vfio_pci_core_setup_barmap(struct vfio_pci_core_device *vdev, int bar) >> +{ >> + struct pci_dev *pdev = vdev->pdev; >> + void __iomem *io; >> + int ret; >> + >> + 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; >> +} >> +EXPORT_SYMBOL(vfio_pci_core_setup_barmap); > Not to endorse the rest of this yet, but minimally _GPL, same for the > following patch. Thanks, > > Alex Sure, will change to EXPORT_SYMBOL_GPL as part of V1. Yishai >> + >> void vfio_pci_core_close_device(struct vfio_device *core_vdev) >> { >> struct vfio_pci_core_device *vdev = >> diff --git a/drivers/vfio/pci/vfio_pci_rdwr.c b/drivers/vfio/pci/vfio_pci_rdwr.c >> index e27de61ac9fe..6f08b3ecbb89 100644 >> --- a/drivers/vfio/pci/vfio_pci_rdwr.c >> +++ b/drivers/vfio/pci/vfio_pci_rdwr.c >> @@ -200,30 +200,6 @@ static ssize_t do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem, >> return done; >> } >> >> -static int vfio_pci_setup_barmap(struct vfio_pci_core_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_core_device *vdev, char __user *buf, >> size_t count, loff_t *ppos, bool iswrite) >> { >> @@ -262,7 +238,7 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_core_device *vdev, char __user *buf, >> } >> x_end = end; >> } else { >> - int ret = vfio_pci_setup_barmap(vdev, bar); >> + int ret = vfio_pci_core_setup_barmap(vdev, bar); >> if (ret) { >> done = ret; >> goto out; >> @@ -438,7 +414,7 @@ int vfio_pci_ioeventfd(struct vfio_pci_core_device *vdev, loff_t offset, >> return -EINVAL; >> #endif >> >> - ret = vfio_pci_setup_barmap(vdev, bar); >> + ret = vfio_pci_core_setup_barmap(vdev, bar); >> if (ret) >> return ret; >> >> diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h >> index 562e8754869d..67ac58e20e1d 100644 >> --- a/include/linux/vfio_pci_core.h >> +++ b/include/linux/vfio_pci_core.h >> @@ -127,6 +127,7 @@ int vfio_pci_core_match(struct vfio_device *core_vdev, char *buf); >> int vfio_pci_core_enable(struct vfio_pci_core_device *vdev); >> void vfio_pci_core_disable(struct vfio_pci_core_device *vdev); >> void vfio_pci_core_finish_enable(struct vfio_pci_core_device *vdev); >> +int vfio_pci_core_setup_barmap(struct vfio_pci_core_device *vdev, int bar); >> pci_ers_result_t vfio_pci_core_aer_err_detected(struct pci_dev *pdev, >> pci_channel_state_t state); >>
diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c index 1929103ee59a..b56111ed8a8c 100644 --- a/drivers/vfio/pci/vfio_pci_core.c +++ b/drivers/vfio/pci/vfio_pci_core.c @@ -684,6 +684,31 @@ void vfio_pci_core_disable(struct vfio_pci_core_device *vdev) } EXPORT_SYMBOL_GPL(vfio_pci_core_disable); +int vfio_pci_core_setup_barmap(struct vfio_pci_core_device *vdev, int bar) +{ + struct pci_dev *pdev = vdev->pdev; + void __iomem *io; + int ret; + + 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; +} +EXPORT_SYMBOL(vfio_pci_core_setup_barmap); + void vfio_pci_core_close_device(struct vfio_device *core_vdev) { struct vfio_pci_core_device *vdev = diff --git a/drivers/vfio/pci/vfio_pci_rdwr.c b/drivers/vfio/pci/vfio_pci_rdwr.c index e27de61ac9fe..6f08b3ecbb89 100644 --- a/drivers/vfio/pci/vfio_pci_rdwr.c +++ b/drivers/vfio/pci/vfio_pci_rdwr.c @@ -200,30 +200,6 @@ static ssize_t do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem, return done; } -static int vfio_pci_setup_barmap(struct vfio_pci_core_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_core_device *vdev, char __user *buf, size_t count, loff_t *ppos, bool iswrite) { @@ -262,7 +238,7 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_core_device *vdev, char __user *buf, } x_end = end; } else { - int ret = vfio_pci_setup_barmap(vdev, bar); + int ret = vfio_pci_core_setup_barmap(vdev, bar); if (ret) { done = ret; goto out; @@ -438,7 +414,7 @@ int vfio_pci_ioeventfd(struct vfio_pci_core_device *vdev, loff_t offset, return -EINVAL; #endif - ret = vfio_pci_setup_barmap(vdev, bar); + ret = vfio_pci_core_setup_barmap(vdev, bar); if (ret) return ret; diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h index 562e8754869d..67ac58e20e1d 100644 --- a/include/linux/vfio_pci_core.h +++ b/include/linux/vfio_pci_core.h @@ -127,6 +127,7 @@ int vfio_pci_core_match(struct vfio_device *core_vdev, char *buf); int vfio_pci_core_enable(struct vfio_pci_core_device *vdev); void vfio_pci_core_disable(struct vfio_pci_core_device *vdev); void vfio_pci_core_finish_enable(struct vfio_pci_core_device *vdev); +int vfio_pci_core_setup_barmap(struct vfio_pci_core_device *vdev, int bar); pci_ers_result_t vfio_pci_core_aer_err_detected(struct pci_dev *pdev, pci_channel_state_t state);
Expose vfio_pci_core_setup_barmap() to be used by drivers. This will let drivers to mmap a BAR and re-use it from both vfio and the driver when it's applicable. This API will be used in the next patches by the vfio/virtio coming driver. Signed-off-by: Yishai Hadas <yishaih@nvidia.com> --- drivers/vfio/pci/vfio_pci_core.c | 25 +++++++++++++++++++++++++ drivers/vfio/pci/vfio_pci_rdwr.c | 28 ++-------------------------- include/linux/vfio_pci_core.h | 1 + 3 files changed, 28 insertions(+), 26 deletions(-)