diff options
author | Brian Behlendorf <[email protected]> | 2015-06-18 09:21:19 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2015-06-22 10:22:49 -0700 |
commit | 218b4e0a7608f7ef37ec72042a68c45e539a5d1c (patch) | |
tree | 749c64001d694546ef2104418ad05249c8b35912 /config | |
parent | 4c6a70091030847ca5d6933916255194483ce91f (diff) |
Add zfs_sb_prune_aliases() function
For kernels which do not implement a per-suberblock shrinker,
those older than Linux 3.1, the shrink_dcache_parent() function
was used to attempt to reclaim dentries. This was found not be
entirely reliable and could lead to performance issues on older
kernels running meta-data heavy workloads.
To address this issue a zfs_sb_prune_aliases() function has been
added to implement this functionality. It relies on traversing
the list of znodes for a filesystem and adding them to a private
list with a reference held. The private list can then be safely
walked outside the z_znodes_lock to prune dentires and drop the
last reference so the inode can be freed.
This provides the same synchronous behavior as the per-filesystem
shrinker and has the advantage of depending on only long standing
interfaces.
Signed-off-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tim Chase <[email protected]>
Closes #3501
Diffstat (limited to 'config')
-rw-r--r-- | config/kernel-d-prune-aliases.m4 | 19 | ||||
-rw-r--r-- | config/kernel.m4 | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/config/kernel-d-prune-aliases.m4 b/config/kernel-d-prune-aliases.m4 new file mode 100644 index 000000000..d9c521b1d --- /dev/null +++ b/config/kernel-d-prune-aliases.m4 @@ -0,0 +1,19 @@ +dnl # +dnl # 2.6.12 API change +dnl # d_prune_aliases() helper function available. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_D_PRUNE_ALIASES], + [AC_MSG_CHECKING([whether d_prune_aliases() is available]) + ZFS_LINUX_TRY_COMPILE_SYMBOL([ + #include <linux/dcache.h> + ], [ + struct inode *ip = NULL; + d_prune_aliases(ip); + ], [d_prune_aliases], [fs/dcache.c], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_D_PRUNE_ALIASES, 1, + [d_prune_aliases() is available]) + ], [ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index fe42e171e..51f8a2bf7 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -78,6 +78,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_INSERT_INODE_LOCKED ZFS_AC_KERNEL_D_MAKE_ROOT ZFS_AC_KERNEL_D_OBTAIN_ALIAS + ZFS_AC_KERNEL_D_PRUNE_ALIASES ZFS_AC_KERNEL_D_SET_D_OP ZFS_AC_KERNEL_D_REVALIDATE_NAMEIDATA ZFS_AC_KERNEL_CONST_DENTRY_OPERATIONS |