diff options
author | Brian Behlendorf <[email protected]> | 2015-03-17 15:07:47 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2015-03-20 10:35:20 -0700 |
commit | 2cbb06b561f500732de2214eb590149d0c4f3cf5 (patch) | |
tree | 3835d7c748f615abfa42dd26eb0fa1c2c3aadeb5 /include | |
parent | 596a8935a140d3238b46d9858de7a727524c2b51 (diff) |
Restructure per-filesystem reclaim
Originally when the ARC prune callback was introduced the idea was
to register a single callback for the ZPL. The ARC could invoke this
call back if it needed the ZPL to drop dentries, inodes, or other
cache objects which might be pinning buffers in the ARC. The ZPL
would iterate over all ZFS super blocks and perform the reclaim.
For the most part this design has worked well but due to limitations
in 2.6.35 and earlier kernels there were some problems. This patch
is designed to address those issues.
1) iterate_supers_type() is not provided by all kernels which makes
it impossible to safely iterate over all zpl_fs_type filesystems in
a single callback. The most straight forward and portable way to
resolve this is to register a callback per-filesystem during mount.
The arc_*_prune_callback() functions have always supported multiple
callbacks so this is functionally a very small change.
2) Commit 050d22b removed the non-portable shrink_dcache_memory()
and shrink_icache_memory() functions and didn't replace them with
equivalent functionality. This meant that for Linux 3.1 and older
kernels the ARC had no mechanism to drop dentries and inodes from
the caches if needed. This patch adds that missing functionality
by calling shrink_dcache_parent() to release dentries which may be
pinning inodes. This will result in all unused cache entries being
dropped which is a bit heavy handed but it's the only interface
available for old kernels.
3) A zpl_drop_inode() callback is registered for kernels older than
2.6.35 which do not support the .evict_inode callback. This ensures
that when the last reference on an inode is dropped it is immediately
removed from the cache. If this isn't done than inode can end up on
the global unused LRU with no mechanism available to ZFS to drop them.
Since the ARC buffers are not dropped the hottest inodes can still
be recreated without performing disk IO.
Signed-off-by: Brian Behlendorf <[email protected]>
Signed-off-by: Pavel Snajdr <[email protected]>
Issue #3160
Diffstat (limited to 'include')
-rw-r--r-- | include/sys/zfs_vfsops.h | 1 | ||||
-rw-r--r-- | include/sys/zpl.h | 2 |
2 files changed, 2 insertions, 1 deletions
diff --git a/include/sys/zfs_vfsops.h b/include/sys/zfs_vfsops.h index eeeffbe4c..4b88260de 100644 --- a/include/sys/zfs_vfsops.h +++ b/include/sys/zfs_vfsops.h @@ -73,6 +73,7 @@ typedef struct zfs_sb { uint64_t z_nr_znodes; /* number of znodes in the fs */ unsigned long z_rollback_time; /* last online rollback time */ kmutex_t z_znodes_lock; /* lock for z_all_znodes */ + arc_prune_t *z_arc_prune; /* called by ARC to prune caches */ struct inode *z_ctldir; /* .zfs directory inode */ avl_tree_t z_ctldir_snaps; /* .zfs/snapshot entries */ kmutex_t z_ctldir_lock; /* .zfs ctldir lock */ diff --git a/include/sys/zpl.h b/include/sys/zpl.h index 3fc5d979f..c7701aae5 100644 --- a/include/sys/zpl.h +++ b/include/sys/zpl.h @@ -63,7 +63,7 @@ extern const struct file_operations zpl_file_operations; extern const struct file_operations zpl_dir_file_operations; /* zpl_super.c */ -extern void zpl_prune_sbs(int64_t bytes_to_scan, void *private); +extern void zpl_prune_sb(int64_t nr_to_scan, void *arg); typedef struct zpl_mount_data { const char *z_osname; /* Dataset name */ |