diff options
Diffstat (limited to 'arch/x86/mm/srat.c')
| -rw-r--r-- | arch/x86/mm/srat.c | 29 | 
1 files changed, 15 insertions, 14 deletions
diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c index 4ddf497ca65..cdd0da9dd53 100644 --- a/arch/x86/mm/srat.c +++ b/arch/x86/mm/srat.c @@ -149,39 +149,40 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)  	int node, pxm;  	if (srat_disabled()) -		return -1; -	if (ma->header.length != sizeof(struct acpi_srat_mem_affinity)) { -		bad_srat(); -		return -1; -	} +		goto out_err; +	if (ma->header.length != sizeof(struct acpi_srat_mem_affinity)) +		goto out_err_bad_srat;  	if ((ma->flags & ACPI_SRAT_MEM_ENABLED) == 0) -		return -1; - +		goto out_err;  	if ((ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) && !save_add_info()) -		return -1; +		goto out_err; +  	start = ma->base_address;  	end = start + ma->length;  	pxm = ma->proximity_domain;  	if (acpi_srat_revision <= 1)  		pxm &= 0xff; +  	node = setup_node(pxm);  	if (node < 0) {  		printk(KERN_ERR "SRAT: Too many proximity domains.\n"); -		bad_srat(); -		return -1; +		goto out_err_bad_srat;  	} -	if (numa_add_memblk(node, start, end) < 0) { -		bad_srat(); -		return -1; -	} +	if (numa_add_memblk(node, start, end) < 0) +		goto out_err_bad_srat;  	node_set(node, numa_nodes_parsed);  	printk(KERN_INFO "SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]\n",  	       node, pxm,  	       (unsigned long long) start, (unsigned long long) end - 1); +  	return 0; +out_err_bad_srat: +	bad_srat(); +out_err: +	return -1;  }  void __init acpi_numa_arch_fixup(void) {}  |