Message ID | 20240126234237.547278-7-jacob.jun.pan@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Coalesced Interrupt Delivery with posted MSI | expand |
On Fri, 26 Jan 2024 15:42:28 -0800, Jacob Pan <jacob.jun.pan@linux.intel.com> wrote: I have made a couple of mistakes here, caught by LKP testing. Reported by Oliver Sang. > > +#ifdef CONFIG_X86_POSTED_MSI > + > +/* Posted Interrupt Descriptors for coalesced MSIs to be posted */ > +DEFINE_PER_CPU_ALIGNED(struct pi_desc, posted_interrupt_desc); > + > +void intel_posted_msi_init(void) > +{ > + struct pi_desc *pid = this_cpu_ptr(&posted_interrupt_desc); > + > + pid->nv = POSTED_MSI_NOTIFICATION_VECTOR; > + pid->ndst = this_cpu_read(x86_cpu_to_apicid); Based on VT-d specification 9.11, middle portion of the 32 bit field are used in xAPIC mode instead of the lowest 8 bit. Not sure why it was designed this way, making sure people ready the spec carefully :) xAPIC Mode (Physical): 319:304 - Reserved (0) 303:296 - APIC DestinationID[7:0] 295:288 - Reserved (0) x2APIC Mode (Physical): 319:288 - APIC DestinationID[31:0] So it should be something like: pid->ndst = x2apic_enabled() ? apic_id : apic_id << 8; > +} > +} partitioning mistake, will fix. > +#endif /* X86_POSTED_MSI */ Thanks, Jacob
diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h index 66837b8c67f1..72c6a084dba3 100644 --- a/arch/x86/include/asm/hardirq.h +++ b/arch/x86/include/asm/hardirq.h @@ -48,6 +48,9 @@ typedef struct { DECLARE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); +#ifdef CONFIG_X86_POSTED_MSI +DECLARE_PER_CPU_ALIGNED(struct pi_desc, posted_interrupt_desc); +#endif #define __ARCH_IRQ_STAT #define inc_irq_stat(member) this_cpu_inc(irq_stat.member) diff --git a/arch/x86/include/asm/posted_intr.h b/arch/x86/include/asm/posted_intr.h index 896b3462f3dd..a36cc971ea13 100644 --- a/arch/x86/include/asm/posted_intr.h +++ b/arch/x86/include/asm/posted_intr.h @@ -88,4 +88,11 @@ static inline bool pi_test_sn(struct pi_desc *pi_desc) return test_bit(POSTED_INTR_SN, (unsigned long *)&pi_desc->control); } +#ifdef CONFIG_X86_POSTED_MSI +extern void intel_posted_msi_init(void); + +#else +static inline void intel_posted_msi_init(void) {}; + +#endif /* X86_POSTED_MSI */ #endif /* _X86_POSTED_INTR_H */ diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 0b97bcde70c6..9b6248e7c073 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -67,6 +67,7 @@ #include <asm/traps.h> #include <asm/sev.h> #include <asm/tdx.h> +#include <asm/posted_intr.h> #include "cpu.h" @@ -2253,6 +2254,8 @@ void cpu_init(void) barrier(); x2apic_setup(); + + intel_posted_msi_init(); } mmgrab(&init_mm); diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 11761c124545..f6546f83d616 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -22,6 +22,8 @@ #include <asm/desc.h> #include <asm/traps.h> #include <asm/thermal.h> +#include <asm/posted_intr.h> +#include <asm/irq_remapping.h> #define CREATE_TRACE_POINTS #include <asm/trace/irq_vectors.h> @@ -334,6 +336,20 @@ DEFINE_IDTENTRY_SYSVEC_SIMPLE(sysvec_kvm_posted_intr_nested_ipi) } #endif +#ifdef CONFIG_X86_POSTED_MSI + +/* Posted Interrupt Descriptors for coalesced MSIs to be posted */ +DEFINE_PER_CPU_ALIGNED(struct pi_desc, posted_interrupt_desc); + +void intel_posted_msi_init(void) +{ + struct pi_desc *pid = this_cpu_ptr(&posted_interrupt_desc); + + pid->nv = POSTED_MSI_NOTIFICATION_VECTOR; + pid->ndst = this_cpu_read(x86_cpu_to_apicid); +} +} +#endif /* X86_POSTED_MSI */ #ifdef CONFIG_HOTPLUG_CPU /* A cpu has been removed from cpu_online_mask. Reset irq affinities. */