2021-04-15 07:33:26

by Jason Wang

[permalink] [raw]
Subject: [PATCH 1/7] virtio_pci_modern: introduce helper to map vq notify area

This patch factors out the logic of vq notify area mapping. Following
patches will switch to use this common helpers for both virtio_pci
library and virtio-pci vDPA driver.

Signed-off-by: Jason Wang <[email protected]>
---
drivers/virtio/virtio_pci_modern_dev.c | 35 ++++++++++++++++++++++++++
include/linux/virtio_pci_modern.h | 2 ++
2 files changed, 37 insertions(+)

diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
index cbd667496bb1..28cb5847fafa 100644
--- a/drivers/virtio/virtio_pci_modern_dev.c
+++ b/drivers/virtio/virtio_pci_modern_dev.c
@@ -593,6 +593,41 @@ u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
}
EXPORT_SYMBOL_GPL(vp_modern_get_queue_notify_off);

+/*
+ * vp_modern_map_vq_notify - map notification area for a
+ * specific virtqueue
+ * @mdev: the modern virtio-pci device
+ * @index: the queue index
+ *
+ * Returns the address of the notification area
+ */
+void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
+ u16 index)
+{
+ u16 off = vp_modern_get_queue_notify_off(mdev, index);
+
+ if (mdev->notify_base) {
+ /* offset should not wrap */
+ if ((u64)off * mdev->notify_offset_multiplier + 2
+ > mdev->notify_len) {
+ dev_warn(&mdev->pci_dev->dev,
+ "bad notification offset %u (x %u) "
+ "for queue %u > %zd",
+ off, mdev->notify_offset_multiplier,
+ index, mdev->notify_len);
+ return NULL;
+ }
+ return (void __force *)mdev->notify_base +
+ off * mdev->notify_offset_multiplier;
+ } else {
+ return (void __force *)vp_modern_map_capability(mdev,
+ mdev->notify_map_cap, 2, 2,
+ off * mdev->notify_offset_multiplier, 2,
+ NULL);
+ }
+}
+EXPORT_SYMBOL_GPL(vp_modern_map_vq_notify);
+
MODULE_VERSION("0.1");
MODULE_DESCRIPTION("Modern Virtio PCI Device");
MODULE_AUTHOR("Jason Wang <[email protected]>");
diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
index f26acbeec965..1b95d39b00fc 100644
--- a/include/linux/virtio_pci_modern.h
+++ b/include/linux/virtio_pci_modern.h
@@ -106,6 +106,8 @@ void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, in
u32 align,
u32 start, u32 size,
size_t *len);
+void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
+ u16 index);
int vp_modern_probe(struct virtio_pci_modern_device *mdev);
void vp_modern_remove(struct virtio_pci_modern_device *mdev);
#endif
--
2.18.1


2021-04-21 09:55:15

by Eli Cohen

[permalink] [raw]
Subject: Re: [PATCH 1/7] virtio_pci_modern: introduce helper to map vq notify area

On Thu, Apr 15, 2021 at 03:31:41AM -0400, Jason Wang wrote:
> This patch factors out the logic of vq notify area mapping. Following
> patches will switch to use this common helpers for both virtio_pci
> library and virtio-pci vDPA driver.
>
> Signed-off-by: Jason Wang <[email protected]>

Reviewed-by: Eli Cohen <[email protected]>

> ---
> drivers/virtio/virtio_pci_modern_dev.c | 35 ++++++++++++++++++++++++++
> include/linux/virtio_pci_modern.h | 2 ++
> 2 files changed, 37 insertions(+)
>
> diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
> index cbd667496bb1..28cb5847fafa 100644
> --- a/drivers/virtio/virtio_pci_modern_dev.c
> +++ b/drivers/virtio/virtio_pci_modern_dev.c
> @@ -593,6 +593,41 @@ u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
> }
> EXPORT_SYMBOL_GPL(vp_modern_get_queue_notify_off);
>
> +/*
> + * vp_modern_map_vq_notify - map notification area for a
> + * specific virtqueue
> + * @mdev: the modern virtio-pci device
> + * @index: the queue index
> + *
> + * Returns the address of the notification area
> + */
> +void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
> + u16 index)
> +{
> + u16 off = vp_modern_get_queue_notify_off(mdev, index);
> +
> + if (mdev->notify_base) {
> + /* offset should not wrap */
> + if ((u64)off * mdev->notify_offset_multiplier + 2
> + > mdev->notify_len) {
> + dev_warn(&mdev->pci_dev->dev,
> + "bad notification offset %u (x %u) "
> + "for queue %u > %zd",
> + off, mdev->notify_offset_multiplier,
> + index, mdev->notify_len);
> + return NULL;
> + }
> + return (void __force *)mdev->notify_base +
> + off * mdev->notify_offset_multiplier;
> + } else {
> + return (void __force *)vp_modern_map_capability(mdev,
> + mdev->notify_map_cap, 2, 2,
> + off * mdev->notify_offset_multiplier, 2,
> + NULL);
> + }
> +}
> +EXPORT_SYMBOL_GPL(vp_modern_map_vq_notify);
> +
> MODULE_VERSION("0.1");
> MODULE_DESCRIPTION("Modern Virtio PCI Device");
> MODULE_AUTHOR("Jason Wang <[email protected]>");
> diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
> index f26acbeec965..1b95d39b00fc 100644
> --- a/include/linux/virtio_pci_modern.h
> +++ b/include/linux/virtio_pci_modern.h
> @@ -106,6 +106,8 @@ void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, in
> u32 align,
> u32 start, u32 size,
> size_t *len);
> +void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
> + u16 index);
> int vp_modern_probe(struct virtio_pci_modern_device *mdev);
> void vp_modern_remove(struct virtio_pci_modern_device *mdev);
> #endif
> --
> 2.18.1
>