From 5ae9476c272d2e1559a54b9a5593f2c009cda6b5 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 11 Aug 2018 19:13:14 +0200 Subject: [PATCH] 4.9-stable patches added patches: mark-hi-and-tasklet-softirq-synchronous.patch --- ...k-hi-and-tasklet-softirq-synchronous.patch | 103 ++++++++++++++++++ queue-4.9/series | 1 + 2 files changed, 104 insertions(+) create mode 100644 queue-4.9/mark-hi-and-tasklet-softirq-synchronous.patch diff --git a/queue-4.9/mark-hi-and-tasklet-softirq-synchronous.patch b/queue-4.9/mark-hi-and-tasklet-softirq-synchronous.patch new file mode 100644 index 00000000000..678b1ba26d1 --- /dev/null +++ b/queue-4.9/mark-hi-and-tasklet-softirq-synchronous.patch @@ -0,0 +1,103 @@ +From 3c53776e29f81719efcf8f7a6e30cdf753bee94d Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Mon, 8 Jan 2018 11:51:04 -0800 +Subject: Mark HI and TASKLET softirq synchronous + +From: Linus Torvalds + +commit 3c53776e29f81719efcf8f7a6e30cdf753bee94d upstream. + +Way back in 4.9, we committed 4cd13c21b207 ("softirq: Let ksoftirqd do +its job"), and ever since we've had small nagging issues with it. For +example, we've had: + + 1ff688209e2e ("watchdog: core: make sure the watchdog_worker is not deferred") + 8d5755b3f77b ("watchdog: softdog: fire watchdog even if softirqs do not get to run") + 217f69743681 ("net: busy-poll: allow preemption in sk_busy_loop()") + +all of which worked around some of the effects of that commit. + +The DVB people have also complained that the commit causes excessive USB +URB latencies, which seems to be due to the USB code using tasklets to +schedule USB traffic. This seems to be an issue mainly when already +living on the edge, but waiting for ksoftirqd to handle it really does +seem to cause excessive latencies. + +Now Hanna Hawa reports that this issue isn't just limited to USB URB and +DVB, but also causes timeout problems for the Marvell SoC team: + + "I'm facing kernel panic issue while running raid 5 on sata disks + connected to Macchiatobin (Marvell community board with Armada-8040 + SoC with 4 ARMv8 cores of CA72) Raid 5 built with Marvell DMA engine + and async_tx mechanism (ASYNC_TX_DMA [=y]); the DMA driver (mv_xor_v2) + uses a tasklet to clean the done descriptors from the queue" + +The latency problem causes a panic: + + mv_xor_v2 f0400000.xor: dma_sync_wait: timeout! + Kernel panic - not syncing: async_tx_quiesce: DMA error waiting for transaction + +We've discussed simply just reverting the original commit entirely, and +also much more involved solutions (with per-softirq threads etc). This +patch is intentionally stupid and fairly limited, because the issue +still remains, and the other solutions either got sidetracked or had +other issues. + +We should probably also consider the timer softirqs to be synchronous +and not be delayed to ksoftirqd (since they were the issue with the +earlier watchdog problems), but that should be done as a separate patch. +This does only the tasklet cases. + +Reported-and-tested-by: Hanna Hawa +Reported-and-tested-by: Josef Griebichler +Reported-by: Mauro Carvalho Chehab +Cc: Alan Stern +Cc: Greg Kroah-Hartman +Cc: Eric Dumazet +Cc: Ingo Molnar +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/softirq.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -79,12 +79,16 @@ static void wakeup_softirqd(void) + + /* + * If ksoftirqd is scheduled, we do not want to process pending softirqs +- * right now. Let ksoftirqd handle this at its own rate, to get fairness. ++ * right now. Let ksoftirqd handle this at its own rate, to get fairness, ++ * unless we're doing some of the synchronous softirqs. + */ +-static bool ksoftirqd_running(void) ++#define SOFTIRQ_NOW_MASK ((1 << HI_SOFTIRQ) | (1 << TASKLET_SOFTIRQ)) ++static bool ksoftirqd_running(unsigned long pending) + { + struct task_struct *tsk = __this_cpu_read(ksoftirqd); + ++ if (pending & SOFTIRQ_NOW_MASK) ++ return false; + return tsk && (tsk->state == TASK_RUNNING); + } + +@@ -324,7 +328,7 @@ asmlinkage __visible void do_softirq(voi + + pending = local_softirq_pending(); + +- if (pending && !ksoftirqd_running()) ++ if (pending && !ksoftirqd_running(pending)) + do_softirq_own_stack(); + + local_irq_restore(flags); +@@ -351,7 +355,7 @@ void irq_enter(void) + + static inline void invoke_softirq(void) + { +- if (ksoftirqd_running()) ++ if (ksoftirqd_running(local_softirq_pending())) + return; + + if (!force_irqthreads) { diff --git a/queue-4.9/series b/queue-4.9/series index 2ca2711a04b..49b496bd612 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -3,3 +3,4 @@ tpm-fix-race-condition-in-tpm_common_write.patch parisc-enable-config_mlongcalls-by-default.patch parisc-define-mb-and-add-memory-barriers-to-assembler-unlock-sequences.patch kasan-add-no_sanitize-attribute-for-clang-builds.patch +mark-hi-and-tasklet-softirq-synchronous.patch -- 2.47.3