mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	[PATCH] powerpc: don't add memory to empty node/zone
The system will oops if an attempt is made to add memory to an empty node/zone. This patch prevents adding memory to an empty node. The code to dynamically add a node/zone is non-trivial. This patch is temporary and will be removed when the ability to dynamically add a node/zone is complete. Signed-off-by: Mike Kravetz <kravetz@us.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
		
							parent
							
								
									021c733549
								
							
						
					
					
						commit
						b226e46212
					
				
					 1 changed files with 14 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -766,13 +766,15 @@ early_param("numa", early_numa);
 | 
			
		|||
int hot_add_scn_to_nid(unsigned long scn_addr)
 | 
			
		||||
{
 | 
			
		||||
	struct device_node *memory = NULL;
 | 
			
		||||
	nodemask_t nodes;
 | 
			
		||||
	int numa_domain = 0;
 | 
			
		||||
 | 
			
		||||
	if (!numa_enabled || (min_common_depth < 0))
 | 
			
		||||
		return 0;
 | 
			
		||||
		return numa_domain;
 | 
			
		||||
 | 
			
		||||
	while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
 | 
			
		||||
		unsigned long start, size;
 | 
			
		||||
		int numa_domain, ranges;
 | 
			
		||||
		int ranges;
 | 
			
		||||
		unsigned int *memcell_buf;
 | 
			
		||||
		unsigned int len;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -793,14 +795,21 @@ int hot_add_scn_to_nid(unsigned long scn_addr)
 | 
			
		|||
 | 
			
		||||
		if ((scn_addr >= start) && (scn_addr < (start + size))) {
 | 
			
		||||
			of_node_put(memory);
 | 
			
		||||
			return numa_domain;
 | 
			
		||||
			goto got_numa_domain;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (--ranges)		/* process all ranges in cell */
 | 
			
		||||
			goto ha_new_range;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BUG();	/* section address should be found above */
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
	/* Temporary code to ensure that returned node is not empty */
 | 
			
		||||
got_numa_domain:
 | 
			
		||||
	nodes_setall(nodes);
 | 
			
		||||
	while (NODE_DATA(numa_domain)->node_spanned_pages == 0) {
 | 
			
		||||
		node_clear(numa_domain, nodes);
 | 
			
		||||
		numa_domain = any_online_node(nodes);
 | 
			
		||||
	}
 | 
			
		||||
	return numa_domain;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_MEMORY_HOTPLUG */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue