aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/interrupt.h
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2009-07-22 08:18:35 -0400
committerThomas Gleixner <tglx@linutronix.de>2009-07-22 11:01:17 -0400
commit9ba5f005c994ad28e266a0cd14ef29354be382c9 (patch)
tree0a2ff570070afc18e7dad61a2955b94614ce9b51 /include/linux/interrupt.h
parentaea1f7964ae6cba5eb419a958956deb9016b3341 (diff)
softirq: introduce tasklet_hrtimer infrastructure
commit ca109491f (hrtimer: removing all ur callback modes) moved all hrtimer callbacks into hard interrupt context when high resolution timers are active. That breaks code which relied on the assumption that the callback happens in softirq context. Provide a generic infrastructure which combines tasklets and hrtimers together to provide an in-softirq hrtimer experience. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: torvalds@linux-foundation.org Cc: kaber@trash.net Cc: David Miller <davem@davemloft.net> LKML-Reference: <1248265724.27058.1366.camel@twins> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/interrupt.h')
-rw-r--r--include/linux/interrupt.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index 2721f07e9354..fd4c9c63c757 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -14,6 +14,7 @@
14#include <linux/irqflags.h> 14#include <linux/irqflags.h>
15#include <linux/smp.h> 15#include <linux/smp.h>
16#include <linux/percpu.h> 16#include <linux/percpu.h>
17#include <linux/hrtimer.h>
17 18
18#include <asm/atomic.h> 19#include <asm/atomic.h>
19#include <asm/ptrace.h> 20#include <asm/ptrace.h>
@@ -517,6 +518,31 @@ extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
517extern void tasklet_init(struct tasklet_struct *t, 518extern void tasklet_init(struct tasklet_struct *t,
518 void (*func)(unsigned long), unsigned long data); 519 void (*func)(unsigned long), unsigned long data);
519 520
521struct tasklet_hrtimer {
522 struct hrtimer timer;
523 struct tasklet_struct tasklet;
524 enum hrtimer_restart (*function)(struct hrtimer *);
525};
526
527extern void
528tasklet_hrtimer_init(struct tasklet_hrtimer *ttimer,
529 enum hrtimer_restart (*function)(struct hrtimer *),
530 clockid_t which_clock, enum hrtimer_mode mode);
531
532static inline
533int tasklet_hrtimer_start(struct tasklet_hrtimer *ttimer, ktime_t time,
534 const enum hrtimer_mode mode)
535{
536 return hrtimer_start(&ttimer->timer, time, mode);
537}
538
539static inline
540void tasklet_hrtimer_cancel(struct tasklet_hrtimer *ttimer)
541{
542 hrtimer_cancel(&ttimer->timer);
543 tasklet_kill(&ttimer->tasklet);
544}
545
520/* 546/*
521 * Autoprobing for irqs: 547 * Autoprobing for irqs:
522 * 548 *