[MIPS] SMTC: Instant IPI replay.
SMTC pseudo-interrupts between TCs are deferred and queued if the target TC is interrupt-inhibited (IXMT). In the first SMTC prototypes, these queued IPIs were serviced on return to user mode, or on entry into the kernel idle loop. The INSTANT_REPLAY option dispatches them as part of local_irq_restore() processing, which adds runtime overhead (hence the option to turn it off), but ensures that IPIs are handled promptly even under heavy I/O interrupt load. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
@@ -15,6 +15,27 @@
|
||||
|
||||
#include <asm/hazards.h>
|
||||
|
||||
/*
|
||||
* CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY does prompt replay of deferred IPIs,
|
||||
* at the cost of branch and call overhead on each local_irq_restore()
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY
|
||||
|
||||
extern void smtc_ipi_replay(void);
|
||||
|
||||
#define irq_restore_epilog(flags) \
|
||||
do { \
|
||||
if (!(flags & 0x0400)) \
|
||||
smtc_ipi_replay(); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define irq_restore_epilog(ignore) do { } while (0)
|
||||
|
||||
#endif /* CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY */
|
||||
|
||||
__asm__ (
|
||||
" .macro raw_local_irq_enable \n"
|
||||
" .set push \n"
|
||||
@@ -193,6 +214,7 @@ do { \
|
||||
: "=r" (__tmp1) \
|
||||
: "0" (flags) \
|
||||
: "memory"); \
|
||||
irq_restore_epilog(flags); \
|
||||
} while(0)
|
||||
|
||||
static inline int raw_irqs_disabled_flags(unsigned long flags)
|
||||
|
Reference in New Issue
Block a user