Merge branch 'akpm' (patches from Andrew)
Merge third set of updates from Andrew Morton:
- the rest of MM
[ This includes getting rid of the numa hinting bits, in favor of
just generic protnone logic. Yay. - Linus ]
- core kernel
- procfs
- some of lib/ (lots of lib/ material this time)
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (104 commits)
lib/lcm.c: replace include
lib/percpu_ida.c: remove redundant includes
lib/strncpy_from_user.c: replace module.h include
lib/stmp_device.c: replace module.h include
lib/sort.c: move include inside #if 0
lib/show_mem.c: remove redundant include
lib/radix-tree.c: change to simpler include
lib/plist.c: remove redundant include
lib/nlattr.c: remove redundant include
lib/kobject_uevent.c: remove redundant include
lib/llist.c: remove redundant include
lib/md5.c: simplify include
lib/list_sort.c: rearrange includes
lib/genalloc.c: remove redundant include
lib/idr.c: remove redundant include
lib/halfmd4.c: simplify includes
lib/dynamic_queue_limits.c: simplify includes
lib/sort.c: use simpler includes
lib/interval_tree.c: simplify includes
hexdump: make it return number of bytes placed in buffer
...
This commit is contained in:
+28
-19
@@ -75,10 +75,10 @@ static unsigned long super_cache_scan(struct shrinker *shrink,
|
||||
return SHRINK_STOP;
|
||||
|
||||
if (sb->s_op->nr_cached_objects)
|
||||
fs_objects = sb->s_op->nr_cached_objects(sb, sc->nid);
|
||||
fs_objects = sb->s_op->nr_cached_objects(sb, sc);
|
||||
|
||||
inodes = list_lru_count_node(&sb->s_inode_lru, sc->nid);
|
||||
dentries = list_lru_count_node(&sb->s_dentry_lru, sc->nid);
|
||||
inodes = list_lru_shrink_count(&sb->s_inode_lru, sc);
|
||||
dentries = list_lru_shrink_count(&sb->s_dentry_lru, sc);
|
||||
total_objects = dentries + inodes + fs_objects + 1;
|
||||
if (!total_objects)
|
||||
total_objects = 1;
|
||||
@@ -86,19 +86,23 @@ static unsigned long super_cache_scan(struct shrinker *shrink,
|
||||
/* proportion the scan between the caches */
|
||||
dentries = mult_frac(sc->nr_to_scan, dentries, total_objects);
|
||||
inodes = mult_frac(sc->nr_to_scan, inodes, total_objects);
|
||||
fs_objects = mult_frac(sc->nr_to_scan, fs_objects, total_objects);
|
||||
|
||||
/*
|
||||
* prune the dcache first as the icache is pinned by it, then
|
||||
* prune the icache, followed by the filesystem specific caches
|
||||
*
|
||||
* Ensure that we always scan at least one object - memcg kmem
|
||||
* accounting uses this to fully empty the caches.
|
||||
*/
|
||||
freed = prune_dcache_sb(sb, dentries, sc->nid);
|
||||
freed += prune_icache_sb(sb, inodes, sc->nid);
|
||||
sc->nr_to_scan = dentries + 1;
|
||||
freed = prune_dcache_sb(sb, sc);
|
||||
sc->nr_to_scan = inodes + 1;
|
||||
freed += prune_icache_sb(sb, sc);
|
||||
|
||||
if (fs_objects) {
|
||||
fs_objects = mult_frac(sc->nr_to_scan, fs_objects,
|
||||
total_objects);
|
||||
freed += sb->s_op->free_cached_objects(sb, fs_objects,
|
||||
sc->nid);
|
||||
sc->nr_to_scan = fs_objects + 1;
|
||||
freed += sb->s_op->free_cached_objects(sb, sc);
|
||||
}
|
||||
|
||||
drop_super(sb);
|
||||
@@ -118,17 +122,14 @@ static unsigned long super_cache_count(struct shrinker *shrink,
|
||||
* scalability bottleneck. The counts could get updated
|
||||
* between super_cache_count and super_cache_scan anyway.
|
||||
* Call to super_cache_count with shrinker_rwsem held
|
||||
* ensures the safety of call to list_lru_count_node() and
|
||||
* ensures the safety of call to list_lru_shrink_count() and
|
||||
* s_op->nr_cached_objects().
|
||||
*/
|
||||
if (sb->s_op && sb->s_op->nr_cached_objects)
|
||||
total_objects = sb->s_op->nr_cached_objects(sb,
|
||||
sc->nid);
|
||||
total_objects = sb->s_op->nr_cached_objects(sb, sc);
|
||||
|
||||
total_objects += list_lru_count_node(&sb->s_dentry_lru,
|
||||
sc->nid);
|
||||
total_objects += list_lru_count_node(&sb->s_inode_lru,
|
||||
sc->nid);
|
||||
total_objects += list_lru_shrink_count(&sb->s_dentry_lru, sc);
|
||||
total_objects += list_lru_shrink_count(&sb->s_inode_lru, sc);
|
||||
|
||||
total_objects = vfs_pressure_ratio(total_objects);
|
||||
return total_objects;
|
||||
@@ -191,9 +192,9 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
|
||||
INIT_HLIST_BL_HEAD(&s->s_anon);
|
||||
INIT_LIST_HEAD(&s->s_inodes);
|
||||
|
||||
if (list_lru_init(&s->s_dentry_lru))
|
||||
if (list_lru_init_memcg(&s->s_dentry_lru))
|
||||
goto fail;
|
||||
if (list_lru_init(&s->s_inode_lru))
|
||||
if (list_lru_init_memcg(&s->s_inode_lru))
|
||||
goto fail;
|
||||
|
||||
init_rwsem(&s->s_umount);
|
||||
@@ -229,7 +230,7 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
|
||||
s->s_shrink.scan_objects = super_cache_scan;
|
||||
s->s_shrink.count_objects = super_cache_count;
|
||||
s->s_shrink.batch = 1024;
|
||||
s->s_shrink.flags = SHRINKER_NUMA_AWARE;
|
||||
s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE;
|
||||
return s;
|
||||
|
||||
fail:
|
||||
@@ -284,6 +285,14 @@ void deactivate_locked_super(struct super_block *s)
|
||||
unregister_shrinker(&s->s_shrink);
|
||||
fs->kill_sb(s);
|
||||
|
||||
/*
|
||||
* Since list_lru_destroy() may sleep, we cannot call it from
|
||||
* put_super(), where we hold the sb_lock. Therefore we destroy
|
||||
* the lru lists right now.
|
||||
*/
|
||||
list_lru_destroy(&s->s_dentry_lru);
|
||||
list_lru_destroy(&s->s_inode_lru);
|
||||
|
||||
put_filesystem(fs);
|
||||
put_super(s);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user