Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp4858972ima; Tue, 5 Feb 2019 02:28:26 -0800 (PST) X-Google-Smtp-Source: AHgI3IbBNrKZxZlpFHX8CGlpEGiklfpNOb2Sboq4t20JMS1oUw7iiie6gS2stfYZsdbB2hJoiZKo X-Received: by 2002:a63:2c8c:: with SMTP id s134mr2490423pgs.269.1549362506771; Tue, 05 Feb 2019 02:28:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549362506; cv=none; d=google.com; s=arc-20160816; b=uAvhjxahLExe866zhUGc0D71ZlTSaTnqFyNWeeES4fV8r0ZYRVxiroVLrunEOotHU+ AZKk5llTA0oFXtavpGTA+109guCWF3zmQ+bfT53eJD4ck6C0OVo5C1EiORWWZSraNKqQ 4weRv1TUuzYFkWjWeNBx0godt5lazNsfcLbHIyemAh2MrfzhuMIWfbcMptTeYzuf0b4v 4kJKCjkBptuRhkogdt7/Z1EiubgmWWHkudXlUQAjs6fMJOUGiDFpUWzACbQKlAFT3Xb4 Afd1cnKi8H0b9ty/5F3JLwo8rV8H4ZmfZF854c3966Xy0wQBfxJSvqHPKN3xGzk4mpT4 VmZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=fXd6DbXSx8O30DE77NsjshJqWksv0B74q6S2C+obTY4=; b=0GBjSpq58knEDsQuxdft5/W/Ri1sPG1QaN3oPLaxdOYFGXOXlDjXWkOWsbcr6wXL+S uZ8pLk/tSt4c7KRDlfw+XMi9z/MI7W7QBTOYA7P4JlsFKo+vICc8CYvKdofJGKFq2X/A ABMRlSvxoLwLitzVSA0ShXUkU5ZhiQQrTRYI4FhV4M39XpRtHAxmk+T2zUEUyKDLa3ox xarqKUoVYZPRVz0RFvElCwGLqU8vpiG1B82KCJGEnq+kT0P+UhmT3punQTTCIG8F/Ml0 KUadARveu0eAsZwcpPdJ1A4S0JJnqY/QbBfQmSwYipy41gTn7Z54qrubAUd39Dg0H4bv lz2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=XGf3et6z; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y3si2889120pfb.152.2019.02.05.02.28.11; Tue, 05 Feb 2019 02:28:26 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=XGf3et6z; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728953AbfBEKKv (ORCPT + 99 others); Tue, 5 Feb 2019 05:10:51 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:55157 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727039AbfBEKKv (ORCPT ); Tue, 5 Feb 2019 05:10:51 -0500 Received: by mail-wm1-f67.google.com with SMTP id a62so2916887wmh.4 for ; Tue, 05 Feb 2019 02:10:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=fXd6DbXSx8O30DE77NsjshJqWksv0B74q6S2C+obTY4=; b=XGf3et6zvH1XRd8xzd/9CgQF+y/UQkLvR9OqCbbfHOspCFUE5zwOaGIp6rhCDfee6k QVvaLbm/5XV8DQSOInVQ2mr1qK8/AMPOcXcgW98RZbgenEwtEhopHcfNF5iGk5VGZIf+ hdIiRtZTy/hGJoiPZhkCzK33Aarfiv/zxv06WaPZlGlQcqryiv3kGrx0HjbjIEbdAc1V oxdAw4xTliVCH868SoRfS1+wFUp+ENGuTMbJ+QAF/6w6Rs5xX7yn0aqPZUbiLnhBRzAI rvVV5J/dzz2BUK8ZhoF5RuBxhe5MNz9j+hrNn/TunVisPVzodyGSjijY6IuFKvfJkxCg 2FYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=fXd6DbXSx8O30DE77NsjshJqWksv0B74q6S2C+obTY4=; b=LFmiV4J/gD/MKfO/Wv64NkoSSnZAN1fXwidMq4nh4A0tmCAXK1gBitJMBj0hoGapgI h/kWajrWtfc6VDbVovfr4wPo29JDujhjlsOAjMChg45RY8vapmRf+04QvUtGYgOk1F1e /6OpN+tN+CqmX9ajEbx342yNwN3lepKOmIfOEV2YCfaZiGzsS1AwgTamWx2gQIZyTSCg 1jESKUy35HXNjoJe9Gom0dn0koJ9ajn06niwD++MCX7/uoLcO3lfzns98EiSj53YcT+9 VF/SKIt2iKnbki5NQmYR1A8x4gjrZeHZ/XzYYy2K/ANPI8hJ9SFs/cP6v2mAlfzULPKT NcNA== X-Gm-Message-State: AHQUAuabKgGMjxPQ425T+ty0QeaVhRl+Pjnd18r5rVfH+xWxUePKUMcb souAL0QOmane/KPIylLwknU= X-Received: by 2002:a7b:c24c:: with SMTP id b12mr2810014wmj.29.1549361448578; Tue, 05 Feb 2019 02:10:48 -0800 (PST) Received: from Red ([2a01:cb1d:147:7200:2e56:dcff:fed2:c6d6]) by smtp.googlemail.com with ESMTPSA id c18sm11868785wre.32.2019.02.05.02.10.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Feb 2019 02:10:47 -0800 (PST) Date: Tue, 5 Feb 2019 11:10:45 +0100 From: Corentin Labbe To: Robin Murphy Cc: will.deacon@arm.com, mark.rutland@arm.com, suzuki.poulose@arm.com, peterz@infradead.org, bigeasy@linutronix.de, linux-kernel@vger.kernel.org, tglx@linutronix.de, "Li, Meng" , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 1/5] perf/arm-cci: Fix CPU hotplug race avoidance Message-ID: <20190205101045.GB27918@Red> References: <606ff8c3f7f35ccdcb4b52a49f692fb20e27359c.1549299188.git.robin.murphy@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <606ff8c3f7f35ccdcb4b52a49f692fb20e27359c.1549299188.git.robin.murphy@arm.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Feb 04, 2019 at 05:09:04PM +0000, Robin Murphy wrote: > The arm-cci probe logic faces a cyclic dependency wherein it has to pick > a valid CPU to associate with before registering the PMU device, has to > have the PMU state initialised before handling hotplug events in case it > must be migrated, but has to have the hotplug notifier registered before > the chosen CPU may go offline lest things get out of sync. The present > code has tried to solve the races by using get_cpu() to pick the current > CPU and prevent it from disappearing while the other two registrations > are performed, but that results in taking mutexes with preemption > disabled, which makes certain configurations very unhappy: > > [ 1.983337] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:2004 > [ 1.983340] in_atomic(): 1, irqs_disabled(): 0, pid: 1, name: swapper/0 > [ 1.983342] Preemption disabled at: > [ 1.983353] [] cci_pmu_probe+0x1dc/0x488 > [ 1.983360] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.18.20-rt8-yocto-preempt-rt #1 > [ 1.983362] Hardware name: ZynqMP ZCU102 Rev1.0 (DT) > [ 1.983364] Call trace: > [ 1.983369] dump_backtrace+0x0/0x158 > [ 1.983372] show_stack+0x24/0x30 > [ 1.983378] dump_stack+0x80/0xa4 > [ 1.983383] ___might_sleep+0x138/0x160 > [ 1.983386] __might_sleep+0x58/0x90 > [ 1.983391] __rt_mutex_lock_state+0x30/0xc0 > [ 1.983395] _mutex_lock+0x24/0x30 > [ 1.983400] perf_pmu_register+0x2c/0x388 > [ 1.983404] cci_pmu_probe+0x2bc/0x488 > [ 1.983409] platform_drv_probe+0x58/0xa8 > > However, we don't actually mind being preempted or migrated at this > point; all that really matters is that whichever CPU we pick does not > get offlined before we're done. Thus, do the robust thing and instead > take the lock to inhibit CPU hotplug for the duration. This also > revealed an additional race in assigning the global pointer too late > relative to the hotplug notifier, so that gets fixed in the process. > > Reported-by: "Li, Meng" > Signed-off-by: Robin Murphy > --- > drivers/perf/arm-cci.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/drivers/perf/arm-cci.c b/drivers/perf/arm-cci.c > index 1bfeb160c5b1..f6d9df07ec9b 100644 > --- a/drivers/perf/arm-cci.c > +++ b/drivers/perf/arm-cci.c > @@ -1692,21 +1692,23 @@ static int cci_pmu_probe(struct platform_device *pdev) > raw_spin_lock_init(&cci_pmu->hw_events.pmu_lock); > mutex_init(&cci_pmu->reserve_mutex); > atomic_set(&cci_pmu->active_events, 0); > - cci_pmu->cpu = get_cpu(); > + > + cpus_read_lock(); > + cci_pmu->cpu = smp_processor_id(); > > ret = cci_pmu_init(cci_pmu, pdev); > - if (ret) { > - put_cpu(); > - return ret; > - } > + if (ret) > + goto out; > > - cpuhp_setup_state_nocalls(CPUHP_AP_PERF_ARM_CCI_ONLINE, > - "perf/arm/cci:online", NULL, > - cci_pmu_offline_cpu); > - put_cpu(); > g_cci_pmu = cci_pmu; > + cpuhp_setup_state_nocalls_cpuslocked(CPUHP_AP_PERF_ARM_CCI_ONLINE, > + "perf/arm/cci:online", NULL, > + cci_pmu_offline_cpu); > + > pr_info("ARM %s PMU driver probed", cci_pmu->model->name); > - return 0; > +out: > + cpus_read_unlock(); > + return ret; > } > > static int cci_pmu_remove(struct platform_device *pdev) > -- > 2.20.1.dirty Hello Thanks, this patch fix my issue that I has reported here: https://lkml.org/lkml/2017/12/29/139 https://lkml.org/lkml/2018/11/12/1901 Tested-by: Corentin Labbe Tested-on: sun8i-a83t-bananapi-m3 Regards