Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp4054728ima; Mon, 4 Feb 2019 09:26:07 -0800 (PST) X-Google-Smtp-Source: AHgI3IYVLBHot/pKDYY05rHLSL+hKurNLga2fKsaSWmr6wEPAaRGOWL7W8wNKV/l72GvlBLKon3W X-Received: by 2002:a17:902:241:: with SMTP id 59mr502098plc.72.1549301167658; Mon, 04 Feb 2019 09:26:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549301167; cv=none; d=google.com; s=arc-20160816; b=PZgMVzCuEj6XmxCR9s1YOrgXqUdoqkFJ/6UQmxFgLT6NnC/dGdio+04LvY/U8/FVq8 6uBec5y6bH+SDUNHbUC/15KkA9s9mPbVGN1CofAjLyiQwZ8zRcA/I0UNcvXKj0pq8Yog wKdROqyr6cfysbJayWHbpzYoYtih1qbqi/6idn/pF5rqGf9g3Y7FsOc6Rs2013AhH6Ux u649+6hPKjkpRouta4X1fHUhzPY15uGyeCjpUfbJ56UoK1HwJCg5mXDziv5BVRFVQ34q lruBpezoUM2tmvyShwtCD+E3H1PUtdv/bTsRcY51WPPVR5W8haUufd85VxC1h83GyYbB 08zw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=u0KMZlBs8dkYCefFaZG+FskPU4IrAGYdRBiZ3PC2StM=; b=vWzOkNQ3FYaxYbJ1S7g7K9bMcBEpDI7xttWPQANdiUAy+DhvjycB1zDWaq6adL1d1D wSrA3h9o7m0tLJcR+rUmBoTl9h4xRteJ2MOj6qygvqYdbP+jXELbNRRUi1aq+RczE3LS VxR5PF3fhhIdI6kW7wBDku51UxIBD3lVy8Y/Ad2QdTfaS/6sncO6Ob9ojr32TyqEpA0+ v+SSoTcu9o5A1I9M78jpi+6EtEvJ9Ly792EyIn1Uu7euP4wE6Gq48HivQzsbQa31cL9m LDeaaVRlbz7XIRQu+V3XwGZ/e7EZKrGlouIHZuMh0f4umM6ffBEf+91VusDK7HiHfQAH vU3g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e4si494075pgd.256.2019.02.04.09.25.51; Mon, 04 Feb 2019 09:26:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730562AbfBDRJr (ORCPT + 99 others); Mon, 4 Feb 2019 12:09:47 -0500 Received: from foss.arm.com ([217.140.101.70]:58680 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730494AbfBDRJp (ORCPT ); Mon, 4 Feb 2019 12:09:45 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4FC9B15BE; Mon, 4 Feb 2019 09:09:45 -0800 (PST) Received: from e110467-lin.cambridge.arm.com (e110467-lin.cambridge.arm.com [10.1.196.75]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id CABDA3F589; Mon, 4 Feb 2019 09:09:43 -0800 (PST) From: Robin Murphy To: will.deacon@arm.com, mark.rutland@arm.com Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, suzuki.poulose@arm.com, peterz@infradead.org, tglx@linutronix.de, bigeasy@linutronix.de Subject: [PATCH 3/5] perf/arm-ccn: Fix CPU hotplug race avoidance Date: Mon, 4 Feb 2019 17:09:06 +0000 Message-Id: X-Mailer: git-send-email 2.20.1.dirty In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Like arm-cci, arm-ccn has the same issue where disabling preemption to avoid races between registering the PMU device and the hotplug notifier can lead to those operations taking mutexes in an invalid context. Fix it the same way by disabling hotplug instead of preemption. Since we only ever associate the PMU instance with a single CPU, we can also take the opportunity to slightly simplify the hotplug handling to track just that CPU number instead of a full cpumask. Signed-off-by: Robin Murphy --- drivers/perf/arm-ccn.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/perf/arm-ccn.c b/drivers/perf/arm-ccn.c index 7dd850e02f19..8629893a9ef6 100644 --- a/drivers/perf/arm-ccn.c +++ b/drivers/perf/arm-ccn.c @@ -167,7 +167,7 @@ struct arm_ccn_dt { struct hrtimer hrtimer; - cpumask_t cpu; + unsigned int cpu; struct hlist_node node; struct pmu pmu; @@ -559,7 +559,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 = @@ -762,7 +762,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); @@ -1218,15 +1218,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; } @@ -1301,11 +1301,12 @@ 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); + cpus_read_lock(); + ccn->dt.cpu = 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; @@ -1316,14 +1317,14 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn) if (err) goto error_pmu_register; - cpuhp_state_add_instance_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE, - &ccn->dt.node); - put_cpu(); + cpuhp_state_add_instance_nocalls_cpuslocked(CPUHP_AP_PERF_ARM_CCN_ONLINE, + &ccn->dt.node); + cpus_read_unlock(); return 0; error_pmu_register: error_set_affinity: - put_cpu(); + cpus_read_unlock(); error_choose_name: ida_simple_remove(&arm_ccn_pmu_ida, ccn->dt.id); for (i = 0; i < ccn->num_xps; i++) -- 2.20.1.dirty