summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch46
1 files changed, 46 insertions, 0 deletions
diff --git a/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch b/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch
new file mode 100644
index 000000000..3128f971d
--- /dev/null
+++ b/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch
@@ -0,0 +1,46 @@
+From 229f57115cd91a8632a85152d6e43e781ebd367e Mon Sep 17 00:00:00 2001
+From: Scott Wood <swood@redhat.com>
+Date: Fri, 4 Jan 2019 15:33:21 -0500
+Subject: [PATCH 151/347] locking/rt-mutex: Flush block plug on __down_read()
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.246-rt110.tar.xz
+
+__down_read() bypasses the rtmutex frontend to call
+rt_mutex_slowlock_locked() directly, and thus it needs to call
+blk_schedule_flush_flug() itself.
+
+Cc: stable-rt@vger.kernel.org
+Signed-off-by: Scott Wood <swood@redhat.com>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/locking/rwsem-rt.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c
+index 660e22caf709..f518495bd6cc 100644
+--- a/kernel/locking/rwsem-rt.c
++++ b/kernel/locking/rwsem-rt.c
+@@ -1,5 +1,6 @@
+ /*
+ */
++#include <linux/blkdev.h>
+ #include <linux/rwsem.h>
+ #include <linux/sched/debug.h>
+ #include <linux/sched/signal.h>
+@@ -87,6 +88,14 @@ static int __sched __down_read_common(struct rw_semaphore *sem, int state)
+
+ if (__down_read_trylock(sem))
+ return 0;
++ /*
++ * If rt_mutex blocks, the function sched_submit_work will not call
++ * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true).
++ * We must call blk_schedule_flush_plug here, if we don't call it,
++ * a deadlock in I/O may happen.
++ */
++ if (unlikely(blk_needs_flush_plug(current)))
++ blk_schedule_flush_plug(current);
+
+ might_sleep();
+ raw_spin_lock_irq(&m->wait_lock);
+--
+2.36.1
+