Tear down functions are not mandatory. Note that this patch just implements the framework, but doesn't implement any tear down function yet.
No functional change intended. Signed-off-by: Roger Pau Monné <roger....@citrix.com> --- Cc: Andrew Cooper <andrew.coop...@citrix.com> Cc: George Dunlap <george.dun...@eu.citrix.com> Cc: Ian Jackson <ian.jack...@eu.citrix.com> Cc: Jan Beulich <jbeul...@suse.com> Cc: Julien Grall <julien.gr...@arm.com> Cc: Konrad Rzeszutek Wilk <konrad.w...@oracle.com> Cc: Stefano Stabellini <sstabell...@kernel.org> Cc: Tim Deegan <t...@xen.org> Cc: Wei Liu <wei.l...@citrix.com> --- xen/arch/arm/xen.lds.S | 9 +-------- xen/arch/x86/xen.lds.S | 9 +-------- xen/drivers/vpci/header.c | 2 +- xen/drivers/vpci/msi.c | 2 +- xen/drivers/vpci/msix.c | 2 +- xen/drivers/vpci/vpci.c | 20 +++++++++++++++++--- xen/include/xen/vpci.h | 15 +++++++++++---- 7 files changed, 33 insertions(+), 26 deletions(-) diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S index 245a0e0e85..2c6a09c59d 100644 --- a/xen/arch/arm/xen.lds.S +++ b/xen/arch/arm/xen.lds.S @@ -66,7 +66,7 @@ SECTIONS *(.data.param) __param_end = .; -#if defined(CONFIG_HAS_VPCI) && defined(CONFIG_LATE_HWDOM) +#if defined(CONFIG_HAS_VPCI) . = ALIGN(POINTER_ALIGN); __start_vpci_array = .; *(SORT(.data.vpci.*)) @@ -178,13 +178,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 70afedd31d..6b81ae9ce4 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -136,7 +136,7 @@ SECTIONS *(.data.param) __param_end = .; -#if defined(CONFIG_HAS_VPCI) && defined(CONFIG_LATE_HWDOM) +#if defined(CONFIG_HAS_VPCI) . = ALIGN(POINTER_ALIGN); __start_vpci_array = .; *(SORT(.data.vpci.*)) @@ -242,13 +242,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 . = ALIGN(SECTION_ALIGN); diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 9d5607d5f8..4363270a55 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -560,7 +560,7 @@ static int init_bars(struct pci_dev *pdev) return (cmd & PCI_COMMAND_MEMORY) ? modify_bars(pdev, true, false) : 0; } -REGISTER_VPCI_INIT(init_bars, VPCI_PRIORITY_MIDDLE); +REGISTER_VPCI_INIT(init_bars, NULL, VPCI_PRIORITY_MIDDLE); /* * Local variables: diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c index 108e871d1c..5bb505c864 100644 --- a/xen/drivers/vpci/msi.c +++ b/xen/drivers/vpci/msi.c @@ -266,7 +266,7 @@ static int init_msi(struct pci_dev *pdev) return 0; } -REGISTER_VPCI_INIT(init_msi, VPCI_PRIORITY_LOW); +REGISTER_VPCI_INIT(init_msi, NULL, VPCI_PRIORITY_LOW); void vpci_dump_msi(void) { diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 0b43f5eab9..6132f576b6 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -450,7 +450,7 @@ static int init_msix(struct pci_dev *pdev) return 0; } -REGISTER_VPCI_INIT(init_msix, VPCI_PRIORITY_HIGH); +REGISTER_VPCI_INIT(init_msix, NULL, VPCI_PRIORITY_HIGH); /* * Local variables: diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 7d52bcf8d0..b3968d6523 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -31,12 +31,26 @@ struct vpci_register { }; #ifdef __XEN__ -extern vpci_register_init_t *const __start_vpci_array[]; -extern vpci_register_init_t *const __end_vpci_array[]; +extern const struct vpci_handler __start_vpci_array[]; +extern const struct vpci_handler __end_vpci_array[]; #define NUM_VPCI_INIT (__end_vpci_array - __start_vpci_array) static void vpci_remove_device_locked(struct pci_dev *pdev) { + unsigned int i; + + if ( !pdev->vpci ) + return; + + for ( i = 0; i < NUM_VPCI_INIT; i++ ) + { + vpci_teardown_t *teardown = + __start_vpci_array[NUM_VPCI_INIT - i - 1].teardown; + + if ( !teardown ) + continue; + teardown(pdev); + } while ( !list_empty(&pdev->vpci->handlers) ) { struct vpci_register *r = list_first_entry(&pdev->vpci->handlers, @@ -80,7 +94,7 @@ int __hwdom_init vpci_add_handlers(struct pci_dev *pdev) for ( i = 0; i < NUM_VPCI_INIT; i++ ) { - rc = __start_vpci_array[i](pdev); + rc = __start_vpci_array[i].init(pdev); if ( rc ) break; } diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index 98556d31ed..208667227e 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -13,15 +13,22 @@ typedef uint32_t vpci_read_t(const struct pci_dev *pdev, unsigned int reg, typedef void vpci_write_t(const struct pci_dev *pdev, unsigned int reg, uint32_t val, void *data); -typedef int vpci_register_init_t(struct pci_dev *dev); +typedef int vpci_init_t(struct pci_dev *dev); +typedef void vpci_teardown_t(struct pci_dev *dev); + +struct vpci_handler { + vpci_init_t *init; + vpci_teardown_t *teardown; +}; #define VPCI_PRIORITY_HIGH "1" #define VPCI_PRIORITY_MIDDLE "5" #define VPCI_PRIORITY_LOW "9" -#define REGISTER_VPCI_INIT(x, p) \ - static vpci_register_init_t *const x##_entry \ - __used_section(".data.vpci." p) = x +#define REGISTER_VPCI_INIT(i, t, p) \ + const static struct vpci_handler i ## t ## _entry \ + __used_section(".data.vpci." p) = { .init = (i), \ + .teardown = (t), } /* Add vPCI handlers to device. */ int __must_check vpci_add_handlers(struct pci_dev *dev); -- 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel