Whamcloud - gitweb
LU-15156 kernel: back port patch for rwsem issue 83/45383/3
authorYang Sheng <ys@whamcloud.com>
Tue, 26 Oct 2021 08:09:20 +0000 (16:09 +0800)
committerOleg Drokin <green@whamcloud.com>
Sat, 20 Nov 2021 06:27:10 +0000 (06:27 +0000)
RHEL7 included a defeat in rwsem. It can cause a
thread hung on rwsem waiting infinity. Backport
commit: 5c1ec49b60cdb31e51010f8a647f3189b774bddf
to fix this issue.

Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: Ic5c469ce744ad5882c13163a9bfe14faef8fd446
Reviewed-on: https://review.whamcloud.com/45383
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/kernel_patches/patches/rwsem-remove-wakeup-optimization.patch [new file with mode: 0644]
lustre/kernel_patches/series/3.10-rhel7.6.series
lustre/kernel_patches/series/3.10-rhel7.7.series
lustre/kernel_patches/series/3.10-rhel7.8.series
lustre/kernel_patches/series/3.10-rhel7.9.series

diff --git a/lustre/kernel_patches/patches/rwsem-remove-wakeup-optimization.patch b/lustre/kernel_patches/patches/rwsem-remove-wakeup-optimization.patch
new file mode 100644 (file)
index 0000000..4600b1b
--- /dev/null
@@ -0,0 +1,117 @@
+From 5c1ec49b60cdb31e51010f8a647f3189b774bddf Mon Sep 17 00:00:00 2001
+From: Waiman Long <longman@redhat.com>
+Date: Mon, 20 May 2019 16:59:01 -0400
+Subject: [PATCH] locking/rwsem: Remove rwsem_wake() wakeup optimization
+
+After the following commit:
+
+  59aabfc7e959 ("locking/rwsem: Reduce spinlock contention in wakeup after up_read()/up_write()")
+
+the rwsem_wake() forgoes doing a wakeup if the wait_lock cannot be directly
+acquired and an optimistic spinning locker is present.  This can help performance
+by avoiding spinning on the wait_lock when it is contended.
+
+With the later commit:
+
+  133e89ef5ef3 ("locking/rwsem: Enable lockless waiter wakeup(s)")
+
+the performance advantage of the above optimization diminishes as the average
+wait_lock hold time become much shorter.
+
+With a later patch that supports rwsem lock handoff, we can no
+longer relies on the fact that the presence of an optimistic spinning
+locker will ensure that the lock will be acquired by a task soon and
+rwsem_wake() will be called later on to wake up waiters. This can lead
+to missed wakeup and application hang.
+
+So the original 59aabfc7e959 commit has to be reverted.
+
+Signed-off-by: Waiman Long <longman@redhat.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Davidlohr Bueso <dave@stgolabs.net>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Will Deacon <will.deacon@arm.com>
+Cc: huang ying <huang.ying.caritas@gmail.com>
+Link: https://lkml.kernel.org/r/20190520205918.22251-3-longman@redhat.com
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+---
+ kernel/locking/rwsem-xadd.c | 72 -------------------------------------
+ 1 file changed, 72 deletions(-)
+
+diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c
+index c0500679fd2f..3083fdf50447 100644
+--- a/lib/rwsem.c
++++ b/lib/rwsem.c
+@@ -411,25 +411,11 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
+       preempt_enable();
+       return taken;
+ }
+-
+-/*
+- * Return true if the rwsem has active spinner
+- */
+-static inline bool rwsem_has_spinner(struct rw_semaphore *sem)
+-{
+-      return osq_is_locked(&sem->osq);
+-}
+-
+ #else
+ static bool rwsem_optimistic_spin(struct rw_semaphore *sem)
+ {
+       return false;
+ }
+-
+-static inline bool rwsem_has_spinner(struct rw_semaphore *sem)
+-{
+-      return false;
+-}
+ #endif
+ /*
+@@ -651,38 +637,7 @@ struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem)
+       unsigned long flags;
+       WAKE_Q(wake_q);
+-      /*
+-       * If a spinner is present, it is not necessary to do the wakeup.
+-       * Try to do wakeup only if the trylock succeeds to minimize
+-       * spinlock contention which may introduce too much delay in the
+-       * unlock operation.
+-       *
+-       *    spinning writer           up_write/up_read caller
+-       *    ---------------           -----------------------
+-       * [S]   osq_unlock()           [L]   osq
+-       *       MB                           RMB
+-       * [RmW] rwsem_try_write_lock() [RmW] spin_trylock(wait_lock)
+-       *
+-       * Here, it is important to make sure that there won't be a missed
+-       * wakeup while the rwsem is free and the only spinning writer goes
+-       * to sleep without taking the rwsem. Even when the spinning writer
+-       * is just going to break out of the waiting loop, it will still do
+-       * a trylock in rwsem_down_write_failed() before sleeping. IOW, if
+-       * rwsem_has_spinner() is true, it will guarantee at least one
+-       * trylock attempt on the rwsem later on.
+-       */
+-      if (rwsem_has_spinner(sem)) {
+-              /*
+-               * The smp_rmb() here is to make sure that the spinner
+-               * state is consulted before reading the wait_lock.
+-               */
+-              smp_rmb();
+-              if (!raw_spin_trylock_irqsave(&sem->wait_lock, flags))
+-                      return sem;
+-              goto locked;
+-      }
+       raw_spin_lock_irqsave(&sem->wait_lock, flags);
+-locked:
+       /* do nothing if list empty */
+       if (!slist_empty(&sem->wait_list))
+-- 
+2.17.2 (Apple Git-113)
+
index 725e620..e1db1d4 100644 (file)
@@ -7,3 +7,4 @@ block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 dm-fix-handle-BLK_MQ_RQ_QUEUE_DEV_BUSY-rhel7.6.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 dm-fix-handle-BLK_MQ_RQ_QUEUE_DEV_BUSY-rhel7.6.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
+rwsem-remove-wakeup-optimization.patch
index 32c1343..7788a59 100644 (file)
@@ -6,3 +6,4 @@ fix-sd-dif-complete-rhel7.patch
 block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
 block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
+rwsem-remove-wakeup-optimization.patch
index 5c5dfd6..059dd33 100644 (file)
@@ -4,3 +4,4 @@ fix-sd-dif-complete-rhel7.patch
 block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
 block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
+rwsem-remove-wakeup-optimization.patch
index c3af94a..f9577dc 100644 (file)
@@ -3,3 +3,4 @@ fix-integrity-verify-rhel7.patch
 block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
 block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
 block-Ensure-we-only-enable-integrity-metadata-for-reads-and-writes-rhel7.patch
+rwsem-remove-wakeup-optimization.patch