Jason Wang
2021-Dec-03 02:35 UTC
[PATCH 5/7] vdpa: Add support for querying control virtqueue index
On Thu, Dec 2, 2021 at 3:58 AM Eli Cohen <elic at nvidia.com> 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> > Signed-off-by: Eli Cohen <elic at nvidia.com> > --- > 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 >