Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, numa: Fix cpu nodemasks for NUMA emulation and CONFIG_DEBUG_PER_CPU_MAPS Revert "x86, NUMA: Fix fakenuma boot failure"
This commit is contained in:
@@ -51,7 +51,7 @@ static inline void numa_remove_cpu(int cpu) { }
|
|||||||
#endif /* CONFIG_NUMA */
|
#endif /* CONFIG_NUMA */
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
|
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
|
||||||
struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable);
|
void debug_cpumask_set_cpu(int cpu, int node, bool enable);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_X86_NUMA_H */
|
#endif /* _ASM_X86_NUMA_H */
|
||||||
|
@@ -312,26 +312,6 @@ void __cpuinit smp_store_cpu_info(int id)
|
|||||||
identify_secondary_cpu(c);
|
identify_secondary_cpu(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cpuinit check_cpu_siblings_on_same_node(int cpu1, int cpu2)
|
|
||||||
{
|
|
||||||
int node1 = early_cpu_to_node(cpu1);
|
|
||||||
int node2 = early_cpu_to_node(cpu2);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Our CPU scheduler assumes all logical cpus in the same physical cpu
|
|
||||||
* share the same node. But, buggy ACPI or NUMA emulation might assign
|
|
||||||
* them to different node. Fix it.
|
|
||||||
*/
|
|
||||||
if (node1 != node2) {
|
|
||||||
pr_warning("CPU %d in node %d and CPU %d in node %d are in the same physical CPU. forcing same node %d\n",
|
|
||||||
cpu1, node1, cpu2, node2, node2);
|
|
||||||
|
|
||||||
numa_remove_cpu(cpu1);
|
|
||||||
numa_set_node(cpu1, node2);
|
|
||||||
numa_add_cpu(cpu1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __cpuinit link_thread_siblings(int cpu1, int cpu2)
|
static void __cpuinit link_thread_siblings(int cpu1, int cpu2)
|
||||||
{
|
{
|
||||||
cpumask_set_cpu(cpu1, cpu_sibling_mask(cpu2));
|
cpumask_set_cpu(cpu1, cpu_sibling_mask(cpu2));
|
||||||
@@ -340,7 +320,6 @@ static void __cpuinit link_thread_siblings(int cpu1, int cpu2)
|
|||||||
cpumask_set_cpu(cpu2, cpu_core_mask(cpu1));
|
cpumask_set_cpu(cpu2, cpu_core_mask(cpu1));
|
||||||
cpumask_set_cpu(cpu1, cpu_llc_shared_mask(cpu2));
|
cpumask_set_cpu(cpu1, cpu_llc_shared_mask(cpu2));
|
||||||
cpumask_set_cpu(cpu2, cpu_llc_shared_mask(cpu1));
|
cpumask_set_cpu(cpu2, cpu_llc_shared_mask(cpu1));
|
||||||
check_cpu_siblings_on_same_node(cpu1, cpu2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -382,12 +361,10 @@ void __cpuinit set_cpu_sibling_map(int cpu)
|
|||||||
per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) {
|
per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) {
|
||||||
cpumask_set_cpu(i, cpu_llc_shared_mask(cpu));
|
cpumask_set_cpu(i, cpu_llc_shared_mask(cpu));
|
||||||
cpumask_set_cpu(cpu, cpu_llc_shared_mask(i));
|
cpumask_set_cpu(cpu, cpu_llc_shared_mask(i));
|
||||||
check_cpu_siblings_on_same_node(cpu, i);
|
|
||||||
}
|
}
|
||||||
if (c->phys_proc_id == cpu_data(i).phys_proc_id) {
|
if (c->phys_proc_id == cpu_data(i).phys_proc_id) {
|
||||||
cpumask_set_cpu(i, cpu_core_mask(cpu));
|
cpumask_set_cpu(i, cpu_core_mask(cpu));
|
||||||
cpumask_set_cpu(cpu, cpu_core_mask(i));
|
cpumask_set_cpu(cpu, cpu_core_mask(i));
|
||||||
check_cpu_siblings_on_same_node(cpu, i);
|
|
||||||
/*
|
/*
|
||||||
* Does this new cpu bringup a new core?
|
* Does this new cpu bringup a new core?
|
||||||
*/
|
*/
|
||||||
|
@@ -213,53 +213,48 @@ int early_cpu_to_node(int cpu)
|
|||||||
return per_cpu(x86_cpu_to_node_map, cpu);
|
return per_cpu(x86_cpu_to_node_map, cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable)
|
void debug_cpumask_set_cpu(int cpu, int node, bool enable)
|
||||||
{
|
{
|
||||||
int node = early_cpu_to_node(cpu);
|
|
||||||
struct cpumask *mask;
|
struct cpumask *mask;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
if (node == NUMA_NO_NODE) {
|
if (node == NUMA_NO_NODE) {
|
||||||
/* early_cpu_to_node() already emits a warning and trace */
|
/* early_cpu_to_node() already emits a warning and trace */
|
||||||
return NULL;
|
return;
|
||||||
}
|
}
|
||||||
mask = node_to_cpumask_map[node];
|
mask = node_to_cpumask_map[node];
|
||||||
if (!mask) {
|
if (!mask) {
|
||||||
pr_err("node_to_cpumask_map[%i] NULL\n", node);
|
pr_err("node_to_cpumask_map[%i] NULL\n", node);
|
||||||
dump_stack();
|
dump_stack();
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpulist_scnprintf(buf, sizeof(buf), mask);
|
|
||||||
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
|
|
||||||
enable ? "numa_add_cpu" : "numa_remove_cpu",
|
|
||||||
cpu, node, buf);
|
|
||||||
return mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
# ifndef CONFIG_NUMA_EMU
|
|
||||||
static void __cpuinit numa_set_cpumask(int cpu, int enable)
|
|
||||||
{
|
|
||||||
struct cpumask *mask;
|
|
||||||
|
|
||||||
mask = debug_cpumask_set_cpu(cpu, enable);
|
|
||||||
if (!mask)
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (enable)
|
if (enable)
|
||||||
cpumask_set_cpu(cpu, mask);
|
cpumask_set_cpu(cpu, mask);
|
||||||
else
|
else
|
||||||
cpumask_clear_cpu(cpu, mask);
|
cpumask_clear_cpu(cpu, mask);
|
||||||
|
|
||||||
|
cpulist_scnprintf(buf, sizeof(buf), mask);
|
||||||
|
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
|
||||||
|
enable ? "numa_add_cpu" : "numa_remove_cpu",
|
||||||
|
cpu, node, buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef CONFIG_NUMA_EMU
|
||||||
|
static void __cpuinit numa_set_cpumask(int cpu, bool enable)
|
||||||
|
{
|
||||||
|
debug_cpumask_set_cpu(cpu, early_cpu_to_node(cpu), enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cpuinit numa_add_cpu(int cpu)
|
void __cpuinit numa_add_cpu(int cpu)
|
||||||
{
|
{
|
||||||
numa_set_cpumask(cpu, 1);
|
numa_set_cpumask(cpu, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cpuinit numa_remove_cpu(int cpu)
|
void __cpuinit numa_remove_cpu(int cpu)
|
||||||
{
|
{
|
||||||
numa_set_cpumask(cpu, 0);
|
numa_set_cpumask(cpu, false);
|
||||||
}
|
}
|
||||||
# endif /* !CONFIG_NUMA_EMU */
|
# endif /* !CONFIG_NUMA_EMU */
|
||||||
|
|
||||||
|
@@ -454,10 +454,9 @@ void __cpuinit numa_remove_cpu(int cpu)
|
|||||||
cpumask_clear_cpu(cpu, node_to_cpumask_map[i]);
|
cpumask_clear_cpu(cpu, node_to_cpumask_map[i]);
|
||||||
}
|
}
|
||||||
#else /* !CONFIG_DEBUG_PER_CPU_MAPS */
|
#else /* !CONFIG_DEBUG_PER_CPU_MAPS */
|
||||||
static void __cpuinit numa_set_cpumask(int cpu, int enable)
|
static void __cpuinit numa_set_cpumask(int cpu, bool enable)
|
||||||
{
|
{
|
||||||
struct cpumask *mask;
|
int nid, physnid;
|
||||||
int nid, physnid, i;
|
|
||||||
|
|
||||||
nid = early_cpu_to_node(cpu);
|
nid = early_cpu_to_node(cpu);
|
||||||
if (nid == NUMA_NO_NODE) {
|
if (nid == NUMA_NO_NODE) {
|
||||||
@@ -467,28 +466,21 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)
|
|||||||
|
|
||||||
physnid = emu_nid_to_phys[nid];
|
physnid = emu_nid_to_phys[nid];
|
||||||
|
|
||||||
for_each_online_node(i) {
|
for_each_online_node(nid) {
|
||||||
if (emu_nid_to_phys[nid] != physnid)
|
if (emu_nid_to_phys[nid] != physnid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mask = debug_cpumask_set_cpu(cpu, enable);
|
debug_cpumask_set_cpu(cpu, nid, enable);
|
||||||
if (!mask)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (enable)
|
|
||||||
cpumask_set_cpu(cpu, mask);
|
|
||||||
else
|
|
||||||
cpumask_clear_cpu(cpu, mask);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cpuinit numa_add_cpu(int cpu)
|
void __cpuinit numa_add_cpu(int cpu)
|
||||||
{
|
{
|
||||||
numa_set_cpumask(cpu, 1);
|
numa_set_cpumask(cpu, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cpuinit numa_remove_cpu(int cpu)
|
void __cpuinit numa_remove_cpu(int cpu)
|
||||||
{
|
{
|
||||||
numa_set_cpumask(cpu, 0);
|
numa_set_cpumask(cpu, false);
|
||||||
}
|
}
|
||||||
#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */
|
#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */
|
||||||
|
Reference in New Issue
Block a user