On 05/22/2012 02:31 AM, Mitchell Tasman wrote:
> Hi. I'm running an OMAP DM3725-based board with a 2.6.38.8 kernel, a
> mid-May 2012 git snapshot of xenomai-2.6, and a backport (really just
> application) of the patch that Gilles referenced in the "IRQ latency"
> thread last week:
>
> http://git.xenomai.org/?p=ipipe-gch.git;a=commit;h=81bfc05c4716b76e79f5e486baf4c52015a3b92c
Please try the following patch instead:
diff --git a/arch/arm/include/asm/ipipe.h b/arch/arm/include/asm/ipipe.h
index 9b17c06..a510b09 100644
--- a/arch/arm/include/asm/ipipe.h
+++ b/arch/arm/include/asm/ipipe.h
@@ -285,14 +285,15 @@ void __ipipe_grab_irq(int irq, struct pt_regs *regs);
void __ipipe_exit_irq(struct pt_regs *regs);
-void __ipipe_handle_irq(int irq, struct pt_regs *regs);
+#define IPIPE_IRQF_NOACK 0x1
+#define IPIPE_IRQF_NOSYNC 0x2
+
+void __ipipe_handle_irq(int irq, int flags);
static inline void ipipe_handle_chained_irq(unsigned int irq)
{
- struct pt_regs regs; /* dummy */
-
ipipe_trace_irq_entry(irq);
- __ipipe_handle_irq(irq, ®s);
+ __ipipe_handle_irq(irq, IPIPE_IRQF_NOSYNC);
ipipe_trace_irq_exit(irq);
}
diff --git a/arch/arm/include/asm/smp_twd.h b/arch/arm/include/asm/smp_twd.h
index b49c8ac..f655b27 100644
--- a/arch/arm/include/asm/smp_twd.h
+++ b/arch/arm/include/asm/smp_twd.h
@@ -55,7 +55,7 @@ extern void __iomem *twd_base;
#define __ipipe_mach_relay_ipi(ipi, thiscpu) \
({ \
(void)(thiscpu); \
- __ipipe_handle_irq(ipi, NULL); \
+ __ipipe_handle_irq(ipi, IPIPE_IRQF_NOACK); \
})
struct irq_desc;
diff --git a/arch/arm/kernel/ipipe.c b/arch/arm/kernel/ipipe.c
index f2f618c..ff93fa9 100644
--- a/arch/arm/kernel/ipipe.c
+++ b/arch/arm/kernel/ipipe.c
@@ -254,7 +254,7 @@ int ipipe_trigger_irq(unsigned irq)
return -EINVAL;
#endif
local_irq_save_hw(flags);
- __ipipe_handle_irq(irq, NULL);
+ __ipipe_handle_irq(irq, IPIPE_IRQF_NOACK);
local_irq_restore_hw(flags);
return 1;
@@ -462,7 +462,7 @@ out:
* interrupt protection log is maintained here for each domain. Hw
* interrupts are off on entry.
*/
-void __ipipe_handle_irq(int irq, struct pt_regs *regs)
+void __ipipe_handle_irq(int irq, int flags)
{
struct ipipe_domain *this_domain, *next_domain;
struct list_head *head, *pos;
@@ -470,7 +470,7 @@ void __ipipe_handle_irq(int irq, struct pt_regs *regs)
int m_ack;
/* Software-triggered IRQs do not need any ack. */
- m_ack = (regs == NULL);
+ m_ack = (flags & IPIPE_IRQF_NOACK) != 0;
#ifdef CONFIG_IPIPE_DEBUG
if (unlikely(irq >= IPIPE_NR_IRQS) ||
@@ -490,7 +490,11 @@ void __ipipe_handle_irq(int irq, struct pt_regs *regs)
desc = ipipe_virtual_irq_p(irq) ? NULL :
irq_to_desc(irq);
next_domain->irqs[irq].acknowledge(irq, desc);
}
- __ipipe_dispatch_wired(next_domain, irq);
+ if ((flags & IPIPE_IRQF_NOSYNC) == 0)
+ __ipipe_dispatch_wired(next_domain, irq);
+ else
+ __ipipe_set_irq_pending(next_domain, irq);
+
return;
}
}
@@ -604,7 +608,7 @@ asmlinkage void __ipipe_grab_irq(int irq, struct pt_regs
*regs)
ipipe_trace_begin(regs->ARM_ORIG_r0);
#endif
- __ipipe_handle_irq(irq, regs);
+ __ipipe_handle_irq(irq, 0);
#ifdef CONFIG_IPIPE_TRACE_IRQSOFF
ipipe_trace_end(regs->ARM_ORIG_r0);
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 9ea207d..af02caa 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -527,7 +527,7 @@ __ipipe_grab_ipi(unsigned svc, struct pt_regs *regs) /* hw
IRQs off */
__ipipe_do_vnmi(IPIPE_SERVICE_VNMI, NULL);
else if ((1 << svc) & IPI_IPIPE_ALL) {
virq = svc - IPI_IPIPE_CRITICAL + IPIPE_FIRST_IPI;
- __ipipe_handle_irq(virq, NULL);
+ __ipipe_handle_irq(virq, IPIPE_IRQF_NOACK);
} else
__ipipe_mach_relay_ipi(svc, cpu);
--
Gilles.
_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai