Michael S. Tsirkin
2023-Feb-01 16:11 UTC
[PATCH 2/2] vringh: fetch used_idx from vring at vringh_init_iotlb
On Wed, Jan 18, 2023 at 05:43:59PM +0100, Eugenio P?rez wrote:> Starting from an used_idx different than 0 is needed in use cases like > virtual machine migration. Not doing so and letting the caller set an > avail idx different than 0 causes destination device to try to use old > buffers that source driver already recover and are not available > anymore. > > While callers like vdpa_sim set avail_idx directly it does not set > used_idx. Instead of let the caller do the assignment, fetch it from > the guest at initialization like vhost-kernel do. > > To perform the same at vring_kernel_init and vring_user_init is left for > the future. > > Signed-off-by: Eugenio P?rez <eperezma at redhat.com>So I applied 1/2 and dropped 2/2 for now, right?> --- > drivers/vhost/vringh.c | 25 +++++++++++++++++++++++-- > 1 file changed, 23 insertions(+), 2 deletions(-) > > diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c > index 33eb941fcf15..0eed825197f2 100644 > --- a/drivers/vhost/vringh.c > +++ b/drivers/vhost/vringh.c > @@ -1301,6 +1301,17 @@ static inline int putused_iotlb(const struct vringh *vrh, > return 0; > } > > +/** > + * vringh_update_used_idx - fetch used idx from driver's used split vring > + * @vrh: The vring. > + * > + * Returns -errno or 0. > + */ > +static inline int vringh_update_used_idx(struct vringh *vrh) > +{ > + return getu16_iotlb(vrh, &vrh->last_used_idx, &vrh->vring.used->idx); > +} > + > /** > * vringh_init_iotlb - initialize a vringh for a ring with IOTLB. > * @vrh: the vringh to initialize. > @@ -1319,8 +1330,18 @@ int vringh_init_iotlb(struct vringh *vrh, u64 features, > struct vring_avail *avail, > struct vring_used *used) > { > - return vringh_init_kern(vrh, features, num, weak_barriers, > - desc, avail, used); > + int r = vringh_init_kern(vrh, features, num, weak_barriers, desc, > + avail, used); > + > + if (r != 0) > + return r; > + > + /* Consider the ring not initialized */ > + if ((void *)desc == used) > + return 0; > + > + return vringh_update_used_idx(vrh); > + > } > EXPORT_SYMBOL(vringh_init_iotlb); > > -- > 2.31.1