|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/1] xen/pci: Install vpci handlers on x86 and fix exit path
On 20.10.2021 10:27, Roger Pau Monné wrote:
> On Tue, Oct 19, 2021 at 05:08:28PM +0100, Bertrand Marquis wrote:
>> Xen might not be able to discover at boot time all devices or some devices
>> might appear after specific actions from dom0.
>> In this case dom0 can use the PHYSDEVOP_pci_device_add to signal some
>> PCI devices to Xen.
>> As those devices where not known from Xen before, the vpci handlers must
>> be properly installed during pci_device_add for x86 PVH Dom0, in the
>> same way as what is done currently on arm (where Xen does not detect PCI
>> devices but relies on Dom0 to declare them all the time).
>>
>> So this patch is removing the ifdef protecting the call to
>> vpci_add_handlers and the comment which was arm specific.
>>
>> vpci_add_handlers is called on during pci_device_add which can be called
>> at runtime through hypercall physdev_op.
>> Remove __hwdom_init as the call is not limited anymore to hardware
>> domain init and fix linker script to only keep vpci_array in rodata
>> section.
>>
>> Add missing vpci handlers cleanup during pci_device_remove and in case
>> of error with iommu during pci_device_add.
>>
>> Add empty static inline for vpci_remove_device when CONFIG_VPCI is not
>> defined.
>>
>> Fixes: d59168dc05 ("xen/arm: Enable the existing x86 virtual PCI support
>> for ARM")
>> Suggested-by: Jan Beulich <jbeulich@xxxxxxxx>
>> Signed-off-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
>> ---
>> Changes in v2
>> - add comment suggested by Jan on top of vpci_add_handlers call
>> - merge the 3 patches of the serie in one patch and renamed it
>> - fix x86 and arm linker script to only keep vpci_array in rodata and
>> only when CONFIG_VPCI is set.
>> ---
>> xen/arch/arm/xen.lds.S | 9 +--------
>> xen/arch/x86/xen.lds.S | 9 +--------
>> xen/drivers/passthrough/pci.c | 8 ++++----
>> xen/drivers/vpci/vpci.c | 2 +-
>> xen/include/xen/vpci.h | 2 ++
>> 5 files changed, 9 insertions(+), 21 deletions(-)
>>
>> diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S
>> index b773f91f1c..08016948ab 100644
>> --- a/xen/arch/arm/xen.lds.S
>> +++ b/xen/arch/arm/xen.lds.S
>> @@ -60,7 +60,7 @@ SECTIONS
>> *(.proc.info)
>> __proc_info_end = .;
>>
>> -#if defined(CONFIG_HAS_VPCI) && defined(CONFIG_LATE_HWDOM)
>> +#ifdef CONFIG_HAS_VPCI
>> . = ALIGN(POINTER_ALIGN);
>> __start_vpci_array = .;
>> *(SORT(.data.vpci.*))
>> @@ -189,13 +189,6 @@ SECTIONS
>> *(.init_array)
>> *(SORT(.init_array.*))
>> __ctors_end = .;
>> -
>> -#if defined(CONFIG_HAS_VPCI) && !defined(CONFIG_LATE_HWDOM)
>> - . = ALIGN(POINTER_ALIGN);
>> - __start_vpci_array = .;
>> - *(SORT(.data.vpci.*))
>> - __end_vpci_array = .;
>> -#endif
>> } :text
>> __init_end_efi = .;
>> . = ALIGN(STACK_SIZE);
>> diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S
>> index 11b1da2154..87e344d4dd 100644
>> --- a/xen/arch/x86/xen.lds.S
>> +++ b/xen/arch/x86/xen.lds.S
>> @@ -134,7 +134,7 @@ SECTIONS
>> *(.ex_table.pre)
>> __stop___pre_ex_table = .;
>>
>> -#if defined(CONFIG_HAS_VPCI) && defined(CONFIG_LATE_HWDOM)
>> +#ifdef CONFIG_HAS_VPCI
>> . = ALIGN(POINTER_ALIGN);
>> __start_vpci_array = .;
>> *(SORT(.data.vpci.*))
>> @@ -247,13 +247,6 @@ SECTIONS
>> *(.init_array)
>> *(SORT(.init_array.*))
>> __ctors_end = .;
>> -
>> -#if defined(CONFIG_HAS_VPCI) && !defined(CONFIG_LATE_HWDOM)
>> - . = ALIGN(POINTER_ALIGN);
>> - __start_vpci_array = .;
>> - *(SORT(.data.vpci.*))
>> - __end_vpci_array = .;
>> -#endif
>> } PHDR(text)
>>
>> . = ALIGN(SECTION_ALIGN);
>> diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c
>> index 35e0190796..8928a1c07d 100644
>> --- a/xen/drivers/passthrough/pci.c
>> +++ b/xen/drivers/passthrough/pci.c
>> @@ -756,10 +756,9 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn,
>> if ( !pdev->domain )
>> {
>> pdev->domain = hardware_domain;
>> -#ifdef CONFIG_ARM
>> /*
>> - * On ARM PCI devices discovery will be done by Dom0. Add vpci
>> handler
>> - * when Dom0 inform XEN to add the PCI devices in XEN.
>> + * For devices not discovered by Xen during boot, add vPCI handlers
>> + * when Dom0 first informs Xen about such devices.
>> */
>> ret = vpci_add_handlers(pdev);
>> if ( ret )
>
> Sorry to be a pain, but I think this placement of the call to
> vpci_add_handlers is bogus and should instead be done strictly after
> the device has been added to the hardware_domain->pdev_list list.
>
> Otherwise the loop over domain->pdev_list (for_each_pdev) in
> modify_bars won't be able to find the device and hit the assert below
> it. That can happen in vpci_add_handlers as it will call init_bars
> which in turn will call into modify_bars if memory decoding is enabled
> for the device.
Oh, good point. And I should have thought of this myself, given that
I did hit that ASSERT() recently with a hidden device. FTAOD I think
this means that the list addition will need to move up (and then
would need undoing on the error path(s)).
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |