perf/core: fix parent pid/tid in task exit events
[platform/kernel/linux-rpi.git] / kernel / padata.c
index 9c82ee4..c4b7743 100644 (file)
@@ -512,27 +512,23 @@ static int padata_replace_one(struct padata_shell *ps)
        return 0;
 }
 
-static int padata_replace(struct padata_instance *pinst, int cpu)
+static int padata_replace(struct padata_instance *pinst)
 {
        int notification_mask = 0;
        struct padata_shell *ps;
-       int err;
+       int err = 0;
 
        pinst->flags |= PADATA_RESET;
 
        cpumask_copy(pinst->omask, pinst->rcpumask.pcpu);
        cpumask_and(pinst->rcpumask.pcpu, pinst->cpumask.pcpu,
                    cpu_online_mask);
-       if (cpu >= 0)
-               cpumask_clear_cpu(cpu, pinst->rcpumask.pcpu);
        if (!cpumask_equal(pinst->omask, pinst->rcpumask.pcpu))
                notification_mask |= PADATA_CPU_PARALLEL;
 
        cpumask_copy(pinst->omask, pinst->rcpumask.cbcpu);
        cpumask_and(pinst->rcpumask.cbcpu, pinst->cpumask.cbcpu,
                    cpu_online_mask);
-       if (cpu >= 0)
-               cpumask_clear_cpu(cpu, pinst->rcpumask.cbcpu);
        if (!cpumask_equal(pinst->omask, pinst->rcpumask.cbcpu))
                notification_mask |= PADATA_CPU_SERIAL;
 
@@ -624,7 +620,7 @@ out_replace:
        cpumask_copy(pinst->cpumask.pcpu, pcpumask);
        cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
 
-       err = padata_setup_cpumasks(pinst) ?: padata_replace(pinst, -1);
+       err = padata_setup_cpumasks(pinst) ?: padata_replace(pinst);
 
        if (valid)
                __padata_start(pinst);
@@ -647,8 +643,8 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
        struct cpumask *serial_mask, *parallel_mask;
        int err = -EINVAL;
 
-       mutex_lock(&pinst->lock);
        get_online_cpus();
+       mutex_lock(&pinst->lock);
 
        switch (cpumask_type) {
        case PADATA_CPU_PARALLEL:
@@ -666,8 +662,8 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
        err =  __padata_set_cpumasks(pinst, parallel_mask, serial_mask);
 
 out:
-       put_online_cpus();
        mutex_unlock(&pinst->lock);
+       put_online_cpus();
 
        return err;
 }
@@ -715,7 +711,7 @@ static int __padata_add_cpu(struct padata_instance *pinst, int cpu)
        int err = 0;
 
        if (cpumask_test_cpu(cpu, cpu_online_mask)) {
-               err = padata_replace(pinst, -1);
+               err = padata_replace(pinst);
 
                if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) &&
                    padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
@@ -729,12 +725,12 @@ static int __padata_remove_cpu(struct padata_instance *pinst, int cpu)
 {
        int err = 0;
 
-       if (cpumask_test_cpu(cpu, cpu_online_mask)) {
+       if (!cpumask_test_cpu(cpu, cpu_online_mask)) {
                if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) ||
                    !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
                        __padata_stop(pinst);
 
-               err = padata_replace(pinst, cpu);
+               err = padata_replace(pinst);
        }
 
        return err;
@@ -796,7 +792,7 @@ static int padata_cpu_online(unsigned int cpu, struct hlist_node *node)
        return ret;
 }
 
-static int padata_cpu_prep_down(unsigned int cpu, struct hlist_node *node)
+static int padata_cpu_dead(unsigned int cpu, struct hlist_node *node)
 {
        struct padata_instance *pinst;
        int ret;
@@ -817,6 +813,7 @@ static enum cpuhp_state hp_online;
 static void __padata_free(struct padata_instance *pinst)
 {
 #ifdef CONFIG_HOTPLUG_CPU
+       cpuhp_state_remove_instance_nocalls(CPUHP_PADATA_DEAD, &pinst->node);
        cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node);
 #endif
 
@@ -1024,6 +1021,8 @@ static struct padata_instance *padata_alloc(const char *name,
 
 #ifdef CONFIG_HOTPLUG_CPU
        cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node);
+       cpuhp_state_add_instance_nocalls_cpuslocked(CPUHP_PADATA_DEAD,
+                                                   &pinst->node);
 #endif
 
        put_online_cpus();
@@ -1136,17 +1135,24 @@ static __init int padata_driver_init(void)
        int ret;
 
        ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "padata:online",
-                                     padata_cpu_online,
-                                     padata_cpu_prep_down);
+                                     padata_cpu_online, NULL);
        if (ret < 0)
                return ret;
        hp_online = ret;
+
+       ret = cpuhp_setup_state_multi(CPUHP_PADATA_DEAD, "padata:dead",
+                                     NULL, padata_cpu_dead);
+       if (ret < 0) {
+               cpuhp_remove_multi_state(hp_online);
+               return ret;
+       }
        return 0;
 }
 module_init(padata_driver_init);
 
 static __exit void padata_driver_exit(void)
 {
+       cpuhp_remove_multi_state(CPUHP_PADATA_DEAD);
        cpuhp_remove_multi_state(hp_online);
 }
 module_exit(padata_driver_exit);