Skip to content

Commit 8c0a853

Browse files
kirylAl Viro
authored andcommitted
fs: push rcu_barrier() from deactivate_locked_super() to filesystems
There's no reason to call rcu_barrier() on every deactivate_locked_super(). We only need to make sure that all delayed rcu free inodes are flushed before we destroy related cache. Removing rcu_barrier() from deactivate_locked_super() affects some fast paths. E.g. on my machine exit_group() of a last process in IPC namespace takes 0.07538s. rcu_barrier() takes 0.05188s of that time. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 99621b4 commit 8c0a853

File tree

47 files changed

+240
-6
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+240
-6
lines changed

fs/9p/v9fs.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,11 @@ static int v9fs_init_inode_cache(void)
560560
*/
561561
static void v9fs_destroy_inode_cache(void)
562562
{
563+
/*
564+
* Make sure all delayed rcu free inodes are flushed before we
565+
* destroy cache.
566+
*/
567+
rcu_barrier();
563568
kmem_cache_destroy(v9fs_inode_cache);
564569
}
565570

fs/adfs/super.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,11 @@ static int init_inodecache(void)
275275

276276
static void destroy_inodecache(void)
277277
{
278+
/*
279+
* Make sure all delayed rcu free inodes are flushed before we
280+
* destroy cache.
281+
*/
282+
rcu_barrier();
278283
kmem_cache_destroy(adfs_inode_cachep);
279284
}
280285

fs/affs/super.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ static int init_inodecache(void)
147147

148148
static void destroy_inodecache(void)
149149
{
150+
/*
151+
* Make sure all delayed rcu free inodes are flushed before we
152+
* destroy cache.
153+
*/
154+
rcu_barrier();
150155
kmem_cache_destroy(affs_inode_cachep);
151156
}
152157

fs/afs/super.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ void __exit afs_fs_exit(void)
123123
BUG();
124124
}
125125

126+
/*
127+
* Make sure all delayed rcu free inodes are flushed before we
128+
* destroy cache.
129+
*/
130+
rcu_barrier();
126131
kmem_cache_destroy(afs_inode_cachep);
127132
_leave("");
128133
}

fs/befs/linuxvfs.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,11 @@ befs_init_inodecache(void)
454454
static void
455455
befs_destroy_inodecache(void)
456456
{
457+
/*
458+
* Make sure all delayed rcu free inodes are flushed before we
459+
* destroy cache.
460+
*/
461+
rcu_barrier();
457462
kmem_cache_destroy(befs_inode_cachep);
458463
}
459464

fs/bfs/inode.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ static int init_inodecache(void)
280280

281281
static void destroy_inodecache(void)
282282
{
283+
/*
284+
* Make sure all delayed rcu free inodes are flushed before we
285+
* destroy cache.
286+
*/
287+
rcu_barrier();
283288
kmem_cache_destroy(bfs_inode_cachep);
284289
}
285290

fs/btrfs/extent_io.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ void extent_io_exit(void)
107107
list_del(&eb->leak_list);
108108
kmem_cache_free(extent_buffer_cache, eb);
109109
}
110+
111+
/*
112+
* Make sure all delayed rcu free are flushed before we
113+
* destroy caches.
114+
*/
115+
rcu_barrier();
110116
if (extent_state_cache)
111117
kmem_cache_destroy(extent_state_cache);
112118
if (extent_buffer_cache)

fs/btrfs/inode.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7076,6 +7076,11 @@ static void init_once(void *foo)
70767076

70777077
void btrfs_destroy_cachep(void)
70787078
{
7079+
/*
7080+
* Make sure all delayed rcu free inodes are flushed before we
7081+
* destroy cache.
7082+
*/
7083+
rcu_barrier();
70797084
if (btrfs_inode_cachep)
70807085
kmem_cache_destroy(btrfs_inode_cachep);
70817086
if (btrfs_trans_handle_cachep)

fs/ceph/super.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,11 @@ static int __init init_caches(void)
603603

604604
static void destroy_caches(void)
605605
{
606+
/*
607+
* Make sure all delayed rcu free inodes are flushed before we
608+
* destroy cache.
609+
*/
610+
rcu_barrier();
606611
kmem_cache_destroy(ceph_inode_cachep);
607612
kmem_cache_destroy(ceph_cap_cachep);
608613
kmem_cache_destroy(ceph_dentry_cachep);

fs/cifs/cifsfs.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,11 @@ cifs_init_inodecache(void)
977977
static void
978978
cifs_destroy_inodecache(void)
979979
{
980+
/*
981+
* Make sure all delayed rcu free inodes are flushed before we
982+
* destroy cache.
983+
*/
984+
rcu_barrier();
980985
kmem_cache_destroy(cifs_inode_cachep);
981986
}
982987

0 commit comments

Comments
 (0)