2021-04-15 07:33:32

by Jason Wang

[permalink] [raw]
Subject: [PATCH 0/7] Doorbell mapping support for virito-pci vDPA

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


2021-04-15 07:33:42

by Jason Wang

[permalink] [raw]
Subject: [PATCH 2/7] virtio-pci library: switch to use vp_modern_map_vq_notify()

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

2021-04-15 07:33:50

by Jason Wang

[permalink] [raw]
Subject: [PATCH 3/7] vp_vdpa: switch to use vp_modern_map_vq_notify()

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

2021-04-15 07:34:07

by Jason Wang

[permalink] [raw]
Subject: [PATCH 6/7] virtio-pci library: report resource address

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

2021-04-15 07:34:14

by Jason Wang

[permalink] [raw]
Subject: [PATCH 5/7] virito_pci libray: hide vp_modern_map_capability()

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

2021-04-15 07:34:32

by Jason Wang

[permalink] [raw]
Subject: [PATCH 4/7] virtio_pci_modern: hide vp_modern_get_queue_notify_off()

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

2021-04-15 07:34:55

by Jason Wang

[permalink] [raw]
Subject: [PATCH 7/7] vp_vdpa: report doorbell address

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

2021-04-21 08:04:24

by Eli Cohen

[permalink] [raw]
Subject: Re: [PATCH 5/7] virito_pci libray: hide vp_modern_map_capability()

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
>

2021-04-21 08:44:35

by Eli Cohen

[permalink] [raw]
Subject: Re: [PATCH 7/7] vp_vdpa: report doorbell address

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
>

2021-04-21 08:46:01

by Eli Cohen

[permalink] [raw]
Subject: Re: [PATCH 4/7] virtio_pci_modern: hide vp_modern_get_queue_notify_off()

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
>

2021-04-21 09:55:02

by Eli Cohen

[permalink] [raw]
Subject: Re: [PATCH 2/7] virtio-pci library: switch to use vp_modern_map_vq_notify()

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
>

2021-04-21 09:55:26

by Eli Cohen

[permalink] [raw]
Subject: Re: [PATCH 3/7] vp_vdpa: switch to use vp_modern_map_vq_notify()

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
>