diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c index b2a126a947e31e827d50da2ad53241f78bd6ea85..c0f1e7e7a88364954d49588096162a2ab0a6fe13 100644 --- a/fs/kernfs/mount.c +++ b/fs/kernfs/mount.c @@ -240,6 +240,9 @@ static int kernfs_fill_super(struct super_block *sb, unsigned long magic) sb->s_export_op = &kernfs_export_ops; sb->s_time_gran = 1; + /* sysfs dentries and inodes don't require IO to create */ + sb->s_shrink.seeks = 0; + /* get root inode, initialize and unlock it */ mutex_lock(&kernfs_mutex); inode = kernfs_get_inode(sb, info->root->kn); diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 31bf3bb8ddae055741761fc32786d9563e0250dd..93f83b2e85c7fa6e1b23e4963a60785078581e1d 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -516,6 +516,9 @@ int proc_fill_super(struct super_block *s, void *data, int silent) */ s->s_stack_depth = FILESYSTEM_MAX_STACK_DEPTH; + /* procfs dentries and inodes don't require IO to create */ + s->s_shrink.seeks = 0; + pde_get(&proc_root); root_inode = proc_get_inode(s, &proc_root); if (!root_inode) { diff --git a/mm/vmscan.c b/mm/vmscan.c index d30f18b2f0a871110b09adafe70d6e332d18fb6e..ffed599c57534618e124d474c1077645fcb6aa82 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -605,9 +605,18 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, nr = atomic_long_xchg(&shrinker->nr_deferred[nid], 0); total_scan = nr; - delta = freeable >> priority; - delta *= 4; - do_div(delta, shrinker->seeks); + if (shrinker->seeks) { + delta = freeable >> priority; + delta *= 4; + do_div(delta, shrinker->seeks); + } else { + /* + * These objects don't require any IO to create. Trim + * them aggressively under memory pressure to keep + * them from causing refetches in the IO caches. + */ + delta = freeable / 2; + } total_scan += delta; if (total_scan < 0) { diff --git a/mm/workingset.c b/mm/workingset.c index a2384a5851e808f062f7811ffa412558b94cf9e0..b51bf88f2482c22b148412e111560111bbefcc9a 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -590,7 +590,7 @@ static unsigned long scan_shadow_nodes(struct shrinker *shrinker, static struct shrinker workingset_shadow_shrinker = { .count_objects = count_shadow_nodes, .scan_objects = scan_shadow_nodes, - .seeks = DEFAULT_SEEKS, + .seeks = 0, /* ->count reports only fully expendable nodes */ .flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE, };