summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2011-07-21 21:06:43 +0200
committerClark Williams <williams@redhat.com>2012-04-13 11:01:40 -0500
commitd0c24b135b25188c7c193168de9cc3b50b6ce75b (patch)
treead3b0196beb409daf416db1e90c214a395a3faee /kernel
parent3be6ba65ee05e7748a479178ff5dcd611f274a53 (diff)
softirq-make-fifo.patch
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/softirq.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c
index d1fdb9155d44..86561c0bebc6 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -372,6 +372,8 @@ asmlinkage void do_softirq(void)
static inline void local_bh_disable_nort(void) { local_bh_disable(); }
static inline void _local_bh_enable_nort(void) { _local_bh_enable(); }
+static inline void ksoftirqd_set_sched_params(void) { }
+static inline void ksoftirqd_clr_sched_params(void) { }
#else /* !PREEMPT_RT_FULL */
@@ -526,6 +528,20 @@ static int ksoftirqd_do_softirq(int cpu)
static inline void local_bh_disable_nort(void) { }
static inline void _local_bh_enable_nort(void) { }
+static inline void ksoftirqd_set_sched_params(void)
+{
+ struct sched_param param = { .sched_priority = 1 };
+
+ sched_setscheduler(current, SCHED_FIFO, &param);
+}
+
+static inline void ksoftirqd_clr_sched_params(void)
+{
+ struct sched_param param = { .sched_priority = 0 };
+
+ sched_setscheduler(current, SCHED_NORMAL, &param);
+}
+
#endif /* PREEMPT_RT_FULL */
/*
* Enter an interrupt context.
@@ -977,6 +993,8 @@ void __init softirq_init(void)
static int run_ksoftirqd(void * __bind_cpu)
{
+ ksoftirqd_set_sched_params();
+
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {
@@ -1002,6 +1020,7 @@ static int run_ksoftirqd(void * __bind_cpu)
wait_to_die:
preempt_enable();
+ ksoftirqd_clr_sched_params();
/* Wait for kthread_stop */
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {