On Tue, Sep 29, 2020 at 12:44 AM Sinan Kaya <okaya@xxxxxxxxxx> wrote: > > On 9/28/2020 7:10 AM, Sinan Kaya wrote: > > On 9/27/2020 10:01 PM, Zhao, Haifeng wrote: > >> Sinan, > >> I explained the reason why locks don't protect this case in the patch description part. > >> Write side and read side hold different semaphore and mutex. > >> > > I have been thinking about it some time but is there any reason why we > > have to handle all port AER/DPC/HP events in different threads? > > > > Can we go to single threaded event loop for all port drivers events? > > > > This will require some refactoring but it wlll eliminate the lock > > nightmares we are having. > > > > This means no sleeping. All sleeps need to happen outside of the loop. > > > > I wanted to see what you all are thinking about this. > > > > It might become a performance problem if the system is > > continuously observing a hotplug/aer/dpc events. > > > > I always think that these should be rare events. > > If restructuring would be too costly, the preferred solution should be > to fix the locks in hotplug driver rather than throwing there a random > wait call. My first though is to unify the pci_bus_sem & pci_rescan_remove_lock to one sleepable lock, but verifying every locking scenario to sort out dead lock warning, it is horrible job. I gave up and then played the device status waiting trick to workaround it. index 03d37128a24f..477d4c499f87 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -3223,17 +3223,19 @@ EXPORT_SYMBOL_GPL(pci_rescan_bus); * pci_rescan_bus(), pci_rescan_bus_bridge_resize() and PCI device removal * routines should always be executed under this mutex. */ -static DEFINE_MUTEX(pci_rescan_remove_lock); +/* static DEFINE_MUTEX(pci_rescan_remove_lock); */ void pci_lock_rescan_remove(void) { - mutex_lock(&pci_rescan_remove_lock); + /*mutex_lock(&pci_rescan_remove_lock); */ + down_write(&pci_bus_sem); } EXPORT_SYMBOL_GPL(pci_lock_rescan_remove); void pci_unlock_rescan_remove(void) { - mutex_unlock(&pci_rescan_remove_lock); + /*mutex_unlock(&pci_rescan_remove_lock); */ + up_write(&pci_bus_sem); } EXPORT_SYMBOL_GPL(pci_unlock_rescan_remove); Thanks, Ethan