Messages in this thread Patch in this message | | | From | Frederic Weisbecker <> | Subject | [PATCH 1/4] irq: Support to compute context on top of a given preempt_count offset | Date | Fri, 21 May 2010 16:05:12 +0200 |
| |
This brings the support to compute irq/preempt contexts on top of a a given preempt count offset instead of the current one.
This is going to be useful for perf that needs to know the preempt_count() of the context that an event has interrupted.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Paul Mackerras <paulus@samba.org> --- include/linux/hardirq.h | 17 +++++++++++++---- 1 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index d5b3876..0195547 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -58,6 +58,7 @@ #define SOFTIRQ_MASK (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT) #define HARDIRQ_MASK (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT) #define NMI_MASK (__IRQ_MASK(NMI_BITS) << NMI_SHIFT) +#define IRQ_MASK (SOFTIRQ_MASK | HARDIRQ_MASK | NMI_MASK) #define PREEMPT_OFFSET (1UL << PREEMPT_SHIFT) #define SOFTIRQ_OFFSET (1UL << SOFTIRQ_SHIFT) @@ -74,15 +75,23 @@ #error PREEMPT_ACTIVE is too low! #endif -#define hardirq_count() (preempt_count() & HARDIRQ_MASK) -#define softirq_count() (preempt_count() & SOFTIRQ_MASK) -#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \ - | NMI_MASK)) +#define hardirq_count_offset(offset) ((offset) & HARDIRQ_MASK) +#define softirq_count_offset(offset) ((offset) & SOFTIRQ_MASK) +#define irq_count_offset(offset) ((offset) & IRQ_MASK) + +#define hardirq_count() hardirq_count_offset(preempt_count()) +#define softirq_count() softirq_count_offset(preempt_count()) +#define irq_count() irq_count_offset(preempt_count()) /* * Are we doing bottom half or hardware interrupt processing? * Are we in a softirq context? Interrupt context? */ +#define in_irq_offset(offset) (hardirq_count_offset(offset)) +#define in_softirq_offset(offset) (softirq_count_offset(offset)) +#define in_interrupt_offset(offset) (irq_count_offset(offset)) + + #define in_irq() (hardirq_count()) #define in_softirq() (softirq_count()) #define in_interrupt() (irq_count()) -- 1.6.2.3
| |