Messages in this thread | | | From | Jason Wang <> | Date | Wed, 18 Oct 2023 13:08:55 +0800 | Subject | Re: [PATCH v1 4/4] vduse: update the vq_info in ioctl |
| |
On Wed, Oct 11, 2023 at 2:42 PM Cindy Lu <lulu@redhat.com> wrote: > > In VDUSE_VQ_GET_INFO, the driver will sync the last_avail_idx > with reconnect info, After mapping the reconnect pages to userspace > The userspace App will update the reconnect_time in > struct vhost_reconnect_vring, If this is not 0 then it means this > vq is reconnected and will update the last_avail_idx > > Signed-off-by: Cindy Lu <lulu@redhat.com> > --- > drivers/vdpa/vdpa_user/vduse_dev.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c > index 0f15e7ac716b..42e7a90ab74c 100644 > --- a/drivers/vdpa/vdpa_user/vduse_dev.c > +++ b/drivers/vdpa/vdpa_user/vduse_dev.c > @@ -1213,6 +1213,9 @@ static long vduse_dev_ioctl(struct file *file, unsigned int cmd, > struct vduse_vq_info vq_info; > struct vduse_virtqueue *vq; > u32 index; > + struct vdpa_reconnect_info *area; > + struct vhost_reconnect_vring *vq_reconnect; > + struct vhost_reconnect_data *dev_reconnect; > > ret = -EFAULT; > if (copy_from_user(&vq_info, argp, sizeof(vq_info))) > @@ -1244,6 +1247,19 @@ static long vduse_dev_ioctl(struct file *file, unsigned int cmd, > > vq_info.ready = vq->ready; > > + area = &dev->reconnect_status; > + dev_reconnect = (struct vhost_reconnect_data *)area->vaddr; > + > + area = &vq->reconnect_info; > + vq_reconnect = (struct vhost_reconnect_vring *)area->vaddr; > + /*check if the vq is reconnect, if yes then update the last_avail_idx*/ > + if ((vq_reconnect->last_avail_idx != > + vq_info.split.avail_index) && > + (dev_reconnect->reconnect_time != 0)) { > + vq_info.split.avail_index = > + vq_reconnect->last_avail_idx; > + }
This may work only for split, how about packed? And I wonder when such synchronization is not done at set_vq_state() but get_vq_info()?
Thanks
> + > ret = -EFAULT; > if (copy_to_user(argp, &vq_info, sizeof(vq_info))) > break; > -- > 2.34.3 >
| |