| Subject: softirq: Make serving softirqs a task flag |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Thu, 04 Oct 2012 14:30:25 +0100 |
| |
| Avoid the percpu softirq_runner pointer magic by using a task flag. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| include/linux/sched.h | 1 + |
| kernel/softirq.c | 20 +++----------------- |
| 2 files changed, 4 insertions(+), 17 deletions(-) |
| |
| Index: linux-stable/include/linux/sched.h |
| =================================================================== |
| --- linux-stable.orig/include/linux/sched.h |
| +++ linux-stable/include/linux/sched.h |
| @@ -1845,6 +1845,7 @@ extern void thread_group_times(struct ta |
| #define PF_MEMALLOC 0x00000800 /* Allocating memory */ |
| #define PF_NPROC_EXCEEDED 0x00001000 /* set_user noticed that RLIMIT_NPROC was exceeded */ |
| #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ |
| +#define PF_IN_SOFTIRQ 0x00004000 /* Task is serving softirq */ |
| #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ |
| #define PF_FROZEN 0x00010000 /* frozen for system suspend */ |
| #define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ |
| Index: linux-stable/kernel/softirq.c |
| =================================================================== |
| --- linux-stable.orig/kernel/softirq.c |
| +++ linux-stable/kernel/softirq.c |
| @@ -392,7 +392,6 @@ static inline void ksoftirqd_clr_sched_p |
| * 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); |
| |
| @@ -447,22 +446,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); |
| |
| @@ -480,7 +466,7 @@ static void __do_softirq_common(int need |
| /* 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(); |
| |
| @@ -491,7 +477,7 @@ static void __do_softirq_common(int need |
| wakeup_softirqd(); |
| |
| lockdep_softirq_exit(); |
| - __get_cpu_var(local_softirq_runner) = NULL; |
| + current->flags &= ~PF_IN_SOFTIRQ; |
| |
| current->softirq_nestcnt--; |
| } |