diff options
Diffstat (limited to 'mm/vmscan.c')
| -rw-r--r-- | mm/vmscan.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index bd6637fcd8f9..5b7b8d4f5297 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -741,6 +741,8 @@ EXPORT_SYMBOL(register_shrinker);   */  void unregister_shrinker(struct shrinker *shrinker)  { +	struct dentry *debugfs_entry; +  	if (!(shrinker->flags & SHRINKER_REGISTERED))  		return; @@ -749,9 +751,11 @@ void unregister_shrinker(struct shrinker *shrinker)  	shrinker->flags &= ~SHRINKER_REGISTERED;  	if (shrinker->flags & SHRINKER_MEMCG_AWARE)  		unregister_memcg_shrinker(shrinker); -	shrinker_debugfs_remove(shrinker); +	debugfs_entry = shrinker_debugfs_remove(shrinker);  	up_write(&shrinker_rwsem); +	debugfs_remove_recursive(debugfs_entry); +  	kfree(shrinker->nr_deferred);  	shrinker->nr_deferred = NULL;  } @@ -3323,13 +3327,16 @@ void lru_gen_migrate_mm(struct mm_struct *mm)  	if (mem_cgroup_disabled())  		return; +	/* migration can happen before addition */ +	if (!mm->lru_gen.memcg) +		return; +  	rcu_read_lock();  	memcg = mem_cgroup_from_task(task);  	rcu_read_unlock();  	if (memcg == mm->lru_gen.memcg)  		return; -	VM_WARN_ON_ONCE(!mm->lru_gen.memcg);  	VM_WARN_ON_ONCE(list_empty(&mm->lru_gen.list));  	lru_gen_del_mm(mm); @@ -6754,8 +6761,7 @@ unsigned long mem_cgroup_shrink_node(struct mem_cgroup *memcg,  unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,  					   unsigned long nr_pages,  					   gfp_t gfp_mask, -					   unsigned int reclaim_options, -					   nodemask_t *nodemask) +					   unsigned int reclaim_options)  {  	unsigned long nr_reclaimed;  	unsigned int noreclaim_flag; @@ -6770,7 +6776,6 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,  		.may_unmap = 1,  		.may_swap = !!(reclaim_options & MEMCG_RECLAIM_MAY_SWAP),  		.proactive = !!(reclaim_options & MEMCG_RECLAIM_PROACTIVE), -		.nodemask = nodemask,  	};  	/*  	 * Traverse the ZONELIST_FALLBACK zonelist of the current node to put  | 
