summaryrefslogtreecommitdiff
path: root/patches/0004-locking-percpu-rwsem-Extract-__percpu_down_read_tryl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/0004-locking-percpu-rwsem-Extract-__percpu_down_read_tryl.patch')
-rw-r--r--patches/0004-locking-percpu-rwsem-Extract-__percpu_down_read_tryl.patch50
1 files changed, 50 insertions, 0 deletions
diff --git a/patches/0004-locking-percpu-rwsem-Extract-__percpu_down_read_tryl.patch b/patches/0004-locking-percpu-rwsem-Extract-__percpu_down_read_tryl.patch
new file mode 100644
index 000000000000..70ac7a9b5447
--- /dev/null
+++ b/patches/0004-locking-percpu-rwsem-Extract-__percpu_down_read_tryl.patch
@@ -0,0 +1,50 @@
+From: Peter Zijlstra <peterz@infradead.org>
+Date: Fri, 31 Jan 2020 16:07:07 +0100
+Subject: [PATCH 4/7] locking/percpu-rwsem: Extract
+ __percpu_down_read_trylock()
+
+In preparation for removing the embedded rwsem and building a custom
+lock, extract the read-trylock primitive.
+
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Tested-by: Juri Lelli <juri.lelli@redhat.com>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/locking/percpu-rwsem.c | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+--- a/kernel/locking/percpu-rwsem.c
++++ b/kernel/locking/percpu-rwsem.c
+@@ -45,7 +45,7 @@ void percpu_free_rwsem(struct percpu_rw_
+ }
+ EXPORT_SYMBOL_GPL(percpu_free_rwsem);
+
+-bool __percpu_down_read(struct percpu_rw_semaphore *sem, bool try)
++static bool __percpu_down_read_trylock(struct percpu_rw_semaphore *sem)
+ {
+ __this_cpu_inc(*sem->read_count);
+
+@@ -73,11 +73,18 @@ bool __percpu_down_read(struct percpu_rw
+ if (likely(!smp_load_acquire(&sem->readers_block)))
+ return true;
+
+- /*
+- * Per the above comment; we still have preemption disabled and
+- * will thus decrement on the same CPU as we incremented.
+- */
+- __percpu_up_read(sem);
++ __this_cpu_dec(*sem->read_count);
++
++ /* Prod writer to re-evaluate readers_active_check() */
++ rcuwait_wake_up(&sem->writer);
++
++ return false;
++}
++
++bool __percpu_down_read(struct percpu_rw_semaphore *sem, bool try)
++{
++ if (__percpu_down_read_trylock(sem))
++ return true;
+
+ if (try)
+ return false;