On Wed, Jun 22, 2022 at 5:14 PM Stefano Garzarella <sgarzare@xxxxxxxxxx> wrote: > > Before commit 3d5698793897 ("vhost-vdpa: introduce asid based IOTLB") > we call vhost_vdpa_iotlb_free() during the release to clean all regions > mapped in the iotlb. > > That commit removed vhost_vdpa_iotlb_free() and added vhost_vdpa_cleanup() > to do some cleanup, including deleting all mappings, but we forgot to call > it in vhost_vdpa_release(). > > This causes that if an application does not remove all mappings explicitly > (or it crashes), the mappings remain in the iotlb and subsequent > applications may fail if they map the same addresses. > I tested this behavior even by sending SIGKILL to qemu. The failed map is reproducible easily before applying this patch and applying it fixes the issue properly. > Calling vhost_vdpa_cleanup() also fixes a memory leak since we are not > freeing `v->vdev.vqs` during the release from the same commit. > > Since vhost_vdpa_cleanup() calls vhost_dev_cleanup() we can remove its > call from vhost_vdpa_release(). > Tested-by: Eugenio Pérez <eperezma@xxxxxxxxxx> > Fixes: 3d5698793897 ("vhost-vdpa: introduce asid based IOTLB") > Cc: gautam.dawar@xxxxxxxxxx > Signed-off-by: Stefano Garzarella <sgarzare@xxxxxxxxxx> > --- > drivers/vhost/vdpa.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c > index 5ad2596c6e8a..23dcbfdfa13b 100644 > --- a/drivers/vhost/vdpa.c > +++ b/drivers/vhost/vdpa.c > @@ -1209,7 +1209,7 @@ static int vhost_vdpa_release(struct inode *inode, struct file *filep) > vhost_dev_stop(&v->vdev); > vhost_vdpa_free_domain(v); > vhost_vdpa_config_put(v); > - vhost_dev_cleanup(&v->vdev); > + vhost_vdpa_cleanup(v); > mutex_unlock(&d->mutex); > > atomic_dec(&v->opened); > -- > 2.36.1 >