Shannon Nelson
2023-Apr-21 19:56 UTC
[PATCH 3/3] vhost_vdpa: support PACKED when setting-getting vring_base
Use the right structs for PACKED or split vqs when setting and
getting the vring base.
Signed-off-by: Shannon Nelson <shannon.nelson at amd.com>
---
drivers/vhost/vdpa.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
index 599b8cc238c7..2543ae9d5939 100644
--- a/drivers/vhost/vdpa.c
+++ b/drivers/vhost/vdpa.c
@@ -585,7 +585,12 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v,
unsigned int cmd,
if (r)
return r;
- vq->last_avail_idx = vq_state.split.avail_index;
+ if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) {
+ vq->last_avail_idx = vq_state.packed.last_avail_idx;
+ vq->last_used_idx = vq_state.packed.last_used_idx;
+ } else {
+ vq->last_avail_idx = vq_state.split.avail_index;
+ }
break;
}
@@ -603,9 +608,15 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v,
unsigned int cmd,
break;
case VHOST_SET_VRING_BASE:
- vq_state.split.avail_index = vq->last_avail_idx;
- if (ops->set_vq_state(vdpa, idx, &vq_state))
- r = -EINVAL;
+ if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) {
+ vq_state.packed.last_avail_idx = vq->last_avail_idx & 0x7fff;
+ vq_state.packed.last_avail_counter = !!(vq->last_avail_idx & 0x8000);
+ vq_state.packed.last_used_idx = vq->last_used_idx & 0x7fff;
+ vq_state.packed.last_used_counter = !!(vq->last_used_idx & 0x8000);
+ } else {
+ vq_state.split.avail_index = vq->last_avail_idx;
+ }
+ r = ops->set_vq_state(vdpa, idx, &vq_state);
break;
case VHOST_SET_VRING_CALL:
--
2.17.1
Jason Wang
2023-Apr-23 06:40 UTC
[PATCH 3/3] vhost_vdpa: support PACKED when setting-getting vring_base
On Sat, Apr 22, 2023 at 3:57?AM Shannon Nelson <shannon.nelson at amd.com> wrote:> > Use the right structs for PACKED or split vqs when setting and > getting the vring base. > > Signed-off-by: Shannon Nelson <shannon.nelson at amd.com> > --- > drivers/vhost/vdpa.c | 19 +++++++++++++++---- > 1 file changed, 15 insertions(+), 4 deletions(-) > > diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c > index 599b8cc238c7..2543ae9d5939 100644 > --- a/drivers/vhost/vdpa.c > +++ b/drivers/vhost/vdpa.c > @@ -585,7 +585,12 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, > if (r) > return r; > > - vq->last_avail_idx = vq_state.split.avail_index; > + if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) { > + vq->last_avail_idx = vq_state.packed.last_avail_idx; > + vq->last_used_idx = vq_state.packed.last_used_idx;I wonder if the compiler will guarantee a piggyback for the wrap counter here? If not, should we explicitly packing wrap counter? Thanks> + } else { > + vq->last_avail_idx = vq_state.split.avail_index; > + } > break; > } > > @@ -603,9 +608,15 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, > break; > > case VHOST_SET_VRING_BASE: > - vq_state.split.avail_index = vq->last_avail_idx; > - if (ops->set_vq_state(vdpa, idx, &vq_state)) > - r = -EINVAL; > + if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) { > + vq_state.packed.last_avail_idx = vq->last_avail_idx & 0x7fff; > + vq_state.packed.last_avail_counter = !!(vq->last_avail_idx & 0x8000); > + vq_state.packed.last_used_idx = vq->last_used_idx & 0x7fff; > + vq_state.packed.last_used_counter = !!(vq->last_used_idx & 0x8000); > + } else { > + vq_state.split.avail_index = vq->last_avail_idx; > + } > + r = ops->set_vq_state(vdpa, idx, &vq_state); > break; > > case VHOST_SET_VRING_CALL: > -- > 2.17.1 >