2022-03-16 15:10:47

by Longpeng(Mike)

[permalink] [raw]
Subject: [PATCH v2 0/3] vdpa: add two ioctl commands to support generic vDPA

From: Longpeng <[email protected]>

To support generic vdpa deivce[1], we need add the following ioctls:
- GET_CONFIG_SIZE: the size of the virtio config space (Patch 1)
- GET_VQS_COUNT: the count of virtqueues that exposed (Patch 2)

Changes v2 -> v3:
Patch 2:
- use a separate patch for the u32 converting. [Jason]

Changes v1(RFC) -> v2:
Patch 1:
- be more verbose in commit message and the comment for get_config_size
[Jason]
Patch 2:
- change the type of nvqs to u32 [Jason]
Patch 3:
- drop from this series because Gautam sent another proposal[2]

[1] https://lore.kernel.org/all/[email protected]/
[2] https://patchwork.kernel.org/project/kvm/patch/[email protected]/

Longpeng (3):
vdpa: support exposing the config size to userspace
vdpa: change the type of nvqs to u32
vdpa: support exposing the count of vqs to userspace

drivers/vdpa/vdpa.c | 6 +++---
drivers/vhost/vdpa.c | 40 ++++++++++++++++++++++++++++++++++++----
include/linux/vdpa.h | 9 +++++----
include/uapi/linux/vhost.h | 7 +++++++
4 files changed, 51 insertions(+), 11 deletions(-)

--
1.8.3.1


2022-03-17 05:02:39

by Longpeng(Mike)

[permalink] [raw]
Subject: [PATCH v2 1/3] vdpa: support exposing the config size to userspace

From: Longpeng <[email protected]>

- 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 <[email protected]>
Signed-off-by: Longpeng <[email protected]>
---
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);
+
+ 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
--
1.8.3.1