On Tue, 1 Nov 2022 08:38:21 -0300 Jason Gunthorpe <jgg@xxxxxxxx> wrote: > On Tue, Nov 01, 2022 at 08:49:28AM +0000, Tian, Kevin wrote: > > > From: Anthony DeRossi <ajderossi@xxxxxxxxx> > > > Sent: Thursday, October 27, 2022 3:43 AM > > > > > > -static bool vfio_pci_dev_set_needs_reset(struct vfio_device_set *dev_set) > > > +static bool vfio_pci_core_needs_reset(struct vfio_pci_core_device *vdev) > > > { > > > + struct vfio_device_set *dev_set = vdev->vdev.dev_set; > > > struct vfio_pci_core_device *cur; > > > bool needs_reset = false; > > > > > > + if (vdev->vdev.open_count > 1) > > > + return false; > > > > WARN_ON() > > > > > + > > > list_for_each_entry(cur, &dev_set->device_list, vdev.dev_set_list) { > > > - /* No VFIO device in the set can have an open device FD */ > > > - if (cur->vdev.open_count) > > > + /* Only the VFIO device being reset can have an open FD */ > > > + if (cur != vdev && cur->vdev.open_count) > > > return false; > > > > not caused by this patch but while at it... > > > > open_count is defined not for driver use: > > > > /* Members below here are private, not for driver use */ > > unsigned int index; > > struct device device; /* device.kref covers object life circle */ > > refcount_t refcount; /* user count on registered device*/ > > unsigned int open_count; > > struct completion comp; > > struct list_head group_next; > > struct list_head iommu_entry; > > > > prefer to a wrapper or move it to the public section of vfio_device. > > I've been meaning to take a deeper look, but I'm thinking vfio_pci > doesn't need open_count at all any more. > > open_count was from before we changed the core code to call > open_device only once. If we are only a call chain from > open_device/close_device then we know that the open_count must be 1. That accounts for the first test, we don't need to test open_count on the calling device in this path, but the idea here is that we want to test whether we're the last close_device among the set. Not sure how we'd do that w/o some visibility to open_count. Maybe we need a vfio_device_set_open_count() that when 1 we know we're the first open or last close? Thanks, Alex