diff options
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.patch | 50 |
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; |