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
 | 
					 *  ACPI based hotplug CPU support
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
 | 
					#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
 | 
					#ifdef CONFIG_ACPI_NUMA
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -702,7 +702,7 @@ static void __init acpi_set_irq_model_ioapic(void)
 | 
				
			||||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
 | 
					#ifdef CONFIG_ACPI_HOTPLUG_CPU
 | 
				
			||||||
#include <acpi/processor.h>
 | 
					#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
 | 
					#ifdef CONFIG_ACPI_NUMA
 | 
				
			||||||
	int nid;
 | 
						int nid;
 | 
				
			||||||
| 
						 | 
					@ -713,6 +713,7 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
 | 
				
			||||||
		numa_set_node(cpu, nid);
 | 
							numa_set_node(cpu, nid);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu)
 | 
					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) {}
 | 
					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)
 | 
					static int acpi_processor_hotadd_init(struct acpi_processor *pr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long long sta;
 | 
						unsigned long long sta;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1193,6 +1193,7 @@ static int __init acpi_init(void)
 | 
				
			||||||
	acpi_wakeup_device_init();
 | 
						acpi_wakeup_device_init();
 | 
				
			||||||
	acpi_debugger_init();
 | 
						acpi_debugger_init();
 | 
				
			||||||
	acpi_setup_sb_notify_handler();
 | 
						acpi_setup_sb_notify_handler();
 | 
				
			||||||
 | 
						acpi_set_processor_mapping();
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -280,6 +280,74 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(acpi_get_cpuid);
 | 
					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
 | 
					#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
 | 
				
			||||||
static int get_ioapic_id(struct acpi_subtable_header *entry, u32 gsi_base,
 | 
					static int get_ioapic_id(struct acpi_subtable_header *entry, u32 gsi_base,
 | 
				
			||||||
			 u64 *phys_addr, int *ioapic_id)
 | 
								 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 */
 | 
					/* Arch dependent functions for cpu hotplug support */
 | 
				
			||||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu);
 | 
					int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu);
 | 
				
			||||||
int acpi_unmap_cpu(int cpu);
 | 
					int acpi_unmap_cpu(int cpu);
 | 
				
			||||||
 | 
					int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid);
 | 
				
			||||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
 | 
					#endif /* CONFIG_ACPI_HOTPLUG_CPU */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void acpi_set_processor_mapping(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
 | 
					#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
 | 
				
			||||||
int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
 | 
					int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue