Hi Jason, > From: Jason Gunthorpe <jgg@xxxxxxxxxx> > Sent: Wednesday, November 3, 2021 9:26 PM > > On Tue, Nov 02, 2021 at 09:53:29AM +0000, Liu, Yi L wrote: > > > > vfio_uninit_group_dev(&mdev_state->vdev); > > > kfree(mdev_state->pages); > > > kfree(mdev_state->vconfig); > > > kfree(mdev_state); > > > > > > pages/vconfig would logically be in a release function > > > > I see. So the criteria is: the pointer fields pointing to a memory buffer > > allocated by the device driver should be logically be free in a release > > function. right? > > Often yes, that is usually a good idea > > >I can see there are such fields in struct vfio_pci_core_device > > and mdev_state (both mbochs and mdpy). So we may go with your option > #2. > > Is it? otherwise, needs to add release callback for all the related drivers. > > Yes, that is the approx trade off > > > > On the other hand ccw needs to rcu free the vfio_device, so that would > > > have to be global overhead with this api design. > > > > not quite get. why ccw is special here? could you elaborate? > > I added a rcu usage to it in order to fix a race > > +static inline struct vfio_ccw_private *vfio_ccw_get_priv(struct subchannel > *sch) > +{ > + struct vfio_ccw_private *private; > + > + rcu_read_lock(); > + private = dev_get_drvdata(&sch->dev); > + if (private && !vfio_device_try_get(&private->vdev)) > + private = NULL; > + rcu_read_unlock(); > + return private; > +} you are right. After checking your ccw patch, the private free triggered by vfio_ccw_free_private() should use kfree_rcu(). So it is not quite same with other vfio_device users which only need kfree() to free the vfio_device. So how can I address the difference when moving the vfio_device alloc/free into vfio core? any suggestion? @@ -164,14 +173,14 @@ static void vfio_ccw_free_private(struct vfio_ccw_private *private) kmem_cache_free(vfio_ccw_io_region, private->io_region); kfree(private->cp.guest_cp); mutex_destroy(&private->io_mutex); - kfree(private); + vfio_uninit_group_dev(&private->vdev); + kfree_rcu(private, rcu); } https://lore.kernel.org/kvm/10-v3-57c1502c62fd+2190-ccw_mdev_jgg@xxxxxxxxxx/ Regards, Yi Liu