diff options
author | Philippe Gerum <rpm@xenomai.org> | 2009-06-22 12:23:32 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2009-09-16 21:28:33 -0400 |
commit | 6b8019c85e18295466095a5778a14c1e9a067554 (patch) | |
tree | de7b2b5ee21f5d70746821a2a5d929577cd0fed5 /arch/blackfin/kernel | |
parent | bc569f1a77199926be97ba6266dbea27768264df (diff) |
Blackfin: allow high priority domains to preempt schedule_tail()
ret_from_fork is always entered with hw interrupts off, which prevents
real-time domains to preempt the Linux kernel during part of the
initial context switch to the new task, which could in turn raise the
worst-case latency figures.
To avoid this, stall the root domain stage in the interrupt pipeline
to keep the scheduling tail code free from Linux-handled IRQs, then
enable hardware interrupts again.
Signed-off-by: Philippe Gerum <rpm@xenomai.org>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'arch/blackfin/kernel')
-rw-r--r-- | arch/blackfin/kernel/entry.S | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/arch/blackfin/kernel/entry.S b/arch/blackfin/kernel/entry.S index a9cfba9946b5..3f8769b7db54 100644 --- a/arch/blackfin/kernel/entry.S +++ b/arch/blackfin/kernel/entry.S | |||
@@ -43,8 +43,28 @@ | |||
43 | 43 | ||
44 | ENTRY(_ret_from_fork) | 44 | ENTRY(_ret_from_fork) |
45 | #ifdef CONFIG_IPIPE | 45 | #ifdef CONFIG_IPIPE |
46 | [--sp] = reti; /* IRQs on. */ | 46 | /* |
47 | SP += 4; | 47 | * Hw IRQs are off on entry, and we don't want the scheduling tail |
48 | * code to starve high priority domains from interrupts while it | ||
49 | * runs. Therefore we first stall the root stage to have the | ||
50 | * virtual interrupt state reflect IMASK. | ||
51 | */ | ||
52 | p0.l = ___ipipe_root_status; | ||
53 | p0.h = ___ipipe_root_status; | ||
54 | r4 = [p0]; | ||
55 | bitset(r4, 0); | ||
56 | [p0] = r4; | ||
57 | /* | ||
58 | * Then we may enable hw IRQs, allowing preemption from high | ||
59 | * priority domains. schedule_tail() will do local_irq_enable() | ||
60 | * since Blackfin does not define __ARCH_WANT_UNLOCKED_CTXSW, so | ||
61 | * there is no need to unstall the root domain by ourselves | ||
62 | * afterwards. | ||
63 | */ | ||
64 | p0.l = _bfin_irq_flags; | ||
65 | p0.h = _bfin_irq_flags; | ||
66 | r4 = [p0]; | ||
67 | sti r4; | ||
48 | #endif /* CONFIG_IPIPE */ | 68 | #endif /* CONFIG_IPIPE */ |
49 | SP += -12; | 69 | SP += -12; |
50 | call _schedule_tail; | 70 | call _schedule_tail; |