Hi All:
This series implements the doorbell mapping support for virtio-pci
vDPA driver. Tested with page-per-vq=on in a nested guest.
Please review
Thanks
Jason Wang (7):
virtio_pci_modern: introduce helper to map vq notify area
virtio-pci library: switch to use vp_modern_map_vq_notify()
vp_vdpa: switch to use vp_modern_map_vq_notify()
virtio_pci_modern: hide vp_modern_get_queue_notify_off()
virito_pci libray: hide vp_modern_map_capability()
virtio-pci library: report resource address
vp_vdpa: report doorbell address
drivers/vdpa/virtio_pci/vp_vdpa.c | 26 ++++++++--
drivers/virtio/virtio_pci_modern.c | 27 +---------
drivers/virtio/virtio_pci_modern_dev.c | 68 +++++++++++++++++++++-----
include/linux/virtio_pci_modern.h | 11 ++---
4 files changed, 83 insertions(+), 49 deletions(-)
--
2.18.1
This patch switch to use vp_modern_map_notify() for virtio-pci
library.
Signed-off-by: Jason Wang <[email protected]>
---
drivers/virtio/virtio_pci_modern.c | 27 ++-------------------------
1 file changed, 2 insertions(+), 25 deletions(-)
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index fbd4ebc00eb6..29607d9bd95c 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -192,7 +192,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
struct virtqueue *vq;
- u16 num, off;
+ u16 num;
int err;
if (index >= vp_modern_get_num_queues(mdev))
@@ -208,9 +208,6 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
return ERR_PTR(-EINVAL);
}
- /* get offset of notification word for this vq */
- off = vp_modern_get_queue_notify_off(mdev, index);
-
info->msix_vector = msix_vec;
/* create the vring */
@@ -227,27 +224,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
virtqueue_get_avail_addr(vq),
virtqueue_get_used_addr(vq));
- 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);
- err = -EINVAL;
- goto err_map_notify;
- }
- vq->priv = (void __force *)mdev->notify_base +
- off * mdev->notify_offset_multiplier;
- } else {
- vq->priv = (void __force *)vp_modern_map_capability(mdev,
- mdev->notify_map_cap, 2, 2,
- off * mdev->notify_offset_multiplier, 2,
- NULL);
- }
-
+ vq->priv = vp_modern_map_vq_notify(mdev, index);
if (!vq->priv) {
err = -ENOMEM;
goto err_map_notify;
--
2.18.1
This patch switches to use vp_vdpa to use vp_modern_map_notify().
Signed-off-by: Jason Wang <[email protected]>
---
drivers/vdpa/virtio_pci/vp_vdpa.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
index 1321a2fcd088..2afc90645660 100644
--- a/drivers/vdpa/virtio_pci/vp_vdpa.c
+++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
@@ -369,7 +369,6 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
struct virtio_pci_modern_device *mdev;
struct device *dev = &pdev->dev;
struct vp_vdpa *vp_vdpa;
- u16 notify_off;
int ret, i;
ret = pcim_enable_device(pdev);
@@ -415,10 +414,12 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
}
for (i = 0; i < vp_vdpa->queues; i++) {
- notify_off = vp_modern_get_queue_notify_off(mdev, i);
vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
- vp_vdpa->vring[i].notify = mdev->notify_base +
- notify_off * mdev->notify_offset_multiplier;
+ vp_vdpa->vring[i].notify = vp_modern_map_vq_notify(mdev, i);
+ if (!vp_vdpa->vring[i].notify) {
+ dev_warn(&pdev->dev, "Fail to map vq notify %d\n", i);
+ goto err;
+ }
}
vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
--
2.18.1
Sometimes it might be useful to report the capability physical
address. One example is to report the physical address of the doorbell
in order to be mapped by userspace.
Signed-off-by: Jason Wang <[email protected]>
---
drivers/vdpa/virtio_pci/vp_vdpa.c | 3 ++-
drivers/virtio/virtio_pci_modern.c | 2 +-
drivers/virtio/virtio_pci_modern_dev.c | 24 +++++++++++++++++-------
include/linux/virtio_pci_modern.h | 4 +++-
4 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
index 2afc90645660..98205e54d089 100644
--- a/drivers/vdpa/virtio_pci/vp_vdpa.c
+++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
@@ -415,7 +415,8 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
for (i = 0; i < vp_vdpa->queues; i++) {
vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
- vp_vdpa->vring[i].notify = vp_modern_map_vq_notify(mdev, i);
+ vp_vdpa->vring[i].notify =
+ vp_modern_map_vq_notify(mdev, i, NULL);
if (!vp_vdpa->vring[i].notify) {
dev_warn(&pdev->dev, "Fail to map vq notify %d\n", i);
goto err;
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index 29607d9bd95c..722ea44e7579 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -224,7 +224,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
virtqueue_get_avail_addr(vq),
virtqueue_get_used_addr(vq));
- vq->priv = vp_modern_map_vq_notify(mdev, index);
+ vq->priv = vp_modern_map_vq_notify(mdev, index, NULL);
if (!vq->priv) {
err = -ENOMEM;
goto err_map_notify;
diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
index 9c241c9bd920..ae87b3fa8858 100644
--- a/drivers/virtio/virtio_pci_modern_dev.c
+++ b/drivers/virtio/virtio_pci_modern_dev.c
@@ -13,13 +13,14 @@
* @start: start from the capability
* @size: map size
* @len: the length that is actually mapped
+ * @pa: physical address of the capability
*
* Returns the io address of for the part of the capability
*/
static void __iomem *
vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
size_t minlen, u32 align, u32 start, u32 size,
- size_t *len)
+ size_t *len, resource_size_t *pa)
{
struct pci_dev *dev = mdev->pci_dev;
u8 bar;
@@ -87,6 +88,9 @@ vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
dev_err(&dev->dev,
"virtio_pci: unable to map virtio %u@%u on bar %i\n",
length, offset, bar);
+ else if (pa)
+ *pa = pci_resource_start(dev, bar) + offset;
+
return p;
}
@@ -273,12 +277,12 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev)
mdev->common = vp_modern_map_capability(mdev, common,
sizeof(struct virtio_pci_common_cfg), 4,
0, sizeof(struct virtio_pci_common_cfg),
- NULL);
+ NULL, NULL);
if (!mdev->common)
goto err_map_common;
mdev->isr = vp_modern_map_capability(mdev, isr, sizeof(u8), 1,
0, 1,
- NULL);
+ NULL, NULL);
if (!mdev->isr)
goto err_map_isr;
@@ -306,7 +310,8 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev)
mdev->notify_base = vp_modern_map_capability(mdev, notify,
2, 2,
0, notify_length,
- &mdev->notify_len);
+ &mdev->notify_len,
+ &mdev->notify_pa);
if (!mdev->notify_base)
goto err_map_notify;
} else {
@@ -319,7 +324,8 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev)
if (device) {
mdev->device = vp_modern_map_capability(mdev, device, 0, 4,
0, PAGE_SIZE,
- &mdev->device_len);
+ &mdev->device_len,
+ NULL);
if (!mdev->device)
goto err_map_device;
}
@@ -595,11 +601,12 @@ static u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
* specific virtqueue
* @mdev: the modern virtio-pci device
* @index: the queue index
+ * @pa: the pointer to the physical address of the nofity area
*
* Returns the address of the notification area
*/
void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
- u16 index)
+ u16 index, resource_size_t *pa)
{
u16 off = vp_modern_get_queue_notify_off(mdev, index);
@@ -614,13 +621,16 @@ void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
index, mdev->notify_len);
return NULL;
}
+ if (pa)
+ *pa = mdev->notify_pa +
+ off * mdev->notify_offset_multiplier;
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);
+ NULL, pa);
}
}
EXPORT_SYMBOL_GPL(vp_modern_map_vq_notify);
diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
index e6e7072413c1..cdfabbefacdf 100644
--- a/include/linux/virtio_pci_modern.h
+++ b/include/linux/virtio_pci_modern.h
@@ -13,6 +13,8 @@ struct virtio_pci_modern_device {
void __iomem *device;
/* Base of vq notifications (non-legacy mode). */
void __iomem *notify_base;
+ /* Physical base of vq notifications */
+ resource_size_t notify_pa;
/* Where to read and clear interrupt */
u8 __iomem *isr;
@@ -100,7 +102,7 @@ u16 vp_modern_get_queue_size(struct virtio_pci_modern_device *mdev,
u16 idx);
u16 vp_modern_get_num_queues(struct virtio_pci_modern_device *mdev);
void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
- u16 index);
+ u16 index, resource_size_t *pa);
int vp_modern_probe(struct virtio_pci_modern_device *mdev);
void vp_modern_remove(struct virtio_pci_modern_device *mdev);
#endif
--
2.18.1
No user now and the capability should not be setup
externally. Instead, every access to the capability should be done via
virtio_pci_modern_device.
Signed-off-by: Jason Wang <[email protected]>
---
drivers/virtio/virtio_pci_modern_dev.c | 10 ++++------
include/linux/virtio_pci_modern.h | 5 -----
2 files changed, 4 insertions(+), 11 deletions(-)
diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
index 5a657e56b46d..9c241c9bd920 100644
--- a/drivers/virtio/virtio_pci_modern_dev.c
+++ b/drivers/virtio/virtio_pci_modern_dev.c
@@ -16,11 +16,10 @@
*
* Returns the io address of for the part of the capability
*/
-void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
- size_t minlen,
- u32 align,
- u32 start, u32 size,
- size_t *len)
+static void __iomem *
+vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
+ size_t minlen, u32 align, u32 start, u32 size,
+ size_t *len)
{
struct pci_dev *dev = mdev->pci_dev;
u8 bar;
@@ -90,7 +89,6 @@ void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, in
length, offset, bar);
return p;
}
-EXPORT_SYMBOL_GPL(vp_modern_map_capability);
/**
* virtio_pci_find_capability - walk capabilities to find device info.
diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
index 179a2fb4bf37..e6e7072413c1 100644
--- a/include/linux/virtio_pci_modern.h
+++ b/include/linux/virtio_pci_modern.h
@@ -99,11 +99,6 @@ void vp_modern_set_queue_size(struct virtio_pci_modern_device *mdev,
u16 vp_modern_get_queue_size(struct virtio_pci_modern_device *mdev,
u16 idx);
u16 vp_modern_get_num_queues(struct virtio_pci_modern_device *mdev);
-void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
- size_t minlen,
- 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);
--
2.18.1
All users (both virtio-pci library and vp_vdpa driver) has been
switched to use vp_modern_map_vq_notify(). So there's no need to
export the low level helper of vp_modern_get_queue_notify_off().
Signed-off-by: Jason Wang <[email protected]>
---
drivers/virtio/virtio_pci_modern_dev.c | 5 ++---
include/linux/virtio_pci_modern.h | 2 --
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
index 28cb5847fafa..5a657e56b46d 100644
--- a/drivers/virtio/virtio_pci_modern_dev.c
+++ b/drivers/virtio/virtio_pci_modern_dev.c
@@ -584,14 +584,13 @@ EXPORT_SYMBOL_GPL(vp_modern_get_num_queues);
*
* Returns the notification offset for a virtqueue
*/
-u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
- u16 index)
+static u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
+ u16 index)
{
vp_iowrite16(index, &mdev->common->queue_select);
return vp_ioread16(&mdev->common->queue_notify_off);
}
-EXPORT_SYMBOL_GPL(vp_modern_get_queue_notify_off);
/*
* vp_modern_map_vq_notify - map notification area for a
diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
index 1b95d39b00fc..179a2fb4bf37 100644
--- a/include/linux/virtio_pci_modern.h
+++ b/include/linux/virtio_pci_modern.h
@@ -99,8 +99,6 @@ void vp_modern_set_queue_size(struct virtio_pci_modern_device *mdev,
u16 vp_modern_get_queue_size(struct virtio_pci_modern_device *mdev,
u16 idx);
u16 vp_modern_get_num_queues(struct virtio_pci_modern_device *mdev);
-u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
- u16 idx);
void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
size_t minlen,
u32 align,
--
2.18.1
This patch reports the per vq doorbell location and size to vDPA
bus. Userspace can then map the doorbell via mmap() via vhost-vDPA bus
driver.
Signed-off-by: Jason Wang <[email protected]>
---
drivers/vdpa/virtio_pci/vp_vdpa.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
index 98205e54d089..002b928d0ca1 100644
--- a/drivers/vdpa/virtio_pci/vp_vdpa.c
+++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
@@ -26,6 +26,7 @@ struct vp_vring {
void __iomem *notify;
char msix_name[VP_VDPA_NAME_SIZE];
struct vdpa_callback cb;
+ resource_size_t notify_pa;
int irq;
};
@@ -336,6 +337,19 @@ static void vp_vdpa_set_config_cb(struct vdpa_device *vdpa,
vp_vdpa->config_cb = *cb;
}
+static struct vdpa_notification_area
+vp_vdpa_get_vq_notification(struct vdpa_device *vdpa, u16 qid)
+{
+ struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
+ struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
+ struct vdpa_notification_area notify;
+
+ notify.addr = vp_vdpa->vring[qid].notify_pa;
+ notify.size = mdev->notify_offset_multiplier;
+
+ return notify;
+}
+
static const struct vdpa_config_ops vp_vdpa_ops = {
.get_features = vp_vdpa_get_features,
.set_features = vp_vdpa_set_features,
@@ -343,6 +357,7 @@ static const struct vdpa_config_ops vp_vdpa_ops = {
.set_status = vp_vdpa_set_status,
.get_vq_num_max = vp_vdpa_get_vq_num_max,
.get_vq_state = vp_vdpa_get_vq_state,
+ .get_vq_notification = vp_vdpa_get_vq_notification,
.set_vq_state = vp_vdpa_set_vq_state,
.set_vq_cb = vp_vdpa_set_vq_cb,
.set_vq_ready = vp_vdpa_set_vq_ready,
@@ -416,7 +431,8 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
for (i = 0; i < vp_vdpa->queues; i++) {
vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
vp_vdpa->vring[i].notify =
- vp_modern_map_vq_notify(mdev, i, NULL);
+ vp_modern_map_vq_notify(mdev, i,
+ &vp_vdpa->vring[i].notify_pa);
if (!vp_vdpa->vring[i].notify) {
dev_warn(&pdev->dev, "Fail to map vq notify %d\n", i);
goto err;
--
2.18.1
On Thu, Apr 15, 2021 at 03:31:45AM -0400, Jason Wang wrote:
> No user now and the capability should not be setup
> externally. Instead, every access to the capability should be done via
> virtio_pci_modern_device.
>
> Signed-off-by: Jason Wang <[email protected]>
Reviewed-by: Eli Cohen <[email protected]>
> ---
> drivers/virtio/virtio_pci_modern_dev.c | 10 ++++------
> include/linux/virtio_pci_modern.h | 5 -----
> 2 files changed, 4 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
> index 5a657e56b46d..9c241c9bd920 100644
> --- a/drivers/virtio/virtio_pci_modern_dev.c
> +++ b/drivers/virtio/virtio_pci_modern_dev.c
> @@ -16,11 +16,10 @@
> *
> * Returns the io address of for the part of the capability
> */
> -void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
> - size_t minlen,
> - u32 align,
> - u32 start, u32 size,
> - size_t *len)
> +static void __iomem *
> +vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
> + size_t minlen, u32 align, u32 start, u32 size,
> + size_t *len)
> {
> struct pci_dev *dev = mdev->pci_dev;
> u8 bar;
> @@ -90,7 +89,6 @@ void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, in
> length, offset, bar);
> return p;
> }
> -EXPORT_SYMBOL_GPL(vp_modern_map_capability);
>
> /**
> * virtio_pci_find_capability - walk capabilities to find device info.
> diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
> index 179a2fb4bf37..e6e7072413c1 100644
> --- a/include/linux/virtio_pci_modern.h
> +++ b/include/linux/virtio_pci_modern.h
> @@ -99,11 +99,6 @@ void vp_modern_set_queue_size(struct virtio_pci_modern_device *mdev,
> u16 vp_modern_get_queue_size(struct virtio_pci_modern_device *mdev,
> u16 idx);
> u16 vp_modern_get_num_queues(struct virtio_pci_modern_device *mdev);
> -void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
> - size_t minlen,
> - 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);
> --
> 2.18.1
>
On Thu, Apr 15, 2021 at 03:31:47AM -0400, Jason Wang wrote:
> This patch reports the per vq doorbell location and size to vDPA
> bus. Userspace can then map the doorbell via mmap() via vhost-vDPA bus
> driver.
>
> Signed-off-by: Jason Wang <[email protected]>
Reviewed-by: Eli Cohen <[email protected]>
> ---
> drivers/vdpa/virtio_pci/vp_vdpa.c | 18 +++++++++++++++++-
> 1 file changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index 98205e54d089..002b928d0ca1 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -26,6 +26,7 @@ struct vp_vring {
> void __iomem *notify;
> char msix_name[VP_VDPA_NAME_SIZE];
> struct vdpa_callback cb;
> + resource_size_t notify_pa;
> int irq;
> };
>
> @@ -336,6 +337,19 @@ static void vp_vdpa_set_config_cb(struct vdpa_device *vdpa,
> vp_vdpa->config_cb = *cb;
> }
>
> +static struct vdpa_notification_area
> +vp_vdpa_get_vq_notification(struct vdpa_device *vdpa, u16 qid)
> +{
> + struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> + struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
> + struct vdpa_notification_area notify;
> +
> + notify.addr = vp_vdpa->vring[qid].notify_pa;
> + notify.size = mdev->notify_offset_multiplier;
> +
> + return notify;
> +}
> +
> static const struct vdpa_config_ops vp_vdpa_ops = {
> .get_features = vp_vdpa_get_features,
> .set_features = vp_vdpa_set_features,
> @@ -343,6 +357,7 @@ static const struct vdpa_config_ops vp_vdpa_ops = {
> .set_status = vp_vdpa_set_status,
> .get_vq_num_max = vp_vdpa_get_vq_num_max,
> .get_vq_state = vp_vdpa_get_vq_state,
> + .get_vq_notification = vp_vdpa_get_vq_notification,
> .set_vq_state = vp_vdpa_set_vq_state,
> .set_vq_cb = vp_vdpa_set_vq_cb,
> .set_vq_ready = vp_vdpa_set_vq_ready,
> @@ -416,7 +431,8 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> for (i = 0; i < vp_vdpa->queues; i++) {
> vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
> vp_vdpa->vring[i].notify =
> - vp_modern_map_vq_notify(mdev, i, NULL);
> + vp_modern_map_vq_notify(mdev, i,
> + &vp_vdpa->vring[i].notify_pa);
> if (!vp_vdpa->vring[i].notify) {
> dev_warn(&pdev->dev, "Fail to map vq notify %d\n", i);
> goto err;
> --
> 2.18.1
>
On Thu, Apr 15, 2021 at 03:31:44AM -0400, Jason Wang wrote:
> All users (both virtio-pci library and vp_vdpa driver) has been
> switched to use vp_modern_map_vq_notify(). So there's no need to
> export the low level helper of vp_modern_get_queue_notify_off().
>
> Signed-off-by: Jason Wang <[email protected]>
Reviewed-by: Eli Cohen <[email protected]>
> ---
> drivers/virtio/virtio_pci_modern_dev.c | 5 ++---
> include/linux/virtio_pci_modern.h | 2 --
> 2 files changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
> index 28cb5847fafa..5a657e56b46d 100644
> --- a/drivers/virtio/virtio_pci_modern_dev.c
> +++ b/drivers/virtio/virtio_pci_modern_dev.c
> @@ -584,14 +584,13 @@ EXPORT_SYMBOL_GPL(vp_modern_get_num_queues);
> *
> * Returns the notification offset for a virtqueue
> */
> -u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
> - u16 index)
> +static u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
> + u16 index)
> {
> vp_iowrite16(index, &mdev->common->queue_select);
>
> return vp_ioread16(&mdev->common->queue_notify_off);
> }
> -EXPORT_SYMBOL_GPL(vp_modern_get_queue_notify_off);
>
> /*
> * vp_modern_map_vq_notify - map notification area for a
> diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
> index 1b95d39b00fc..179a2fb4bf37 100644
> --- a/include/linux/virtio_pci_modern.h
> +++ b/include/linux/virtio_pci_modern.h
> @@ -99,8 +99,6 @@ void vp_modern_set_queue_size(struct virtio_pci_modern_device *mdev,
> u16 vp_modern_get_queue_size(struct virtio_pci_modern_device *mdev,
> u16 idx);
> u16 vp_modern_get_num_queues(struct virtio_pci_modern_device *mdev);
> -u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
> - u16 idx);
> void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off,
> size_t minlen,
> u32 align,
> --
> 2.18.1
>
On Thu, Apr 15, 2021 at 03:31:42AM -0400, Jason Wang wrote:
> This patch switch to use vp_modern_map_notify() for virtio-pci
> library.
>
> Signed-off-by: Jason Wang <[email protected]>
Reviewed-by: Eli Cohen <[email protected]>
> ---
> drivers/virtio/virtio_pci_modern.c | 27 ++-------------------------
> 1 file changed, 2 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
> index fbd4ebc00eb6..29607d9bd95c 100644
> --- a/drivers/virtio/virtio_pci_modern.c
> +++ b/drivers/virtio/virtio_pci_modern.c
> @@ -192,7 +192,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
>
> struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
> struct virtqueue *vq;
> - u16 num, off;
> + u16 num;
> int err;
>
> if (index >= vp_modern_get_num_queues(mdev))
> @@ -208,9 +208,6 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
> return ERR_PTR(-EINVAL);
> }
>
> - /* get offset of notification word for this vq */
> - off = vp_modern_get_queue_notify_off(mdev, index);
> -
> info->msix_vector = msix_vec;
>
> /* create the vring */
> @@ -227,27 +224,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
> virtqueue_get_avail_addr(vq),
> virtqueue_get_used_addr(vq));
>
> - 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);
> - err = -EINVAL;
> - goto err_map_notify;
> - }
> - vq->priv = (void __force *)mdev->notify_base +
> - off * mdev->notify_offset_multiplier;
> - } else {
> - vq->priv = (void __force *)vp_modern_map_capability(mdev,
> - mdev->notify_map_cap, 2, 2,
> - off * mdev->notify_offset_multiplier, 2,
> - NULL);
> - }
> -
> + vq->priv = vp_modern_map_vq_notify(mdev, index);
> if (!vq->priv) {
> err = -ENOMEM;
> goto err_map_notify;
> --
> 2.18.1
>
On Thu, Apr 15, 2021 at 03:31:43AM -0400, Jason Wang wrote:
> This patch switches to use vp_vdpa to use vp_modern_map_notify().
>
> Signed-off-by: Jason Wang <[email protected]>
Reviewed-by: Eli Cohen <[email protected]>
> ---
> drivers/vdpa/virtio_pci/vp_vdpa.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/vdpa/virtio_pci/vp_vdpa.c b/drivers/vdpa/virtio_pci/vp_vdpa.c
> index 1321a2fcd088..2afc90645660 100644
> --- a/drivers/vdpa/virtio_pci/vp_vdpa.c
> +++ b/drivers/vdpa/virtio_pci/vp_vdpa.c
> @@ -369,7 +369,6 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> struct virtio_pci_modern_device *mdev;
> struct device *dev = &pdev->dev;
> struct vp_vdpa *vp_vdpa;
> - u16 notify_off;
> int ret, i;
>
> ret = pcim_enable_device(pdev);
> @@ -415,10 +414,12 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> }
>
> for (i = 0; i < vp_vdpa->queues; i++) {
> - notify_off = vp_modern_get_queue_notify_off(mdev, i);
> vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
> - vp_vdpa->vring[i].notify = mdev->notify_base +
> - notify_off * mdev->notify_offset_multiplier;
> + vp_vdpa->vring[i].notify = vp_modern_map_vq_notify(mdev, i);
> + if (!vp_vdpa->vring[i].notify) {
> + dev_warn(&pdev->dev, "Fail to map vq notify %d\n", i);
> + goto err;
> + }
> }
> vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
>
> --
> 2.18.1
>