diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2013-02-13 17:11:56 +0100 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2013-04-23 20:16:19 -0400 |
commit | 9bfdab4866cf007ff31ee9395b4feb29f1ddce4f (patch) | |
tree | 713a5f3b710778b739d4b47a589d42371b52a8f1 | |
parent | 45e06ca512045c1c7fb333f9db850c25f06cfd6b (diff) | |
download | linux-rt-9bfdab4866cf007ff31ee9395b4feb29f1ddce4f.tar.gz |
softirq: Make serving softirqs a task flag
Avoid the percpu softirq_runner pointer magic by using a task flag.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
[bigeasy@linutronix: different PF_IN_SOFTIRQ bit]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | include/linux/sched.h | 1 | ||||
-rw-r--r-- | kernel/softirq.c | 20 |
2 files changed, 4 insertions, 17 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 41c097989f60..04b21c3c1f42 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1823,6 +1823,7 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * /* * Per process flags */ +#define PF_IN_SOFTIRQ 0x00000001 /* Task is serving softirq */ #define PF_STARTING 0x00000002 /* being created */ #define PF_EXITING 0x00000004 /* getting shut down */ #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ diff --git a/kernel/softirq.c b/kernel/softirq.c index ca00a687c52b..d4cace100010 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -383,7 +383,6 @@ static inline void ksoftirqd_clr_sched_params(void) { } * On RT we serialize softirq execution with a cpu local lock */ static DEFINE_LOCAL_IRQ_LOCK(local_softirq_lock); -static DEFINE_PER_CPU(struct task_struct *, local_softirq_runner); static void __do_softirq_common(int need_rcu_bh_qs); @@ -438,22 +437,9 @@ void _local_bh_enable(void) } EXPORT_SYMBOL(_local_bh_enable); -/* For tracing */ -int notrace __in_softirq(void) -{ - if (__get_cpu_var(local_softirq_lock).owner == current) - return __get_cpu_var(local_softirq_lock).nestcnt; - return 0; -} - int in_serving_softirq(void) { - int res; - - preempt_disable(); - res = __get_cpu_var(local_softirq_runner) == current; - preempt_enable(); - return res; + return current->flags & PF_IN_SOFTIRQ; } EXPORT_SYMBOL(in_serving_softirq); @@ -471,7 +457,7 @@ static void __do_softirq_common(int need_rcu_bh_qs) /* Reset the pending bitmask before enabling irqs */ set_softirq_pending(0); - __get_cpu_var(local_softirq_runner) = current; + current->flags |= PF_IN_SOFTIRQ; lockdep_softirq_enter(); @@ -482,7 +468,7 @@ static void __do_softirq_common(int need_rcu_bh_qs) wakeup_softirqd(); lockdep_softirq_exit(); - __get_cpu_var(local_softirq_runner) = NULL; + current->flags &= ~PF_IN_SOFTIRQ; current->softirq_nestcnt--; } |