|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: vpci: Need for vpci_cancel_pending
On 28.10.21 13:30, Roger Pau Monné wrote:
> On Thu, Oct 28, 2021 at 10:25:28AM +0000, Oleksandr Andrushchenko wrote:
>>
>> On 28.10.21 13:17, Roger Pau Monné wrote:
>>> On Thu, Oct 28, 2021 at 10:04:20AM +0000, Oleksandr Andrushchenko wrote:
>>>> Hi, all!
>>>>
>>>> While working on PCI passthrough on Arm I stepped onto a crash
>>>> with the following call chain:
>>>>
>>>> pci_physdev_op
>>>> pci_add_device
>>>> init_bars -> modify_bars -> defer_map ->
>>>> raise_softirq(SCHEDULE_SOFTIRQ)
>>>> iommu_add_device <- FAILS
>>>> vpci_remove_device -> xfree(pdev->vpci)
>>>>
>>>> Then:
>>>> leave_hypervisor_to_guest
>>>> vpci_process_pending: v->vpci.mem != NULL; v->vpci.pdev->vpci == NULL
>>>>
>>>> Which results in the crash below:
>>>>
>>>> (XEN) Data Abort Trap. Syndrome=0x6
>>>> (XEN) Walking Hypervisor VA 0x10 on CPU0 via TTBR 0x00000000481dd000
>>>> (XEN) 0TH[0x0] = 0x00000000481dcf7f
>>>> (XEN) 1ST[0x0] = 0x00000000481d9f7f
>>>> (XEN) 2ND[0x0] = 0x0000000000000000
>>>> (XEN) CPU0: Unexpected Trap: Data Abort
>>>> ...
>>>> (XEN) Xen call trace:
>>>> (XEN) [<00000000002246d8>] _spin_lock+0x40/0xa4 (PC)
>>>> (XEN) [<00000000002246c0>] _spin_lock+0x28/0xa4 (LR)
>>>> (XEN) [<000000000024f6d0>] vpci_process_pending+0x78/0x128
>>>> (XEN) [<000000000027f7e8>] leave_hypervisor_to_guest+0x50/0xcc
>>>> (XEN) [<0000000000269c5c>] entry.o#guest_sync_slowpath+0xa8/0xd4
>>>>
>>>> So, it seems that if pci_add_device fails and calls vpci_remove_device
>>>> the later needs to cancel any pending work.
>>> Indeed, you will need to check that v->vpci.pdev == pdev before
>>> canceling the pending work though, or else you could be canceling
>>> pending work from a different device.
>> How about:
>>
>> void vpci_cancel_pending(struct pci_dev *pdev)
>> {
>> struct vcpu *v = current;
>>
>> if ( v->vpci.mem && v->vpci.pdev == pdev)
>> {
>> rangeset_destroy(v->vpci.mem);
>> v->vpci.mem = NULL;
>> }
>> }
>>
>> This will effectively prevent the pending work from running
> Can't you just place this in vpci_remove_device?
>
> Or is there a need to cancel pending work without removing the device?
@@ -149,8 +149,7 @@ bool vpci_process_pending(struct vcpu *v)
!rc && v->vpci.rom_only);
spin_unlock(&v->vpci.pdev->vpci->lock);
- rangeset_destroy(v->vpci.mem);
- v->vpci.mem = NULL;
+ vpci_cancel_pending(v->vpci.pdev);
So, we can re-use it and do not copy paste the same
>
> Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |