mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	x86/acpi: Set persistent cpuid <-> nodeid mapping when booting
The whole patch-set aims at making cpuid <-> nodeid mapping persistent. So that, when node online/offline happens, cache based on cpuid <-> nodeid mapping such as wq_numa_possible_cpumask will not cause any problem. It contains 4 steps: 1. Enable apic registeration flow to handle both enabled and disabled cpus. 2. Introduce a new array storing all possible cpuid <-> apicid mapping. 3. Enable _MAT and MADT relative apis to return non-present or disabled cpus' apicid. 4. Establish all possible cpuid <-> nodeid mapping. This patch finishes step 4. This patch set the persistent cpuid <-> nodeid mapping for all enabled/disabled processors at boot time via an additional acpi namespace walk for processors. [ tglx: Remove the unneeded exports ] Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com> Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com> Signed-off-by: Zhu Guihua <zhugh.fnst@cn.fujitsu.com> Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com> Acked-by: Ingo Molnar <mingo@kernel.org> Cc: mika.j.penttila@gmail.com Cc: len.brown@intel.com Cc: rafael@kernel.org Cc: rjw@rjwysocki.net Cc: yasu.isimatu@gmail.com Cc: linux-mm@kvack.org Cc: linux-acpi@vger.kernel.org Cc: isimatu.yasuaki@jp.fujitsu.com Cc: gongzhaogang@inspur.com Cc: tj@kernel.org Cc: izumi.taku@jp.fujitsu.com Cc: cl@linux.com Cc: chen.tang@easystack.cn Cc: akpm@linux-foundation.org Cc: kamezawa.hiroyu@jp.fujitsu.com Cc: lenb@kernel.org Link: http://lkml.kernel.org/r/1472114120-3281-6-git-send-email-douly.fnst@cn.fujitsu.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									8ad893faf2
								
							
						
					
					
						commit
						dc6db24d24
					
				
					 6 changed files with 80 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -796,7 +796,7 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
 | 
			
		|||
 *  ACPI based hotplug CPU support
 | 
			
		||||
 */
 | 
			
		||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
 | 
			
		||||
static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 | 
			
		||||
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_ACPI_NUMA
 | 
			
		||||
	/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -702,7 +702,7 @@ static void __init acpi_set_irq_model_ioapic(void)
 | 
			
		|||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
 | 
			
		||||
#include <acpi/processor.h>
 | 
			
		||||
 | 
			
		||||
static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 | 
			
		||||
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_ACPI_NUMA
 | 
			
		||||
	int nid;
 | 
			
		||||
| 
						 | 
				
			
			@ -713,6 +713,7 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 | 
			
		|||
		numa_set_node(cpu, nid);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -182,6 +182,11 @@ int __weak arch_register_cpu(int cpu)
 | 
			
		|||
 | 
			
		||||
void __weak arch_unregister_cpu(int cpu) {}
 | 
			
		||||
 | 
			
		||||
int __weak acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 | 
			
		||||
{
 | 
			
		||||
	return -ENODEV;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int acpi_processor_hotadd_init(struct acpi_processor *pr)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long long sta;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1193,6 +1193,7 @@ static int __init acpi_init(void)
 | 
			
		|||
	acpi_wakeup_device_init();
 | 
			
		||||
	acpi_debugger_init();
 | 
			
		||||
	acpi_setup_sb_notify_handler();
 | 
			
		||||
	acpi_set_processor_mapping();
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -280,6 +280,74 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id)
 | 
			
		|||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(acpi_get_cpuid);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
 | 
			
		||||
static bool __init
 | 
			
		||||
map_processor(acpi_handle handle, phys_cpuid_t *phys_id, int *cpuid)
 | 
			
		||||
{
 | 
			
		||||
	int type;
 | 
			
		||||
	u32 acpi_id;
 | 
			
		||||
	acpi_status status;
 | 
			
		||||
	acpi_object_type acpi_type;
 | 
			
		||||
	unsigned long long tmp;
 | 
			
		||||
	union acpi_object object = { 0 };
 | 
			
		||||
	struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
 | 
			
		||||
 | 
			
		||||
	status = acpi_get_type(handle, &acpi_type);
 | 
			
		||||
	if (ACPI_FAILURE(status))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	switch (acpi_type) {
 | 
			
		||||
	case ACPI_TYPE_PROCESSOR:
 | 
			
		||||
		status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
 | 
			
		||||
		if (ACPI_FAILURE(status))
 | 
			
		||||
			return false;
 | 
			
		||||
		acpi_id = object.processor.proc_id;
 | 
			
		||||
		break;
 | 
			
		||||
	case ACPI_TYPE_DEVICE:
 | 
			
		||||
		status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp);
 | 
			
		||||
		if (ACPI_FAILURE(status))
 | 
			
		||||
			return false;
 | 
			
		||||
		acpi_id = tmp;
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0;
 | 
			
		||||
 | 
			
		||||
	*phys_id = __acpi_get_phys_id(handle, type, acpi_id, false);
 | 
			
		||||
	*cpuid = acpi_map_cpuid(*phys_id, acpi_id);
 | 
			
		||||
	if (*cpuid == -1)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static acpi_status __init
 | 
			
		||||
set_processor_node_mapping(acpi_handle handle, u32 lvl, void *context,
 | 
			
		||||
			   void **rv)
 | 
			
		||||
{
 | 
			
		||||
	phys_cpuid_t phys_id;
 | 
			
		||||
	int cpu_id;
 | 
			
		||||
 | 
			
		||||
	if (!map_processor(handle, &phys_id, &cpu_id))
 | 
			
		||||
		return AE_ERROR;
 | 
			
		||||
 | 
			
		||||
	acpi_map_cpu2node(handle, cpu_id, phys_id);
 | 
			
		||||
	return AE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init acpi_set_processor_mapping(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Set persistent cpu <-> node mapping for all processors. */
 | 
			
		||||
	acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
 | 
			
		||||
			    ACPI_UINT32_MAX, set_processor_node_mapping,
 | 
			
		||||
			    NULL, NULL, NULL);
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
void __init acpi_set_processor_mapping(void) {}
 | 
			
		||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
 | 
			
		||||
static int get_ioapic_id(struct acpi_subtable_header *entry, u32 gsi_base,
 | 
			
		||||
			 u64 *phys_addr, int *ioapic_id)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -271,8 +271,11 @@ static inline bool invalid_phys_cpuid(phys_cpuid_t phys_id)
 | 
			
		|||
/* Arch dependent functions for cpu hotplug support */
 | 
			
		||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu);
 | 
			
		||||
int acpi_unmap_cpu(int cpu);
 | 
			
		||||
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid);
 | 
			
		||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
 | 
			
		||||
 | 
			
		||||
void acpi_set_processor_mapping(void);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
 | 
			
		||||
int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue