From: "Michael S. Tsirkin" <mst@redhat.com>
To: Alvaro Karsz <alvaro.karsz@solid-run.com>
Cc: eperezma@redhat.com, viktor@daynix.com,
virtualization@lists.linux-foundation.org
Subject: Re: [PATCH] virtio-vdpa: add VIRTIO_F_NOTIFICATION_DATA feature support
Date: Sat, 8 Apr 2023 02:37:37 -0400 [thread overview]
Message-ID: <20230408023544-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20230402081034.1021886-1-alvaro.karsz@solid-run.com>
On Sun, Apr 02, 2023 at 11:10:34AM +0300, Alvaro Karsz wrote:
> Add VIRTIO_F_NOTIFICATION_DATA support for vDPA transport.
> If this feature is negotiated, the driver passes extra data when kicking
> a virtqueue.
>
> A device that offers this feature needs to implement the
> kick_vq_with_data callback.
>
> kick_vq_with_data receives the vDPA device and data.
> data includes the vqn, next_off and next_wrap for packed virtqueues.
>
> This patch follows a patch [1] by Viktor Prutyanov which adds support
> for the MMIO, channel I/O and modern PCI transports.
>
> This patch needs to be applied on top of Viktor's patch.
>
> [1] https://lore.kernel.org/lkml/20230324195029.2410503-1-viktor@daynix.com/
>
> Signed-off-by: Alvaro Karsz <alvaro.karsz@solid-run.com>
Hmm so I conclude that drivers without kick_vq_with_data
should not accept VIRTIO_F_NOTIFICATION_DATA then?
> ---
> drivers/virtio/virtio_vdpa.c | 20 ++++++++++++++++++--
> include/linux/vdpa.h | 6 ++++++
> 2 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
> index d7f5af62dda..bdaf30f7fbf 100644
> --- a/drivers/virtio/virtio_vdpa.c
> +++ b/drivers/virtio/virtio_vdpa.c
> @@ -112,6 +112,17 @@ static bool virtio_vdpa_notify(struct virtqueue *vq)
> return true;
> }
>
> +static bool virtio_vdpa_notify_with_data(struct virtqueue *vq)
> +{
> + struct vdpa_device *vdpa = vd_get_vdpa(vq->vdev);
> + const struct vdpa_config_ops *ops = vdpa->config;
> + u32 data = vring_notification_data(vq);
> +
> + ops->kick_vq_with_data(vdpa, data);
> +
> + return true;
> +}
> +
> static irqreturn_t virtio_vdpa_config_cb(void *private)
> {
> struct virtio_vdpa_device *vd_dev = private;
> @@ -138,6 +149,7 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,
> struct device *dma_dev;
> const struct vdpa_config_ops *ops = vdpa->config;
> struct virtio_vdpa_vq_info *info;
> + bool (*notify)(struct virtqueue *vq);
> struct vdpa_callback cb;
> struct virtqueue *vq;
> u64 desc_addr, driver_addr, device_addr;
> @@ -154,6 +166,11 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,
> if (index >= vdpa->nvqs)
> return ERR_PTR(-ENOENT);
>
> + if (__virtio_test_bit(vdev, VIRTIO_F_NOTIFICATION_DATA))
> + notify = virtio_vdpa_notify_with_data;
> + else
> + notify = virtio_vdpa_notify;
> +
> /* Queue shouldn't already be set up. */
> if (ops->get_vq_ready(vdpa, index))
> return ERR_PTR(-ENOENT);
> @@ -183,8 +200,7 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,
> dma_dev = vdpa_get_dma_dev(vdpa);
> vq = vring_create_virtqueue_dma(index, max_num, align, vdev,
> true, may_reduce_num, ctx,
> - virtio_vdpa_notify, callback,
> - name, dma_dev);
> + notify, callback, name, dma_dev);
> if (!vq) {
> err = -ENOMEM;
> goto error_new_virtqueue;
> diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
> index 43f59ef10cc..a83bb0501c5 100644
> --- a/include/linux/vdpa.h
> +++ b/include/linux/vdpa.h
> @@ -143,6 +143,11 @@ struct vdpa_map_file {
> * @kick_vq: Kick the virtqueue
> * @vdev: vdpa device
> * @idx: virtqueue index
> + * @kick_vq_with_data: Kick the virtqueue and supply extra data
> + * (only if VIRTIO_F_NOTIFICATION_DATA is negotiated)
> + * @vdev: vdpa device
> + * @data: includes vqn, next_off and next_wrap for
> + * packed virtqueues
> * @set_vq_cb: Set the interrupt callback function for
> * a virtqueue
> * @vdev: vdpa device
> @@ -300,6 +305,7 @@ struct vdpa_config_ops {
> u64 device_area);
> void (*set_vq_num)(struct vdpa_device *vdev, u16 idx, u32 num);
> void (*kick_vq)(struct vdpa_device *vdev, u16 idx);
> + void (*kick_vq_with_data)(struct vdpa_device *vdev, u32 data);
> void (*set_vq_cb)(struct vdpa_device *vdev, u16 idx,
> struct vdpa_callback *cb);
> void (*set_vq_ready)(struct vdpa_device *vdev, u16 idx, bool ready);
> --
> 2.34.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2023-04-08 6:37 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-02 8:10 [PATCH] virtio-vdpa: add VIRTIO_F_NOTIFICATION_DATA feature support Alvaro Karsz
2023-04-04 5:09 ` Jason Wang
2023-04-04 7:20 ` Alvaro Karsz
2023-04-04 8:05 ` Jason Wang
2023-04-04 8:16 ` Alvaro Karsz
2023-04-08 6:37 ` Michael S. Tsirkin [this message]
2023-04-08 7:32 ` Alvaro Karsz
2023-04-08 8:57 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230408023544-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=alvaro.karsz@solid-run.com \
--cc=eperezma@redhat.com \
--cc=viktor@daynix.com \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.