|
@@ -66,6 +66,8 @@ static struct timer_list topology_timer;
|
|
static void set_topology_timer(void);
|
|
static void set_topology_timer(void);
|
|
static DECLARE_WORK(topology_work, topology_work_fn);
|
|
static DECLARE_WORK(topology_work, topology_work_fn);
|
|
|
|
|
|
|
|
+cpumask_t cpu_core_map[NR_CPUS];
|
|
|
|
+
|
|
cpumask_t cpu_coregroup_map(unsigned int cpu)
|
|
cpumask_t cpu_coregroup_map(unsigned int cpu)
|
|
{
|
|
{
|
|
struct core_info *core = &core_info;
|
|
struct core_info *core = &core_info;
|
|
@@ -199,6 +201,14 @@ int topology_set_cpu_management(int fc)
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void update_cpu_core_map(void)
|
|
|
|
+{
|
|
|
|
+ int cpu;
|
|
|
|
+
|
|
|
|
+ for_each_present_cpu(cpu)
|
|
|
|
+ cpu_core_map[cpu] = cpu_coregroup_map(cpu);
|
|
|
|
+}
|
|
|
|
+
|
|
void arch_update_cpu_topology(void)
|
|
void arch_update_cpu_topology(void)
|
|
{
|
|
{
|
|
struct tl_info *info = tl_info;
|
|
struct tl_info *info = tl_info;
|
|
@@ -206,11 +216,13 @@ void arch_update_cpu_topology(void)
|
|
int cpu;
|
|
int cpu;
|
|
|
|
|
|
if (!machine_has_topology) {
|
|
if (!machine_has_topology) {
|
|
|
|
+ update_cpu_core_map();
|
|
topology_update_polarization_simple();
|
|
topology_update_polarization_simple();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
stsi(info, 15, 1, 2);
|
|
stsi(info, 15, 1, 2);
|
|
tl_to_cores(info);
|
|
tl_to_cores(info);
|
|
|
|
+ update_cpu_core_map();
|
|
for_each_online_cpu(cpu) {
|
|
for_each_online_cpu(cpu) {
|
|
sysdev = get_cpu_sysdev(cpu);
|
|
sysdev = get_cpu_sysdev(cpu);
|
|
kobject_uevent(&sysdev->kobj, KOBJ_CHANGE);
|
|
kobject_uevent(&sysdev->kobj, KOBJ_CHANGE);
|
|
@@ -251,20 +263,23 @@ static int __init init_topology_update(void)
|
|
{
|
|
{
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
|
|
+ rc = 0;
|
|
if (!machine_has_topology) {
|
|
if (!machine_has_topology) {
|
|
topology_update_polarization_simple();
|
|
topology_update_polarization_simple();
|
|
- return 0;
|
|
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
init_timer_deferrable(&topology_timer);
|
|
init_timer_deferrable(&topology_timer);
|
|
if (machine_has_topology_irq) {
|
|
if (machine_has_topology_irq) {
|
|
rc = register_external_interrupt(0x2005, topology_interrupt);
|
|
rc = register_external_interrupt(0x2005, topology_interrupt);
|
|
if (rc)
|
|
if (rc)
|
|
- return rc;
|
|
|
|
|
|
+ goto out;
|
|
ctl_set_bit(0, 8);
|
|
ctl_set_bit(0, 8);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
set_topology_timer();
|
|
set_topology_timer();
|
|
- return 0;
|
|
|
|
|
|
+out:
|
|
|
|
+ update_cpu_core_map();
|
|
|
|
+ return rc;
|
|
}
|
|
}
|
|
__initcall(init_topology_update);
|
|
__initcall(init_topology_update);
|
|
|
|
|