[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] vpci: introduce per-domain lock to protect vpci structure
On 15.02.22 14:56, Jan Beulich wrote: > On 15.02.2022 13:44, Oleksandr Andrushchenko wrote: >> On 15.02.22 13:54, Oleksandr Andrushchenko wrote: >>> On 15.02.22 13:50, Jan Beulich wrote: >>>> On 15.02.2022 12:45, Oleksandr Andrushchenko wrote: >>>>> I'm on your side, I just want to hear that we all agree pcidevs >>>>> needs to be converted into rwlock according with the plan you >>>>> suggested and at least now it seems to be an acceptable solution. >>>> I'd like to express worries though about the conversion of this >>>> recursive lock into an r/w one. >>> Could you please elaborate more on this? >> What if we just do the following: >> >> static spinlock_t _pcidevs_lock = SPIN_LOCK_UNLOCKED; >> static rwlock_t DEFINE_RWLOCK(_pcidevs_rwlock); >> >> void pcidevs_lock(void) >> { >> read_lock(&_pcidevs_rwlock); >> spin_lock_recursive(&_pcidevs_lock); >> } >> >> void pcidevs_unlock(void) >> { >> spin_unlock_recursive(&_pcidevs_lock); >> read_unlock(&_pcidevs_rwlock); >> } >> >> void pcidevs_read_lock(void) >> { >> read_lock(&_pcidevs_rwlock); >> } >> >> void pcidevs_read_unlock(void) >> { >> read_unlock(&_pcidevs_rwlock); >> } >> >> void pcidevs_write_lock(void) >> { >> write_lock(&_pcidevs_rwlock); >> } >> >> void pcidevs_write_unlock(void) >> { >> write_unlock(&_pcidevs_rwlock); >> } > Hmm, this is an interesting idea. Except that I'm not sure in how > far it'll be suitable: read_lock() won't lock out users of just > lock(), so the solution looks tailored to your vPCI use case. Yet > obviously (I think) read_lock() would want to become usable for > e.g. simple list traversal as well, down the road. 1. Assumption: _pcidevs_rwlock is used to protect pdev structure itself, so after calling pcidevs_lock(), pcidevs_read_lock() and pcidevs_write_lock() we need to check if pdev != NULL at all sites 2. _pcidevs_rwlock is not meant to protect the contents of pdev: - for that _pcidevs_lock is used - _pcidevs_lock doesn't protect pdev->vpci: for that pdev->vpci->lock is used. 3. Current code will continue using pcidevs_lock() as it is now. With the exception of the writers: pci_{add|remove}_device. These will use pcidevs_write_lock() instead. 4. vPCI code, such as vpci_{read|write} will use pcidevs_{read|write}_lock (write mode for modify_bars) and pdev->vpci->lock to protect and/or modify pdev->vpci. This should be safe because under the rwlock we are guaranteed that pdev exists and no other code, but vPCI can remove pdev->vpci. for_each_pdev and pci_get_pdev_by_domain, when used by vPCI, we use pcidevs_read_lock expecting we only need to access pdev->vpci. If this is not the case and we need to modify contents of pdev we need to acquire spin_lock_recursive(&_pcidevs_lock); with a new helper 5) 5. A new helper is needed to acquire spin_lock_recursive(&_pcidevs_lock); This will be used by at least vPCI code if it needs modifying something in pdev other than pdev->vpci. In that case we "upgrade" pcidevs_read_lock() to pcidevs_lock() Question: can anyone please explain why pcidevs is a recursive lock? > > Jan > Thank you and hope to hear your thought on the above, Oleksandr
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |