mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 04:31:19 +00:00 
			
		
		
		
	 4365a5676f
			
		
	
	
		4365a5676f
		
	
	
	
	
		
			
			Fix node-oriented allocation handling in oom-kill.c I myself think of this
as a bugfix not as an ehnancement.
In these days, things are changed as
  - alloc_pages() eats nodemask as its arguments, __alloc_pages_nodemask().
  - mempolicy don't maintain its own private zonelists.
  (And cpuset doesn't use nodemask for __alloc_pages_nodemask())
So, current oom-killer's check function is wrong.
This patch does
  - check nodemask, if nodemask && nodemask doesn't cover all
    node_states[N_HIGH_MEMORY], this is CONSTRAINT_MEMORY_POLICY.
  - Scan all zonelist under nodemask, if it hits cpuset's wall
    this faiulre is from cpuset.
And
  - modifies the caller of out_of_memory not to call oom if __GFP_THISNODE.
    This doesn't change "current" behavior. If callers use __GFP_THISNODE
    it should handle "page allocation failure" by itself.
  - handle __GFP_NOFAIL+__GFP_THISNODE path.
    This is something like a FIXME but this gfpmask is not used now.
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hioryu@jp.fujitsu.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Christoph Lameter <cl@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
	
			
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __INCLUDE_LINUX_OOM_H
 | |
| #define __INCLUDE_LINUX_OOM_H
 | |
| 
 | |
| /* /proc/<pid>/oom_adj set to -17 protects from the oom-killer */
 | |
| #define OOM_DISABLE (-17)
 | |
| /* inclusive */
 | |
| #define OOM_ADJUST_MIN (-16)
 | |
| #define OOM_ADJUST_MAX 15
 | |
| 
 | |
| #ifdef __KERNEL__
 | |
| 
 | |
| #include <linux/types.h>
 | |
| #include <linux/nodemask.h>
 | |
| 
 | |
| struct zonelist;
 | |
| struct notifier_block;
 | |
| 
 | |
| /*
 | |
|  * Types of limitations to the nodes from which allocations may occur
 | |
|  */
 | |
| enum oom_constraint {
 | |
| 	CONSTRAINT_NONE,
 | |
| 	CONSTRAINT_CPUSET,
 | |
| 	CONSTRAINT_MEMORY_POLICY,
 | |
| };
 | |
| 
 | |
| extern int try_set_zone_oom(struct zonelist *zonelist, gfp_t gfp_flags);
 | |
| extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);
 | |
| 
 | |
| extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
 | |
| 		int order, nodemask_t *mask);
 | |
| extern int register_oom_notifier(struct notifier_block *nb);
 | |
| extern int unregister_oom_notifier(struct notifier_block *nb);
 | |
| 
 | |
| extern bool oom_killer_disabled;
 | |
| 
 | |
| static inline void oom_killer_disable(void)
 | |
| {
 | |
| 	oom_killer_disabled = true;
 | |
| }
 | |
| 
 | |
| static inline void oom_killer_enable(void)
 | |
| {
 | |
| 	oom_killer_disabled = false;
 | |
| }
 | |
| #endif /* __KERNEL__*/
 | |
| #endif /* _INCLUDE_LINUX_OOM_H */
 |