History

genirq: Change force_irqthreads to a static key

With CONFIG_IRQ_FORCED_THREADING=y, testing the boolean force_irqthreads could incur a cache line miss in invoke_softirq() and other places. Replace the test with a static key to avoid the potential cache miss. [ tglx: Dropped the IDE part, removed the export and updated blk-mq ]

Tanner Love committed 5 years ago

Commit 91cc4701 parent 5a6c76b4 files · +12 −11Browse files

Showing the changes to kernel (2 of 4 files). Show all

Unified · Split

2 files
  1. kernel/irq/manage.c +5 −6
  2. kernel/softirq.c +1 −1
kernel/irq/manage.c+5−6
@@ -25,12 +25,11 @@ · 24 unmodified lines
2525 #include "internals.h"
2626
2727 #if defined(CONFIG_IRQ_FORCED_THREADING) && !defined(CONFIG_PREEMPT_RT)
28−__read_mostly bool force_irqthreads;
29−EXPORT_SYMBOL_GPL(force_irqthreads);
28+DEFINE_STATIC_KEY_FALSE(force_irqthreads_key);
3029
3130 static int __init setup_forced_irqthreads(char *arg)
3231 {
33− force_irqthreads = true;
32+ static_branch_enable(&force_irqthreads_key);
3433 return 0;
3534 }
3635 early_param("threadirqs", setup_forced_irqthreads);
@@ -1260,8 +1259,8 @@ static int irq_thread(void *data) · 1223 unmodified lines
12601259 irqreturn_t (*handler_fn)(struct irq_desc *desc,
12611260 struct irqaction *action);
12621261
1263− if (force_irqthreads && test_bit(IRQTF_FORCED_THREAD,
1264− &action->thread_flags))
1262+ if (force_irqthreads() && test_bit(IRQTF_FORCED_THREAD,
1263+ &action->thread_flags))
12651264 handler_fn = irq_forced_thread_fn;
12661265 else
12671266 handler_fn = irq_thread_fn;
@@ -1322,7 +1321,7 @@ EXPORT_SYMBOL_GPL(irq_wake_thread); · 54 unmodified lines
13221321
13231322 static int irq_setup_forced_threading(struct irqaction *new)
13241323 {
1325− if (!force_irqthreads)
1324+ if (!force_irqthreads())
13261325 return 0;
13271326 if (new->flags & (IRQF_NO_THREAD | IRQF_PERCPU | IRQF_ONESHOT))
13281327 return 0;
kernel/softirq.c+1−1
@@ -422,7 +422,7 @@ static inline void invoke_softirq(void) · 421 unmodified lines
422422 if (ksoftirqd_running(local_softirq_pending()))
423423 return;
424424
425− if (!force_irqthreads || !__this_cpu_read(ksoftirqd)) {
425+ if (!force_irqthreads() || !__this_cpu_read(ksoftirqd)) {
426426 #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
427427 /*
428428 * We can safely execute softirq on the current stack if

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t