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
|
@ -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 @@ bad_cap:
|
|||
|
||||
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 @@ error_register:
|
|||
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