summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch')
-rw-r--r--debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch226
1 files changed, 226 insertions, 0 deletions
diff --git a/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch b/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch
new file mode 100644
index 000000000..a6a0cd7c4
--- /dev/null
+++ b/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch
@@ -0,0 +1,226 @@
+From 80adc8fb1dabebcc9d41cb6c0f122860061c12a3 Mon Sep 17 00:00:00 2001
+From: Peter Zijlstra <peterz@infradead.org>
+Date: Wed, 23 Nov 2016 16:29:32 +0100
+Subject: [PATCH 169/347] locking/percpu-rwsem: Remove preempt_disable variants
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.246-rt110.tar.xz
+
+Effective revert commit:
+
+ 87709e28dc7c ("fs/locks: Use percpu_down_read_preempt_disable()")
+
+This is causing major pain for PREEMPT_RT and is only a very small
+performance issue for PREEMPT=y.
+
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+---
+ fs/locks.c | 32 ++++++++++++++++----------------
+ include/linux/percpu-rwsem.h | 24 ++++--------------------
+ 2 files changed, 20 insertions(+), 36 deletions(-)
+
+diff --git a/fs/locks.c b/fs/locks.c
+index 28270e74be34..552476d6f6bb 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -936,7 +936,7 @@ static int flock_lock_inode(struct inode *inode, struct file_lock *request)
+ return -ENOMEM;
+ }
+
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+ if (request->fl_flags & FL_ACCESS)
+ goto find_conflict;
+@@ -977,7 +977,7 @@ static int flock_lock_inode(struct inode *inode, struct file_lock *request)
+
+ out:
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+ if (new_fl)
+ locks_free_lock(new_fl);
+ locks_dispose_list(&dispose);
+@@ -1015,7 +1015,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request,
+ new_fl2 = locks_alloc_lock();
+ }
+
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+ /*
+ * New lock request. Walk all POSIX locks and look for conflicts. If
+@@ -1187,7 +1187,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request,
+ }
+ out:
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+ /*
+ * Free any unused locks.
+ */
+@@ -1462,7 +1462,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
+ return error;
+ }
+
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+
+ time_out_leases(inode, &dispose);
+@@ -1514,13 +1514,13 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
+ locks_insert_block(fl, new_fl);
+ trace_break_lease_block(inode, new_fl);
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+
+ locks_dispose_list(&dispose);
+ error = wait_event_interruptible_timeout(new_fl->fl_wait,
+ !new_fl->fl_next, break_time);
+
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+ trace_break_lease_unblock(inode, new_fl);
+ locks_delete_block(new_fl);
+@@ -1537,7 +1537,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
+ }
+ out:
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+ locks_dispose_list(&dispose);
+ locks_free_lock(new_fl);
+ return error;
+@@ -1609,7 +1609,7 @@ int fcntl_getlease(struct file *filp)
+
+ ctx = smp_load_acquire(&inode->i_flctx);
+ if (ctx && !list_empty_careful(&ctx->flc_lease)) {
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+ time_out_leases(inode, &dispose);
+ list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
+@@ -1619,7 +1619,7 @@ int fcntl_getlease(struct file *filp)
+ break;
+ }
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+
+ locks_dispose_list(&dispose);
+ }
+@@ -1693,7 +1693,7 @@ generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **pr
+ return -EINVAL;
+ }
+
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+ time_out_leases(inode, &dispose);
+ error = check_conflicting_open(dentry, arg, lease->fl_flags);
+@@ -1764,7 +1764,7 @@ generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **pr
+ lease->fl_lmops->lm_setup(lease, priv);
+ out:
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+ locks_dispose_list(&dispose);
+ if (is_deleg)
+ inode_unlock(inode);
+@@ -1787,7 +1787,7 @@ static int generic_delete_lease(struct file *filp, void *owner)
+ return error;
+ }
+
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+ list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
+ if (fl->fl_file == filp &&
+@@ -1800,7 +1800,7 @@ static int generic_delete_lease(struct file *filp, void *owner)
+ if (victim)
+ error = fl->fl_lmops->lm_change(victim, F_UNLCK, &dispose);
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+ locks_dispose_list(&dispose);
+ return error;
+ }
+@@ -2531,13 +2531,13 @@ locks_remove_lease(struct file *filp, struct file_lock_context *ctx)
+ if (list_empty(&ctx->flc_lease))
+ return;
+
+- percpu_down_read_preempt_disable(&file_rwsem);
++ percpu_down_read(&file_rwsem);
+ spin_lock(&ctx->flc_lock);
+ list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list)
+ if (filp == fl->fl_file)
+ lease_modify(fl, F_UNLCK, &dispose);
+ spin_unlock(&ctx->flc_lock);
+- percpu_up_read_preempt_enable(&file_rwsem);
++ percpu_up_read(&file_rwsem);
+
+ locks_dispose_list(&dispose);
+ }
+diff --git a/include/linux/percpu-rwsem.h b/include/linux/percpu-rwsem.h
+index 79b99d653e03..fb44e237316d 100644
+--- a/include/linux/percpu-rwsem.h
++++ b/include/linux/percpu-rwsem.h
+@@ -29,7 +29,7 @@ static struct percpu_rw_semaphore name = { \
+ extern int __percpu_down_read(struct percpu_rw_semaphore *, int);
+ extern void __percpu_up_read(struct percpu_rw_semaphore *);
+
+-static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore *sem)
++static inline void percpu_down_read(struct percpu_rw_semaphore *sem)
+ {
+ might_sleep();
+
+@@ -47,16 +47,10 @@ static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore *
+ __this_cpu_inc(*sem->read_count);
+ if (unlikely(!rcu_sync_is_idle(&sem->rss)))
+ __percpu_down_read(sem, false); /* Unconditional memory barrier */
+- barrier();
+ /*
+- * The barrier() prevents the compiler from
++ * The preempt_enable() prevents the compiler from
+ * bleeding the critical section out.
+ */
+-}
+-
+-static inline void percpu_down_read(struct percpu_rw_semaphore *sem)
+-{
+- percpu_down_read_preempt_disable(sem);
+ preempt_enable();
+ }
+
+@@ -83,13 +77,9 @@ static inline int percpu_down_read_trylock(struct percpu_rw_semaphore *sem)
+ return ret;
+ }
+
+-static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem)
++static inline void percpu_up_read(struct percpu_rw_semaphore *sem)
+ {
+- /*
+- * The barrier() prevents the compiler from
+- * bleeding the critical section out.
+- */
+- barrier();
++ preempt_disable();
+ /*
+ * Same as in percpu_down_read().
+ */
+@@ -102,12 +92,6 @@ static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem
+ rwsem_release(&sem->rw_sem.dep_map, 1, _RET_IP_);
+ }
+
+-static inline void percpu_up_read(struct percpu_rw_semaphore *sem)
+-{
+- preempt_disable();
+- percpu_up_read_preempt_enable(sem);
+-}
+-
+ extern void percpu_down_write(struct percpu_rw_semaphore *);
+ extern void percpu_up_write(struct percpu_rw_semaphore *);
+
+--
+2.36.1
+