[S390] Add topology_core_siblings to topology.h
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 30 Apr 2008 11:38:40 +0000 (13:38 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 30 Apr 2008 11:38:45 +0000 (13:38 +0200)
This exposes the core siblings to user space via sysfs.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
arch/s390/kernel/topology.c
include/asm-s390/topology.h

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