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>
This commit is contained in:
parent
99621b44aa
commit
8c0a853770
fs
9p
adfs
affs
afs
befs
bfs
btrfs
ceph
cifs
coda
ecryptfs
efs
exofs
ext2
ext3
ext4
fat
freevxfs
fuse
hfs
hfsplus
hpfs
hugetlbfs
isofs
jffs2
jfs
logfs
minix
ncpfs
nfs
nilfs2
ntfs
ocfs2
openpromfs
qnx4
qnx6
reiserfs
romfs
squashfs
super.csysv
ubifs
udf
ufs
xfs
|
@ -560,6 +560,11 @@ static int v9fs_init_inode_cache(void)
|
|||
*/
|
||||
static void v9fs_destroy_inode_cache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(v9fs_inode_cache);
|
||||
}
|
||||
|
||||
|
|
|
@ -275,6 +275,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(adfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -147,6 +147,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(affs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -123,6 +123,11 @@ void __exit afs_fs_exit(void)
|
|||
BUG();
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(afs_inode_cachep);
|
||||
_leave("");
|
||||
}
|
||||
|
|
|
@ -454,6 +454,11 @@ befs_init_inodecache(void)
|
|||
static void
|
||||
befs_destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(befs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -280,6 +280,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(bfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -107,6 +107,12 @@ void extent_io_exit(void)
|
|||
list_del(&eb->leak_list);
|
||||
kmem_cache_free(extent_buffer_cache, eb);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free are flushed before we
|
||||
* destroy caches.
|
||||
*/
|
||||
rcu_barrier();
|
||||
if (extent_state_cache)
|
||||
kmem_cache_destroy(extent_state_cache);
|
||||
if (extent_buffer_cache)
|
||||
|
|
|
@ -7076,6 +7076,11 @@ static void init_once(void *foo)
|
|||
|
||||
void btrfs_destroy_cachep(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
if (btrfs_inode_cachep)
|
||||
kmem_cache_destroy(btrfs_inode_cachep);
|
||||
if (btrfs_trans_handle_cachep)
|
||||
|
|
|
@ -603,6 +603,11 @@ static int __init init_caches(void)
|
|||
|
||||
static void destroy_caches(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ceph_inode_cachep);
|
||||
kmem_cache_destroy(ceph_cap_cachep);
|
||||
kmem_cache_destroy(ceph_dentry_cachep);
|
||||
|
|
|
@ -977,6 +977,11 @@ cifs_init_inodecache(void)
|
|||
static void
|
||||
cifs_destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(cifs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -85,6 +85,11 @@ int coda_init_inodecache(void)
|
|||
|
||||
void coda_destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(coda_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -710,6 +710,12 @@ static void ecryptfs_free_kmem_caches(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ecryptfs_cache_infos); i++) {
|
||||
struct ecryptfs_cache_info *info;
|
||||
|
||||
|
|
|
@ -96,6 +96,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(efs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -206,6 +206,11 @@ static int init_inodecache(void)
|
|||
*/
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(exofs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -206,6 +206,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ext2_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -532,6 +532,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ext3_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -1019,6 +1019,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ext4_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -521,6 +521,11 @@ static int __init fat_init_inodecache(void)
|
|||
|
||||
static void __exit fat_destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(fat_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -279,6 +279,11 @@ static void __exit
|
|||
vxfs_cleanup(void)
|
||||
{
|
||||
unregister_filesystem(&vxfs_fs_type);
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(vxfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -1197,6 +1197,12 @@ static void fuse_fs_cleanup(void)
|
|||
{
|
||||
unregister_filesystem(&fuse_fs_type);
|
||||
unregister_fuseblk();
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(fuse_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -482,6 +482,12 @@ static int __init init_hfs_fs(void)
|
|||
static void __exit exit_hfs_fs(void)
|
||||
{
|
||||
unregister_filesystem(&hfs_fs_type);
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(hfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -635,6 +635,12 @@ static int __init init_hfsplus_fs(void)
|
|||
static void __exit exit_hfsplus_fs(void)
|
||||
{
|
||||
unregister_filesystem(&hfsplus_fs_type);
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(hfsplus_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -210,6 +210,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(hpfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -1042,6 +1042,11 @@ static int __init init_hugetlbfs_fs(void)
|
|||
|
||||
static void __exit exit_hugetlbfs_fs(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(hugetlbfs_inode_cachep);
|
||||
kern_unmount(hugetlbfs_vfsmount);
|
||||
unregister_filesystem(&hugetlbfs_fs_type);
|
||||
|
|
|
@ -114,6 +114,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(isofs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -418,6 +418,12 @@ static void __exit exit_jffs2_fs(void)
|
|||
unregister_filesystem(&jffs2_fs_type);
|
||||
jffs2_destroy_slab_caches();
|
||||
jffs2_compressors_exit();
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(jffs2_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -903,6 +903,12 @@ static void __exit exit_jfs_fs(void)
|
|||
jfs_proc_clean();
|
||||
#endif
|
||||
unregister_filesystem(&jfs_fs_type);
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(jfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -417,5 +417,10 @@ int logfs_init_inode_cache(void)
|
|||
|
||||
void logfs_destroy_inode_cache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(logfs_inode_cache);
|
||||
}
|
||||
|
|
|
@ -100,6 +100,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(minix_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -89,6 +89,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ncp_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -1571,6 +1571,11 @@ static int __init nfs_init_inodecache(void)
|
|||
|
||||
static void nfs_destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(nfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -1382,6 +1382,12 @@ static void nilfs_segbuf_init_once(void *obj)
|
|||
|
||||
static void nilfs_destroy_cachep(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
|
||||
if (nilfs_inode_cachep)
|
||||
kmem_cache_destroy(nilfs_inode_cachep);
|
||||
if (nilfs_transaction_cachep)
|
||||
|
|
|
@ -3168,6 +3168,12 @@ static void __exit exit_ntfs_fs(void)
|
|||
ntfs_debug("Unregistering NTFS driver.");
|
||||
|
||||
unregister_filesystem(&ntfs_fs_type);
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ntfs_big_inode_cache);
|
||||
kmem_cache_destroy(ntfs_inode_cache);
|
||||
kmem_cache_destroy(ntfs_name_cache);
|
||||
|
|
|
@ -691,6 +691,11 @@ static void __exit exit_dlmfs_fs(void)
|
|||
flush_workqueue(user_dlm_worker);
|
||||
destroy_workqueue(user_dlm_worker);
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(dlmfs_inode_cache);
|
||||
|
||||
bdi_destroy(&dlmfs_backing_dev_info);
|
||||
|
|
|
@ -1818,6 +1818,11 @@ static int ocfs2_initialize_mem_caches(void)
|
|||
|
||||
static void ocfs2_free_mem_caches(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
if (ocfs2_inode_cachep)
|
||||
kmem_cache_destroy(ocfs2_inode_cachep);
|
||||
ocfs2_inode_cachep = NULL;
|
||||
|
|
|
@ -463,6 +463,11 @@ static int __init init_openprom_fs(void)
|
|||
static void __exit exit_openprom_fs(void)
|
||||
{
|
||||
unregister_filesystem(&openprom_fs_type);
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(op_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -391,6 +391,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(qnx4_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -651,6 +651,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(qnx6_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -608,6 +608,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(reiserfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -648,6 +648,11 @@ static int __init init_romfs_fs(void)
|
|||
static void __exit exit_romfs_fs(void)
|
||||
{
|
||||
unregister_filesystem(&romfs_fs_type);
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(romfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -425,6 +425,11 @@ static int __init init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(squashfs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -307,12 +307,6 @@ void deactivate_locked_super(struct super_block *s)
|
|||
|
||||
/* caches are now gone, we can safely kill the shrinker now */
|
||||
unregister_shrinker(&s->s_shrink);
|
||||
|
||||
/*
|
||||
* We need to call rcu_barrier so all the delayed rcu free
|
||||
* inodes are flushed before we release the fs module.
|
||||
*/
|
||||
rcu_barrier();
|
||||
put_filesystem(fs);
|
||||
put_super(s);
|
||||
} else {
|
||||
|
|
|
@ -360,5 +360,10 @@ int __init sysv_init_icache(void)
|
|||
|
||||
void sysv_destroy_icache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(sysv_inode_cachep);
|
||||
}
|
||||
|
|
|
@ -2298,6 +2298,12 @@ static void __exit ubifs_exit(void)
|
|||
dbg_debugfs_exit();
|
||||
ubifs_compressors_exit();
|
||||
unregister_shrinker(&ubifs_shrinker_info);
|
||||
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ubifs_inode_slab);
|
||||
unregister_filesystem(&ubifs_fs_type);
|
||||
}
|
||||
|
|
|
@ -171,6 +171,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(udf_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -1466,6 +1466,11 @@ static int init_inodecache(void)
|
|||
|
||||
static void destroy_inodecache(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free inodes are flushed before we
|
||||
* destroy cache.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(ufs_inode_cachep);
|
||||
}
|
||||
|
||||
|
|
|
@ -1506,6 +1506,11 @@ xfs_init_zones(void)
|
|||
STATIC void
|
||||
xfs_destroy_zones(void)
|
||||
{
|
||||
/*
|
||||
* Make sure all delayed rcu free are flushed before we
|
||||
* destroy caches.
|
||||
*/
|
||||
rcu_barrier();
|
||||
kmem_zone_destroy(xfs_ili_zone);
|
||||
kmem_zone_destroy(xfs_inode_zone);
|
||||
kmem_zone_destroy(xfs_efi_zone);
|
||||
|
|
Loading…
Reference in New Issue