]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/s390/kernel/smp.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux.git] / arch / s390 / kernel / smp.c
index 5d53ab646b3f19f0f38a5568ae7d0e0db7cd2d81..e49f61aadaf9932fc09cc3772e4225dafd989cd9 100644 (file)
@@ -367,10 +367,15 @@ int smp_find_processor_id(u16 address)
        return -1;
 }
 
-int smp_vcpu_scheduled(int cpu)
+bool arch_vcpu_is_preempted(int cpu)
 {
-       return pcpu_running(pcpu_devices + cpu);
+       if (test_cpu_flag_of(CIF_ENABLED_WAIT, cpu))
+               return false;
+       if (pcpu_running(pcpu_devices + cpu))
+               return false;
+       return true;
 }
+EXPORT_SYMBOL(arch_vcpu_is_preempted);
 
 void smp_yield_cpu(int cpu)
 {
@@ -1040,22 +1045,18 @@ static struct attribute_group cpu_online_attr_group = {
        .attrs = cpu_online_attrs,
 };
 
-static int smp_cpu_notify(struct notifier_block *self, unsigned long action,
-                         void *hcpu)
+static int smp_cpu_online(unsigned int cpu)
 {
-       unsigned int cpu = (unsigned int)(long)hcpu;
        struct device *s = &per_cpu(cpu_device, cpu)->dev;
-       int err = 0;
 
-       switch (action & ~CPU_TASKS_FROZEN) {
-       case CPU_ONLINE:
-               err = sysfs_create_group(&s->kobj, &cpu_online_attr_group);
-               break;
-       case CPU_DEAD:
-               sysfs_remove_group(&s->kobj, &cpu_online_attr_group);
-               break;
-       }
-       return notifier_from_errno(err);
+       return sysfs_create_group(&s->kobj, &cpu_online_attr_group);
+}
+static int smp_cpu_pre_down(unsigned int cpu)
+{
+       struct device *s = &per_cpu(cpu_device, cpu)->dev;
+
+       sysfs_remove_group(&s->kobj, &cpu_online_attr_group);
+       return 0;
 }
 
 static int smp_add_present_cpu(int cpu)
@@ -1076,20 +1077,12 @@ static int smp_add_present_cpu(int cpu)
        rc = sysfs_create_group(&s->kobj, &cpu_common_attr_group);
        if (rc)
                goto out_cpu;
-       if (cpu_online(cpu)) {
-               rc = sysfs_create_group(&s->kobj, &cpu_online_attr_group);
-               if (rc)
-                       goto out_online;
-       }
        rc = topology_cpu_init(c);
        if (rc)
                goto out_topology;
        return 0;
 
 out_topology:
-       if (cpu_online(cpu))
-               sysfs_remove_group(&s->kobj, &cpu_online_attr_group);
-out_online:
        sysfs_remove_group(&s->kobj, &cpu_common_attr_group);
 out_cpu:
 #ifdef CONFIG_HOTPLUG_CPU
@@ -1143,17 +1136,15 @@ static int __init s390_smp_init(void)
        if (rc)
                return rc;
 #endif
-       cpu_notifier_register_begin();
        for_each_present_cpu(cpu) {
                rc = smp_add_present_cpu(cpu);
                if (rc)
                        goto out;
        }
 
-       __hotcpu_notifier(smp_cpu_notify, 0);
-
+       rc = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "s390/smp:online",
+                              smp_cpu_online, smp_cpu_pre_down);
 out:
-       cpu_notifier_register_done();
        return rc;
 }
 subsys_initcall(s390_smp_init);