]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/perf/arm-ccn.c
libata/ahci: Fix PCS quirk application
[linux.git] / drivers / perf / arm-ccn.c
index 2ae76026e947fc38f0fb4ab1c33b601f42cc7e51..6fc0273b6129d286c111d182fb4cbf63ecda670d 100644 (file)
@@ -1,12 +1,5 @@
+// SPDX-License-Identifier: GPL-2.0-only
 /*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
  *
  * Copyright (C) 2014 ARM Limited
  */
@@ -167,7 +160,7 @@ struct arm_ccn_dt {
 
        struct hrtimer hrtimer;
 
-       cpumask_t cpu;
+       unsigned int cpu;
        struct hlist_node node;
 
        struct pmu pmu;
@@ -559,7 +552,7 @@ static ssize_t arm_ccn_pmu_cpumask_show(struct device *dev,
 {
        struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev));
 
-       return cpumap_print_to_pagebuf(true, buf, &ccn->dt.cpu);
+       return cpumap_print_to_pagebuf(true, buf, cpumask_of(ccn->dt.cpu));
 }
 
 static struct device_attribute arm_ccn_pmu_cpumask_attr =
@@ -759,7 +752,7 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
         * mitigate this, we enforce CPU assignment to one, selected
         * processor (the one described in the "cpumask" attribute).
         */
-       event->cpu = cpumask_first(&ccn->dt.cpu);
+       event->cpu = ccn->dt.cpu;
 
        node_xp = CCN_CONFIG_NODE(event->attr.config);
        type = CCN_CONFIG_TYPE(event->attr.config);
@@ -1215,15 +1208,15 @@ static int arm_ccn_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node)
        struct arm_ccn *ccn = container_of(dt, struct arm_ccn, dt);
        unsigned int target;
 
-       if (!cpumask_test_and_clear_cpu(cpu, &dt->cpu))
+       if (cpu != dt->cpu)
                return 0;
        target = cpumask_any_but(cpu_online_mask, cpu);
        if (target >= nr_cpu_ids)
                return 0;
        perf_pmu_migrate_context(&dt->pmu, cpu, target);
-       cpumask_set_cpu(target, &dt->cpu);
+       dt->cpu = target;
        if (ccn->irq)
-               WARN_ON(irq_set_affinity_hint(ccn->irq, &dt->cpu) != 0);
+               WARN_ON(irq_set_affinity_hint(ccn->irq, cpumask_of(dt->cpu)));
        return 0;
 }
 
@@ -1299,29 +1292,30 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn)
        }
 
        /* Pick one CPU which we will use to collect data from CCN... */
-       cpumask_set_cpu(get_cpu(), &ccn->dt.cpu);
+       ccn->dt.cpu = raw_smp_processor_id();
 
        /* Also make sure that the overflow interrupt is handled by this CPU */
        if (ccn->irq) {
-               err = irq_set_affinity_hint(ccn->irq, &ccn->dt.cpu);
+               err = irq_set_affinity_hint(ccn->irq, cpumask_of(ccn->dt.cpu));
                if (err) {
                        dev_err(ccn->dev, "Failed to set interrupt affinity!\n");
                        goto error_set_affinity;
                }
        }
 
+       cpuhp_state_add_instance_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE,
+                                        &ccn->dt.node);
+
        err = perf_pmu_register(&ccn->dt.pmu, name, -1);
        if (err)
                goto error_pmu_register;
 
-       cpuhp_state_add_instance_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE,
-                                        &ccn->dt.node);
-       put_cpu();
        return 0;
 
 error_pmu_register:
+       cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE,
+                                           &ccn->dt.node);
 error_set_affinity:
-       put_cpu();
 error_choose_name:
        ida_simple_remove(&arm_ccn_pmu_ida, ccn->dt.id);
        for (i = 0; i < ccn->num_xps; i++)