diff options
Diffstat (limited to 'debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch')
-rw-r--r-- | debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch | 46 |
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 + |