Thread (1 message) 1 message, 1 author, 2021-12-03

Re: [PATCH 5/7] vdpa: Add support for querying control virtqueue index

From: Jason Wang <hidden>
Date: 2021-12-03 02:35:48

On Thu, Dec 2, 2021 at 3:58 AM Eli Cohen [off-list ref] wrote:
Add netlink attribute and callback function to query the control VQ
index of a device.
It's better to explain the motivation of this. Actually we can deduce
it from the max_virtqueue_paris if I was not wrong. So it means the
value varies depending on if VIRTIO_NET_F_MQ is negotiated which can
be changed after a query. This may probably confuse the userspace
sometime.

Thanks
quoted hunk
Signed-off-by: Eli Cohen <redacted>
---
 drivers/vdpa/vdpa.c       | 18 ++++++++++++++++++
 include/linux/vdpa.h      |  1 +
 include/uapi/linux/vdpa.h |  1 +
 3 files changed, 20 insertions(+)
diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c
index f06f949d5fa1..ca3ab0f46188 100644
--- a/drivers/vdpa/vdpa.c
+++ b/drivers/vdpa/vdpa.c
@@ -712,6 +712,20 @@ static int vdpa_nl_cmd_dev_get_dumpit(struct sk_buff *msg, struct netlink_callba
        return msg->len;
 }

+static int vdpa_dev_net_ctrl_vq_fill(struct vdpa_device *vdev,
+                                    struct sk_buff *msg, u64 features)
+{
+       u16 val_u16 = 0;
+
+       if (features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ) &&
+           vdev->config->get_ctrl_vq_idx) {
+               val_u16 = vdev->config->get_ctrl_vq_idx(vdev);
+               return nla_put_u16(msg, VDPA_ATTR_DEV_CTRL_VQ_IDX, val_u16);
+       }
+
+       return 0;
+}
+
 static int vdpa_dev_net_mq_config_fill(struct vdpa_device *vdev,
                                       struct sk_buff *msg, u64 features,
                                       const struct virtio_net_config *config)
@@ -730,6 +744,7 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms
        struct virtio_net_config config = {};
        u64 features;
        u16 val_u16;
+       int err;

        vdpa_get_config(vdev, 0, &config, sizeof(config));
@@ -746,6 +761,9 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms
                return -EMSGSIZE;

        features = vdev->config->get_features(vdev);
+       err = vdpa_dev_net_ctrl_vq_fill(vdev, msg, features);
+       if (err)
+               return err;

        return vdpa_dev_net_mq_config_fill(vdev, msg, features, &config);
 }
diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h
index 820621c59365..fca9bfeed9ba 100644
--- a/include/linux/vdpa.h
+++ b/include/linux/vdpa.h
@@ -274,6 +274,7 @@ struct vdpa_config_ops {
        (*get_vq_notification)(struct vdpa_device *vdev, u16 idx);
        /* vq irq is not expected to be changed once DRIVER_OK is set */
        int (*get_vq_irq)(struct vdpa_device *vdev, u16 idx);
+       u16 (*get_ctrl_vq_idx)(struct vdpa_device *vdev);

        /* Device ops */
        u32 (*get_vq_align)(struct vdpa_device *vdev);
diff --git a/include/uapi/linux/vdpa.h b/include/uapi/linux/vdpa.h
index a252f06f9dfd..2e3a7f89f42d 100644
--- a/include/uapi/linux/vdpa.h
+++ b/include/uapi/linux/vdpa.h
@@ -34,6 +34,7 @@ enum vdpa_attr {
        VDPA_ATTR_DEV_MAX_VQS,                  /* u32 */
        VDPA_ATTR_DEV_MAX_VQ_SIZE,              /* u16 */
        VDPA_ATTR_DEV_MIN_VQ_SIZE,              /* u16 */
+       VDPA_ATTR_DEV_CTRL_VQ_IDX,              /* u16 */

        VDPA_ATTR_DEV_NET_CFG_MACADDR,          /* binary */
        VDPA_ATTR_DEV_NET_STATUS,               /* u8 */
--
2.33.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help