diff options
Diffstat (limited to 'debian/patches-rt/0188-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch')
-rw-r--r-- | debian/patches-rt/0188-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch | 99 |
1 files changed, 0 insertions, 99 deletions
diff --git a/debian/patches-rt/0188-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch b/debian/patches-rt/0188-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch deleted file mode 100644 index f3b73cb60..000000000 --- a/debian/patches-rt/0188-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 5507b749a51dbc791ae0211a0d0393533ee12427 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> -Date: Fri, 20 Oct 2017 11:29:53 +0200 -Subject: [PATCH 188/296] fs/dcache: disable preemption on i_dir_seq's write - side -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.35-rt39.tar.xz - -i_dir_seq is an opencoded seqcounter. Based on the code it looks like we -could have two writers in parallel despite the fact that the d_lock is -held. The problem is that during the write process on RT the preemption -is still enabled and if this process is interrupted by a reader with RT -priority then we lock up. -To avoid that lock up I am disabling the preemption during the update. -The rename of i_dir_seq is here to ensure to catch new write sides in -future. - -Cc: stable-rt@vger.kernel.org -Reported-by: Oleg.Karfich@wago.com -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - fs/dcache.c | 12 +++++++----- - fs/inode.c | 2 +- - include/linux/fs.h | 2 +- - 3 files changed, 9 insertions(+), 7 deletions(-) - -diff --git a/fs/dcache.c b/fs/dcache.c -index 1f4255ef8722..26a187abf13a 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -2503,9 +2503,10 @@ EXPORT_SYMBOL(d_rehash); - static inline unsigned start_dir_add(struct inode *dir) - { - -+ preempt_disable_rt(); - for (;;) { -- unsigned n = dir->i_dir_seq; -- if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) -+ unsigned n = dir->__i_dir_seq; -+ if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n) - return n; - cpu_relax(); - } -@@ -2513,7 +2514,8 @@ static inline unsigned start_dir_add(struct inode *dir) - - static inline void end_dir_add(struct inode *dir, unsigned n) - { -- smp_store_release(&dir->i_dir_seq, n + 2); -+ smp_store_release(&dir->__i_dir_seq, n + 2); -+ preempt_enable_rt(); - } - - static void d_wait_lookup(struct dentry *dentry) -@@ -2549,7 +2551,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, - - retry: - rcu_read_lock(); -- seq = smp_load_acquire(&parent->d_inode->i_dir_seq); -+ seq = smp_load_acquire(&parent->d_inode->__i_dir_seq); - r_seq = read_seqbegin(&rename_lock); - dentry = __d_lookup_rcu(parent, name, &d_seq); - if (unlikely(dentry)) { -@@ -2577,7 +2579,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, - } - - hlist_bl_lock(b); -- if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { -+ if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) { - hlist_bl_unlock(b); - rcu_read_unlock(); - goto retry; -diff --git a/fs/inode.c b/fs/inode.c -index 5eea9912a0b9..85da949d9083 100644 ---- a/fs/inode.c -+++ b/fs/inode.c -@@ -158,7 +158,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) - inode->i_bdev = NULL; - inode->i_cdev = NULL; - inode->i_link = NULL; -- inode->i_dir_seq = 0; -+ inode->__i_dir_seq = 0; - inode->i_rdev = 0; - inode->dirtied_when = 0; - -diff --git a/include/linux/fs.h b/include/linux/fs.h -index 8bde32cf9711..61ad6d7bfc95 100644 ---- a/include/linux/fs.h -+++ b/include/linux/fs.h -@@ -699,7 +699,7 @@ struct inode { - struct block_device *i_bdev; - struct cdev *i_cdev; - char *i_link; -- unsigned i_dir_seq; -+ unsigned __i_dir_seq; - }; - - __u32 i_generation; --- -2.30.2 - |