Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp101472imu; Tue, 8 Jan 2019 15:29:56 -0800 (PST) X-Google-Smtp-Source: ALg8bN5rSChZFR5Ds95wY9mJyMNb6FrnYF0sWq/jH66S1IFPzueEhTt6/ruWyHDTlkY9P4Qaln8e X-Received: by 2002:a63:5346:: with SMTP id t6mr3393335pgl.40.1546990196241; Tue, 08 Jan 2019 15:29:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546990196; cv=none; d=google.com; s=arc-20160816; b=q4EXuDqrEw6Udqu4Tq+QLyNDhZ9+ju5P26ZX0ZXTG14Kks2AqefGYE5MNoMRsHAvf0 59YJCGYNHOxFbzV/ytQSQ09ZVrda7eK2YBbQjDrDT9G0y78k/lurgc2SGIMjJcMQ5LdC OCRrJVszpdIcaHk/nYbhfVm1ncJI+t6EDBSkC4HZE2pWBGwNLIkhyk2g7ZoTKXQmTxvD Fr8BnUegYMRzIRsTlySaN4cZTkydWHl3phXOA87OgyeDTs25f7Vzv+3pLUt566pFDf4Y Jqe7cVfR2xP/qJxrz+M1OJyXJQYmNqRz3sm7nvchU1vuZB5cyCwbdc0xafsA+PdqMK/G cMQQ== 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 :dkim-signature; bh=Mcxz0avOD9rDgn7fb0KKSc7cD+SH3fjVXuIZ1jDzHTo=; b=prXvdKMCGvPr0jUHb9Yc59I04TrXaSXZvViWbebAUCG07ODrSt+iL5qNLFjjW1CPfr CG+Fg//BxyDnh6SDIxKLgzado6HzCYLrFOH0oc3CjkCDF969BFFj49RH2kGVsay9j1B9 7RjdMMqELt44w2X/Aqv9/DCGjzKwLV3o0Z8GSCmyCRLhfpPjhK+SqTautgIyUelBTTD4 KlXqpm5IMGZggpEh4s1I79ZgI2Zb94RJ6lOFgiXTGClYk7OT0x4jpjqmiosAMURV9DOd OqRCd7/cUO/6UMqQn8dOlreTcPnNpB92Oc06c4i58pIZSpmRvCQ6Tk8b0y7vptv3V4XY 19Tw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=IYrSi9TB; 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=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1si67024121plr.189.2019.01.08.15.29.40; Tue, 08 Jan 2019 15:29:56 -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=@kernel.org header.s=default header.b=IYrSi9TB; 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=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733000AbfAHUHE (ORCPT + 99 others); Tue, 8 Jan 2019 15:07:04 -0500 Received: from mail.kernel.org ([198.145.29.99]:34544 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729115AbfAHT16 (ORCPT ); Tue, 8 Jan 2019 14:27:58 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5DE1D20578; Tue, 8 Jan 2019 19:27:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546975678; bh=AOKM9aP3K91DApiEOhrPC6XBXVCx80u9YSho/Ff4azY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IYrSi9TBrzQ85r9/UZtQOs94Ys6KPQvUFvELlV/+IYjE2YLf7X8H6gUYFylxdgrs0 BAYgQ77p9MFIx5NzBsgXOJGSlhJWk9ZE8rEFQObBukIVbbiFyr28tvD9oZkpc31u7H RMZArqre+3yM2/jzAlu2jjPRKmtoM0ljij6npQKI= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Breno Leitao , Michael Ellerman , Sasha Levin , linux-pm@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Subject: [PATCH AUTOSEL 4.20 048/117] powerpc/pseries/cpuidle: Fix preempt warning Date: Tue, 8 Jan 2019 14:25:16 -0500 Message-Id: <20190108192628.121270-48-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190108192628.121270-1-sashal@kernel.org> References: <20190108192628.121270-1-sashal@kernel.org> MIME-Version: 1.0 X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Breno Leitao [ Upstream commit 2b038cbc5fcf12a7ee1cc9bfd5da1e46dacdee87 ] When booting a pseries kernel with PREEMPT enabled, it dumps the following warning: BUG: using smp_processor_id() in preemptible [00000000] code: swapper/0/1 caller is pseries_processor_idle_init+0x5c/0x22c CPU: 13 PID: 1 Comm: swapper/0 Not tainted 4.20.0-rc3-00090-g12201a0128bc-dirty #828 Call Trace: [c000000429437ab0] [c0000000009c8878] dump_stack+0xec/0x164 (unreliable) [c000000429437b00] [c0000000005f2f24] check_preemption_disabled+0x154/0x160 [c000000429437b90] [c000000000cab8e8] pseries_processor_idle_init+0x5c/0x22c [c000000429437c10] [c000000000010ed4] do_one_initcall+0x64/0x300 [c000000429437ce0] [c000000000c54500] kernel_init_freeable+0x3f0/0x500 [c000000429437db0] [c0000000000112dc] kernel_init+0x2c/0x160 [c000000429437e20] [c00000000000c1d0] ret_from_kernel_thread+0x5c/0x6c This happens because the code calls get_lppaca() which calls get_paca() and it checks if preemption is disabled through check_preemption_disabled(). Preemption should be disabled because the per CPU variable may make no sense if there is a preemption (and a CPU switch) after it reads the per CPU data and when it is used. In this device driver specifically, it is not a problem, because this code just needs to have access to one lppaca struct, and it does not matter if it is the current per CPU lppaca struct or not (i.e. when there is a preemption and a CPU migration). That said, the most appropriate fix seems to be related to avoiding the debug_smp_processor_id() call at get_paca(), instead of calling preempt_disable() before get_paca(). Signed-off-by: Breno Leitao Signed-off-by: Michael Ellerman Signed-off-by: Sasha Levin --- drivers/cpuidle/cpuidle-pseries.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/cpuidle/cpuidle-pseries.c b/drivers/cpuidle/cpuidle-pseries.c index 9e56bc411061..74c247972bb3 100644 --- a/drivers/cpuidle/cpuidle-pseries.c +++ b/drivers/cpuidle/cpuidle-pseries.c @@ -247,7 +247,13 @@ static int pseries_idle_probe(void) return -ENODEV; if (firmware_has_feature(FW_FEATURE_SPLPAR)) { - if (lppaca_shared_proc(get_lppaca())) { + /* + * Use local_paca instead of get_lppaca() since + * preemption is not disabled, and it is not required in + * fact, since lppaca_ptr does not need to be the value + * associated to the current CPU, it can be from any CPU. + */ + if (lppaca_shared_proc(local_paca->lppaca_ptr)) { cpuidle_state_table = shared_states; max_idle_state = ARRAY_SIZE(shared_states); } else { -- 2.19.1