forked from mirrors/linux
		
	[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)
 | 
					int hot_add_scn_to_nid(unsigned long scn_addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct device_node *memory = NULL;
 | 
						struct device_node *memory = NULL;
 | 
				
			||||||
 | 
						nodemask_t nodes;
 | 
				
			||||||
 | 
						int numa_domain = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!numa_enabled || (min_common_depth < 0))
 | 
						if (!numa_enabled || (min_common_depth < 0))
 | 
				
			||||||
		return 0;
 | 
							return numa_domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
 | 
						while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
 | 
				
			||||||
		unsigned long start, size;
 | 
							unsigned long start, size;
 | 
				
			||||||
		int numa_domain, ranges;
 | 
							int ranges;
 | 
				
			||||||
		unsigned int *memcell_buf;
 | 
							unsigned int *memcell_buf;
 | 
				
			||||||
		unsigned int len;
 | 
							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))) {
 | 
							if ((scn_addr >= start) && (scn_addr < (start + size))) {
 | 
				
			||||||
			of_node_put(memory);
 | 
								of_node_put(memory);
 | 
				
			||||||
			return numa_domain;
 | 
								goto got_numa_domain;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (--ranges)		/* process all ranges in cell */
 | 
							if (--ranges)		/* process all ranges in cell */
 | 
				
			||||||
			goto ha_new_range;
 | 
								goto ha_new_range;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	BUG();	/* section address should be found above */
 | 
						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 */
 | 
					#endif /* CONFIG_MEMORY_HOTPLUG */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue