Re: [PATCH] x86/msi: Fix compile error "incomplete typedef 'msi_alloc_info_t'"

From: Randy Dunlap
Date: Tue Oct 10 2023 - 11:59:37 EST


Hi,

On 10/8/23 01:28, yaolu wrote:
> When compiling the x86 kernel, if X86_64 || SMP || X86_32_NON_STANDARD ||
> X86_UP_APIC || PCI_MSI is not enabled in '.config' and GENERIC_MSI_IRQ is
> selected, the following compilation error will occur:
>
>> include/linux/gpio/driver.h:38:19: error:
>> field 'msiinfo' has incomplete type
>> kernel/irq/msi.c:752:5: error: invalid use of incomplete typedef
>> 'msi_alloc_info_t' {aka 'struct irq_alloc_info'}
>> kernel/irq/msi.c:740:1: error: control reaches end of non-void function
>
> This is because 'X86_LOCAL_APIC' is not defined, but file such as
> 'kernel/irq/msi.c' only depends on 'GENERIC_MSI_IRQ', and uses
> 'struct msi_alloc_info_t'. When enable 'GENERIC_MSI_IRQ' will select
> 'IRQ_DOMAIN_HIERARCHY', so exposing this struct using
> 'IRQ_DOMAIN_HIERARCHY' rather than 'X86_LOCAL_APIC'.
>
> Signed-off-by: yaolu <yaolu@xxxxxxxxxx>

Thank for the patch. This reduces the build error count from around 190 down to
two remaining problems for me:

../arch/x86/kernel/hpet.c: In function ‘hpet_create_irq_domain’:
../arch/x86/kernel/hpet.c:550:13: error: ‘x86_vector_domain’ undeclared (first use in this function)
550 | if (x86_vector_domain == NULL)
| ^~~~~~~~~~~~~~~~~
../arch/x86/kernel/hpet.c:550:13: note: each undeclared identifier is reported only once for each function it appears in
../arch/x86/kernel/hpet.c: In function ‘hpet_assign_irq’:
../arch/x86/kernel/hpet.c:600:9: error: implicit declaration of function ‘init_irq_alloc_info’ [-Werror=implicit-function-declaration]
600 | init_irq_alloc_info(&info, NULL);
| ^~~~~~~~~~~~~~~~~~~


I haven't looked into how to fix this yet...

> ---
> arch/x86/include/asm/hw_irq.h | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
> index 551829884734..b02c3cd3c0f6 100644
> --- a/arch/x86/include/asm/hw_irq.h
> +++ b/arch/x86/include/asm/hw_irq.h
> @@ -28,7 +28,7 @@
> #include <asm/irq.h>
> #include <asm/sections.h>
>
> -#ifdef CONFIG_X86_LOCAL_APIC
> +#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
> struct irq_data;
> struct pci_dev;
> struct msi_desc;
> @@ -105,10 +105,10 @@ static inline void irq_complete_move(struct irq_cfg *c) { }
> #endif
>
> extern void apic_ack_edge(struct irq_data *data);
> -#else /* CONFIG_X86_LOCAL_APIC */
> +#else /* CONFIG_IRQ_DOMAIN_HIERARCHY */
> static inline void lock_vector_lock(void) {}
> static inline void unlock_vector_lock(void) {}
> -#endif /* CONFIG_X86_LOCAL_APIC */
> +#endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */
>
> /* Statistics */
> extern atomic_t irq_err_count;

--
~Randy