On Fri, 2007-04-27 at 22:39 +0200, Philippe Gerum wrote:
> On Fri, 2007-04-27 at 17:10 +0200, M. Koehrer wrote:
> > Hi Philippe,
> > 
> > here is the next result (I have switched off the "quiet" kernel parameter 
> > to get everything).
> > 
> 
> There is a SMP-related bugfix regarding our IPI namespace I need to
> backport from x86_64 to x86. Not sure this is what bites us here yet,
> but there is no use to chase the wild goose. In any case, CONFIG_PCI_MSI
> clearly worsens the situation regarding this issue.

Here we are, please apply the first patch against a stock I-pipe 1.7-03
kernel, then the second one against a vanilla Xenomai v2.3.x tree.

What the first patch does is moving the system IRQs out of the regular
interrupt namespace wrt Adeos handling, which could solve possible
conflicts whenever CONFIG_PCI_MSI is on. The second patch makes the
Xenomai tree aware of the differentiated namespaces.

-- 
Philippe.

diff --git a/arch/i386/kernel/ipipe.c b/arch/i386/kernel/ipipe.c
index ff45e25..c83a65f 100644
--- a/arch/i386/kernel/ipipe.c
+++ b/arch/i386/kernel/ipipe.c
@@ -207,49 +207,49 @@ void __init __ipipe_enable_pipeline(void)
 	/* Map the APIC system vectors. */
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     LOCAL_TIMER_VECTOR - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(LOCAL_TIMER_VECTOR),
 			     (ipipe_irq_handler_t)&smp_apic_timer_interrupt,
 			     NULL,
 			     &__ipipe_ack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     SPURIOUS_APIC_VECTOR - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(SPURIOUS_APIC_VECTOR),
 			     (ipipe_irq_handler_t)&smp_spurious_interrupt,
 			     NULL,
 			     &__ipipe_noack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     ERROR_APIC_VECTOR - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(ERROR_APIC_VECTOR),
 			     (ipipe_irq_handler_t)&smp_error_interrupt,
 			     NULL,
 			     &__ipipe_ack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     IPIPE_SERVICE_VECTOR0 - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR0),
 			     &__ipipe_null_handler,
 			     NULL,
 			     &__ipipe_ack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     IPIPE_SERVICE_VECTOR1 - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR1),
 			     &__ipipe_null_handler,
 			     NULL,
 			     &__ipipe_ack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     IPIPE_SERVICE_VECTOR2 - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR2),
 			     &__ipipe_null_handler,
 			     NULL,
 			     &__ipipe_ack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     IPIPE_SERVICE_VECTOR3 - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR3),
 			     &__ipipe_null_handler,
 			     NULL,
 			     &__ipipe_ack_apic,
@@ -257,7 +257,7 @@ void __init __ipipe_enable_pipeline(void)
 
 #ifdef CONFIG_X86_MCE_P4THERMAL
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     THERMAL_APIC_VECTOR - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(THERMAL_APIC_VECTOR),
 			     (ipipe_irq_handler_t)&smp_thermal_interrupt,
 			     NULL,
 			     &__ipipe_ack_apic,
@@ -265,7 +265,7 @@ void __init __ipipe_enable_pipeline(void)
 #endif /* CONFIG_X86_MCE_P4THERMAL */
 
 	__ipipe_tick_irq =
-	    using_apic_timer ? LOCAL_TIMER_VECTOR - FIRST_EXTERNAL_VECTOR : 0;
+		using_apic_timer ? ipipe_apic_vector_irq(LOCAL_TIMER_VECTOR) : 0;
 
 #else	/* !CONFIG_X86_LOCAL_APIC */
 
@@ -275,21 +275,21 @@ void __init __ipipe_enable_pipeline(void)
 
 #ifdef CONFIG_SMP
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     RESCHEDULE_VECTOR - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(RESCHEDULE_VECTOR),
 			     (ipipe_irq_handler_t)&smp_reschedule_interrupt,
 			     NULL,
 			     &__ipipe_ack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     INVALIDATE_TLB_VECTOR - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(INVALIDATE_TLB_VECTOR),
 			     (ipipe_irq_handler_t)&smp_invalidate_interrupt,
 			     NULL,
 			     &__ipipe_ack_apic,
 			     IPIPE_STDROOT_MASK);
 
 	ipipe_virtualize_irq(ipipe_root_domain,
-			     CALL_FUNCTION_VECTOR - FIRST_EXTERNAL_VECTOR,
+			     ipipe_apic_vector_irq(CALL_FUNCTION_VECTOR),
 			     (ipipe_irq_handler_t)&smp_call_function_interrupt,
 			     NULL,
 			     &__ipipe_ack_apic,
@@ -772,10 +772,17 @@ int __ipipe_handle_irq(struct pt_regs regs)
 	ipipe_declare_cpuid;
 	int m_ack;
 
-	if (regs.orig_eax < 0) {
+	if ((long)regs.orig_eax < 0) {
 		irq = ~irq;
+#ifdef CONFIG_X86_LOCAL_APIC
+		{
+			unsigned vector = irq + FIRST_EXTERNAL_VECTOR;
+			if (vector >= FIRST_SYSTEM_VECTOR)
+				irq = ipipe_apic_vector_irq(vector);
+		}
+#endif
 		m_ack = 0;
-	} else
+	} else /* This is a self-triggered interrupt. */
 		m_ack = 1;
 
 	ipipe_load_cpuid();
@@ -881,7 +888,7 @@ finalize_nosync:
 	 * preemptible kernels along the way out through
 	 * ret_from_intr.
 	 */
-	if (regs.orig_eax < 0)
+	if ((long)regs.orig_eax < 0)
 		__set_bit(IPIPE_STALL_FLAG, &ipipe_root_domain->cpudata[cpuid].status);
 #endif	/* CONFIG_SMP */
 
diff --git a/include/asm-i386/ipipe.h b/include/asm-i386/ipipe.h
index 43efd34..8a501a9 100644
--- a/include/asm-i386/ipipe.h
+++ b/include/asm-i386/ipipe.h
@@ -27,28 +27,35 @@
 #include <linux/threads.h>
 #include <irq_vectors.h>
 
-#define IPIPE_ARCH_STRING	"1.7-03"
+#define IPIPE_ARCH_STRING	"1.8-devel"
 #define IPIPE_MAJOR_NUMBER	1
-#define IPIPE_MINOR_NUMBER	7
-#define IPIPE_PATCH_NUMBER	3
+#define IPIPE_MINOR_NUMBER	7
+#define IPIPE_PATCH_NUMBER	99
 
 #ifdef CONFIG_X86_LOCAL_APIC
-/* We want to cover the whole IRQ space when the APIC is enabled. */
-#ifdef CONFIG_PCI_MSI
-#define IPIPE_NR_XIRQS NR_IRQS
-#else	/* CONFIG_PCI_MSI */
-#define IPIPE_NR_XIRQS   224
-#endif	/* CONFIG_PCI_MSI */
+/* We want to cover the whole IRQ space when the APIC is enabled.
+   Reserve 32 IRQs for APIC interrupts, we don't want them to mess
+   with the normally assigned interrupts.*/
+#if (NR_IRQS > 16)
+#define IPIPE_NR_XIRQS		(NR_IRQS + 32)
+#define IPIPE_FIRST_APIC_IRQ	NR_IRQS
+#else
+#define IPIPE_NR_XIRQS		256
+#define IPIPE_FIRST_APIC_IRQ	224
+#endif
+#define ipipe_apic_irq_vector(irq)  ((irq) - IPIPE_FIRST_APIC_IRQ + FIRST_SYSTEM_VECTOR)
+#define ipipe_apic_vector_irq(vec)  ((vec) - FIRST_SYSTEM_VECTOR + IPIPE_FIRST_APIC_IRQ)
+
 /* If the APIC is enabled, then we expose four service vectors in the
    APIC space which are freely available to domains. */
 #define IPIPE_SERVICE_VECTOR0	0xf5
-#define IPIPE_SERVICE_IPI0	(IPIPE_SERVICE_VECTOR0 - FIRST_EXTERNAL_VECTOR)
+#define IPIPE_SERVICE_IPI0	ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR0)
 #define IPIPE_SERVICE_VECTOR1	0xf6
-#define IPIPE_SERVICE_IPI1	(IPIPE_SERVICE_VECTOR1 - FIRST_EXTERNAL_VECTOR)
+#define IPIPE_SERVICE_IPI1	ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR1)
 #define IPIPE_SERVICE_VECTOR2	0xf7
-#define IPIPE_SERVICE_IPI2	(IPIPE_SERVICE_VECTOR2 - FIRST_EXTERNAL_VECTOR)
+#define IPIPE_SERVICE_IPI2	ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR2)
 #define IPIPE_SERVICE_VECTOR3	0xf8
-#define IPIPE_SERVICE_IPI3	(IPIPE_SERVICE_VECTOR3 - FIRST_EXTERNAL_VECTOR)
+#define IPIPE_SERVICE_IPI3	ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR3)
 #else	/* !CONFIG_X86_LOCAL_APIC */
 #define IPIPE_NR_XIRQS		NR_IRQS
 #endif	/* CONFIG_X86_LOCAL_APIC */
@@ -93,7 +100,7 @@
 #include <linux/thread_info.h>
 
 #define IPIPE_CRITICAL_VECTOR  0xf9	/* Used by ipipe_critical_enter/exit() */
-#define IPIPE_CRITICAL_IPI     (IPIPE_CRITICAL_VECTOR - FIRST_EXTERNAL_VECTOR)
+#define IPIPE_CRITICAL_IPI     ipipe_apic_vector_irq(IPIPE_CRITICAL_VECTOR)
 
 extern int (*__ipipe_logical_cpuid)(void);
 
Index: include/asm-i386/bits/shadow.h
===================================================================
--- include/asm-i386/bits/shadow.h	(revision 2395)
+++ include/asm-i386/bits/shadow.h	(working copy)
@@ -56,9 +56,9 @@
 		switch (irq) {
 #ifdef CONFIG_SMP
 		case RTHAL_CRITICAL_IPI:
-		case INVALIDATE_TLB_VECTOR - FIRST_EXTERNAL_VECTOR:
-		case CALL_FUNCTION_VECTOR - FIRST_EXTERNAL_VECTOR:
-		case RESCHEDULE_VECTOR - FIRST_EXTERNAL_VECTOR:
+		case ipipe_apic_vector_irq(INVALIDATE_TLB_VECTOR):
+		case ipipe_apic_vector_irq(CALL_FUNCTION_VECTOR):
+		case ipipe_apic_vector_irq(RESCHEDULE_VECTOR):
 
 			/* Never lock out these ones. */
 			continue;
@@ -79,9 +79,9 @@
 		switch (irq) {
 #ifdef CONFIG_SMP
 		case RTHAL_CRITICAL_IPI:
-		case INVALIDATE_TLB_VECTOR - FIRST_EXTERNAL_VECTOR:
-		case CALL_FUNCTION_VECTOR - FIRST_EXTERNAL_VECTOR:
-		case RESCHEDULE_VECTOR - FIRST_EXTERNAL_VECTOR:
+		case ipipe_apic_vector_irq(INVALIDATE_TLB_VECTOR):
+		case ipipe_apic_vector_irq(CALL_FUNCTION_VECTOR):
+		case ipipe_apic_vector_irq(RESCHEDULE_VECTOR):
 
 			continue;
 #endif /* CONFIG_SMP */
Index: include/asm-i386/hal.h
===================================================================
--- include/asm-i386/hal.h	(revision 2395)
+++ include/asm-i386/hal.h	(working copy)
@@ -142,6 +142,11 @@
 #define RTHAL_APIC_TIMER_IPI       RTHAL_SERVICE_IPI3
 #define RTHAL_APIC_ICOUNT          ((RTHAL_TIMER_FREQ + HZ/2)/HZ)
 #define RTHAL_TIMER_IRQ 	   RTHAL_APIC_TIMER_IPI
+#ifndef ipipe_apic_vector_irq
+/* Older I-pipe versions do not differentiate the normal IRQ space
+   from the system IRQ range, which is wrong... */
+#define ipipe_apic_vector_irq(vec) (vec - FIRST_EXTERNAL_VECTOR)
+#endif
 #else  /* !CONFIG_X86_LOCAL_APIC */
 #define RTHAL_TIMER_IRQ		   RTHAL_8254_IRQ
 #endif /* CONFIG_X86_LOCAL_APIC */
Index: ksrc/arch/i386/hal.c
===================================================================
--- ksrc/arch/i386/hal.c	(revision 2395)
+++ ksrc/arch/i386/hal.c	(working copy)
@@ -165,7 +165,7 @@
 #ifdef CONFIG_SMP
 	send_IPI_all(LOCAL_TIMER_VECTOR);
 #else
-	rthal_trigger_irq(LOCAL_TIMER_VECTOR -  FIRST_EXTERNAL_VECTOR);
+	rthal_trigger_irq(ipipe_apic_vector_irq(LOCAL_TIMER_VECTOR));
 #endif
 	return IRQ_HANDLED;
 }
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to