aboutsummaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2011-11-13 17:17:09 +0100
committerSebastian Andrzej Siewior <bigeasy@linutronix.de>2016-12-23 17:14:25 +0100
commit62bc6309fad70622ebf31fd337ac67e4d9dc7e44 (patch)
tree877e9f77ed5083a79356e15302cea72c75a0fbaa /block
parent5cc148e453c3d600ef5ccc8655bacc3313cf95f7 (diff)
softirq: Check preemption after reenabling interrupts
raise_softirq_irqoff() disables interrupts and wakes the softirq daemon, but after reenabling interrupts there is no preemption check, so the execution of the softirq thread might be delayed arbitrarily. In principle we could add that check to local_irq_enable/restore, but that's overkill as the rasie_softirq_irqoff() sections are the only ones which show this behaviour. Reported-by: Carsten Emde <cbe@osadl.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'block')
-rw-r--r--block/blk-softirq.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/block/blk-softirq.c b/block/blk-softirq.c
index 06cf9807f49a..c40342643ca0 100644
--- a/block/blk-softirq.c
+++ b/block/blk-softirq.c
@@ -51,6 +51,7 @@ static void trigger_softirq(void *data)
raise_softirq_irqoff(BLOCK_SOFTIRQ);
local_irq_restore(flags);
+ preempt_check_resched_rt();
}
/*
@@ -89,6 +90,7 @@ static int blk_softirq_cpu_dead(unsigned int cpu)
this_cpu_ptr(&blk_cpu_done));
raise_softirq_irqoff(BLOCK_SOFTIRQ);
local_irq_enable();
+ preempt_check_resched_rt();
return 0;
}
@@ -141,6 +143,7 @@ do_local:
goto do_local;
local_irq_restore(flags);
+ preempt_check_resched_rt();
}
/**