Message ID | 20220315032553.455-2-longpeng2@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vdpa: add two ioctl commands to support generic vDPA | expand |
On Tue, Mar 15, 2022 at 11:25:51AM +0800, Longpeng(Mike) wrote: >From: Longpeng <longpeng2@huawei.com> > >- GET_CONFIG_SIZE: return the size of the virtio config space. > >The size contains the fields which are conditional on feature >bits. > >Acked-by: Jason Wang <jasowang@redhat.com> >Signed-off-by: Longpeng <longpeng2@huawei.com> >--- > drivers/vhost/vdpa.c | 17 +++++++++++++++++ > include/linux/vdpa.h | 3 ++- > include/uapi/linux/vhost.h | 4 ++++ > 3 files changed, 23 insertions(+), 1 deletion(-) > >diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c >index ec5249e..605c7ae 100644 >--- a/drivers/vhost/vdpa.c >+++ b/drivers/vhost/vdpa.c >@@ -355,6 +355,20 @@ static long vhost_vdpa_get_iova_range(struct vhost_vdpa *v, u32 __user *argp) > return 0; > } > >+static long vhost_vdpa_get_config_size(struct vhost_vdpa *v, u32 __user *argp) >+{ >+ struct vdpa_device *vdpa = v->vdpa; >+ const struct vdpa_config_ops *ops = vdpa->config; >+ u32 size; >+ >+ size = ops->get_config_size(vdpa); get_config_size() returns a size_t, perhaps we could have a comment here where we say we don't expect there to be an overflow. I don't have a strong opinion on this, and I wouldn't want to get you to repin just for that, so: Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index ec5249e..605c7ae 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -355,6 +355,20 @@ static long vhost_vdpa_get_iova_range(struct vhost_vdpa *v, u32 __user *argp) return 0; } +static long vhost_vdpa_get_config_size(struct vhost_vdpa *v, u32 __user *argp) +{ + struct vdpa_device *vdpa = v->vdpa; + const struct vdpa_config_ops *ops = vdpa->config; + u32 size; + + size = ops->get_config_size(vdpa); + + if (copy_to_user(argp, &size, sizeof(size))) + return -EFAULT; + + return 0; +} + static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, void __user *argp) { @@ -492,6 +506,9 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep, case VHOST_VDPA_GET_IOVA_RANGE: r = vhost_vdpa_get_iova_range(v, argp); break; + case VHOST_VDPA_GET_CONFIG_SIZE: + r = vhost_vdpa_get_config_size(v, argp); + break; default: r = vhost_dev_ioctl(&v->vdev, cmd, argp); if (r == -ENOIOCTLCMD) diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h index 721089b..a526919 100644 --- a/include/linux/vdpa.h +++ b/include/linux/vdpa.h @@ -207,7 +207,8 @@ struct vdpa_map_file { * @reset: Reset device * @vdev: vdpa device * Returns integer: success (0) or error (< 0) - * @get_config_size: Get the size of the configuration space + * @get_config_size: Get the size of the configuration space includes + * fields that are conditional on feature bits. * @vdev: vdpa device * Returns size_t: configuration size * @get_config: Read from device specific configuration space diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h index c998860..bc74e95 100644 --- a/include/uapi/linux/vhost.h +++ b/include/uapi/linux/vhost.h @@ -150,4 +150,8 @@ /* Get the valid iova range */ #define VHOST_VDPA_GET_IOVA_RANGE _IOR(VHOST_VIRTIO, 0x78, \ struct vhost_vdpa_iova_range) + +/* Get the config size */ +#define VHOST_VDPA_GET_CONFIG_SIZE _IOR(VHOST_VIRTIO, 0x79, __u32) + #endif