[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v12 01/15] vpci: use per-domain PCI lock to protect vpci structure
On 1/15/24 03:53, Roger Pau Monné wrote: > On Fri, Jan 12, 2024 at 12:54:56PM -0500, Stewart Hildebrand wrote: >> On 1/12/24 08:48, Roger Pau Monné wrote: >>> On Tue, Jan 09, 2024 at 04:51:16PM -0500, Stewart Hildebrand wrote: >>>> @@ -202,8 +204,20 @@ static int __init apply_map(struct domain *d, const >>>> struct pci_dev *pdev, >>>> struct map_data data = { .d = d, .map = true }; >>>> int rc; >>>> >>>> + ASSERT(rw_is_write_locked(&d->pci_lock)); >>>> + >>>> while ( (rc = rangeset_consume_ranges(mem, map_range, &data)) == >>>> -ERESTART ) >>>> + { >>>> + /* >>>> + * It's safe to drop and reacquire the lock in this context >>>> + * without risking pdev disappearing because devices cannot be >>>> + * removed until the initial domain has been started. >>>> + */ >>>> + write_unlock(&d->pci_lock); >>>> process_pending_softirqs(); >>>> + write_lock(&d->pci_lock); >>> >>> Hm, I should have noticed before, but we already call >>> process_pending_softirqs() with the pdev->vpci->lock held here, so it >>> would make sense to drop it also. >> >> I don't quite understand this, maybe I'm missing something. I don't see >> where we acquire pdev->vpci->lock before calling process_pending_softirqs()? >> >> Also, I tried adding >> >> ASSERT(!spin_is_locked(&pdev->vpci->lock)); >> >> both here in apply_map() and in vpci_process_pending(), and they haven't >> triggered in either dom0 or domU test cases, tested on both arm and x86. > > I think I was confused. Are you sure that pdev->vpci->lock is taken > in the apply_map() call? I'm sure that it's NOT taken in apply_map(). See the ! in the test ASSERT above. > I was mistakenly assuming that > vpci_add_handlers() called the init function with the vpci->lock > taken, but that doesn't seem to be case with the current code. That > leads to apply_map() also being called without the vpci->lock taken. Right. > > I was wrongly assuming that apply_map() was called with the vpci->lock > lock taken, and that would need dropping around the > process_pending_softirqs() call. > > Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |