x86/msi: Fix compile error "incomplete typedef 'msi_alloc_info_t'"

Message ID 20231008082827.279154-1-yaolu@kylinos.cn
State New
Headers
Series x86/msi: Fix compile error "incomplete typedef 'msi_alloc_info_t'" |

Commit Message

Lu Yao Oct. 8, 2023, 8:28 a.m. UTC
  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@kylinos.cn>
---
 arch/x86/include/asm/hw_irq.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
  

Comments

Randy Dunlap Oct. 10, 2023, 3:59 p.m. UTC | #1
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@kylinos.cn>

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;
  

Patch

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;