Hi, I have made some progress in this project and thought I would send these changes first before continuing. I split patch v1 [1] into two commits (#1 and #2) to make it easy to review. There are very few changes in the first commit. The second commit has not changes.
There are a few things that I am not entirely sure of in commit #3. Q1. In virtio_ring.h [2], new aliases with memory alignment enforcement such as "vring_desc_t" have been created. I am not sure if this is required for the packed vq descriptor ring (vring_packed_desc) as well. I don't see a type alias that enforces memory alignment for "vring_packed_desc" in the linux kernel. I haven't used any alias either. Q2. I see that parts of the "vhost-vdpa" implementation is based on the assumption that SVQ uses the split vq format. For example, "vhost_vdpa_svq_map_rings" [3], calls "vhost_svq_device_area_size" which is specific to split vqs. The "vhost_vring_addr" [4] struct is also specific to split vqs. My idea is to have a generic "vhost_vring_addr" structure that wraps around split and packed vq specific structures, rather than using them directly in if-else conditions wherever the vhost-vdpa functions require their usage. However, this will involve checking their impact in several other places where this struct is currently being used (eg.: "vhost-user", "vhost-backend", "libvhost-user"). Is this approach alright or is there a better alternative? I would like to get your thoughts on this before working on this portion of the project. Thanks, Sahil [1] https://lists.nongnu.org/archive/html/qemu-devel/2024-06/msg03417.html [2] https://gitlab.com/qemu-project/qemu/-/blob/master/include/standard-headers/linux/virtio_ring.h#L149 [3] https://gitlab.com/qemu-project/qemu/-/blob/master/hw/virtio/vhost-vdpa.c#L1178 [4] https://gitlab.com/qemu-project/qemu/-/blob/master/include/standard-headers/linux/vhost_types.h#L30 Changes v1 -> v2: * Split commit from RFC v1 into two commits. * vhost-shadow-virtqueue.c (vhost_svq_add_packed): - Merge with "vhost_svq_vring_write_descs_packed()" - Remove "num == 0" check (vhost_svq_add): Use "is_packed" to check vq format. (vhost_svq_get_vring_addr): Rename function. (vhost_svq_get_vring_addr_packed): New function but is yet to be implemented. (vhost_svq_memory_packed): New function. (vhost_svq_start): Support packed vq format. * vhost-shadow-virtqueue.h (struct VhostShadowVirtqueue): New member "is_packed" (vhost_svq_get_vring_addr): Renamed function. (vhost_svq_get_vring_addr_packed): New function. (vhost_svq_memory_packed): Likewise. * vhost-vdpa.c (vhost_svq_get_vring_addr): Rename function. Sahil Siddiq (3): vhost: Introduce packed vq and add buffer elements vhost: Data structure changes to support packed vqs vhost: Allocate memory for packed vring. hw/virtio/vhost-shadow-virtqueue.c | 161 ++++++++++++++++++++++++++--- hw/virtio/vhost-shadow-virtqueue.h | 76 +++++++++----- hw/virtio/vhost-vdpa.c | 4 +- 3 files changed, 198 insertions(+), 43 deletions(-) -- 2.45.2