Si-Wei Liu
2021-Dec-09 00:59 UTC
[PATCH v1 6/7] vdpa: Add support for querying control virtqueue index
On 12/8/2021 12:14 PM, Eli Cohen wrote:> Add netlink attribute and callback function to query the control VQ > index of a device. > > Example: > > $ vdpa dev config show vdpa-a > vdpa-a: mac 00:00:00:00:88:88 link up link_announce false max_vq_pairs 5 \ > mtu 9000 ctrl_vq_idx 10First, I am not sure if there's value or a case showing that expose and trace the guest ctrl_vq_idx value (running state) to admin users turns out to be useful. Previously I thought you want to expose it to QEMU but it seems this is a bit redundant, which can be deduced from max_vqp passing up to QEMU. Second, I don't feel running states such as link_announce and ctrl_vq_idx are qualified to be configuration field that can be displayed in 'vdpa dev config show'. Could you please clarify the scope for what kind of info this command should cover? -Siwei> > Signed-off-by: Eli Cohen <elic at nvidia.com> > --- > v0 -> v1: > 1. Use logic defined in the spec to deduce virtqueue index. > > drivers/vdpa/vdpa.c | 25 +++++++++++++++++++++++++ > include/uapi/linux/vdpa.h | 1 + > 2 files changed, 26 insertions(+) > > diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c > index 3bf016e03512..b4d4b8a7ca4e 100644 > --- a/drivers/vdpa/vdpa.c > +++ b/drivers/vdpa/vdpa.c > @@ -712,6 +712,27 @@ 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, > + struct virtio_net_config *config, > + u64 features) > +{ > + u16 N; > + > + /* control VQ index, if available, is deduced according to the logic > + * described in the virtio spec in section 5.1.2 > + */ > + if (!(features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ))) > + return 0; > + > + if (features & BIT_ULL(VIRTIO_NET_F_MQ)) > + N = le16_to_cpu(config->max_virtqueue_pairs); > + else > + N = 1; > + > + return nla_put_u16(msg, VDPA_ATTR_DEV_CTRL_VQ_IDX, 2 * N); > +} > + > 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 +751,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 +768,9 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms > return -EMSGSIZE; > > features = vdev->config->get_driver_features(vdev); > + err = vdpa_dev_net_ctrl_vq_fill(vdev, msg, &config, features); > + if (err) > + return err; > > return vdpa_dev_net_mq_config_fill(vdev, msg, features, &config); > } > 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 */