Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp2261328ybg; Sun, 27 Oct 2019 14:39:08 -0700 (PDT) X-Google-Smtp-Source: APXvYqxN5J0EVw1Yw6B+jnj+VCuK5Tjp8KepMz562OkimWcm0cWVcOB0I/JwVjSA1Nd6AJyKyaOA X-Received: by 2002:a50:8871:: with SMTP id c46mr16322036edc.24.1572212348725; Sun, 27 Oct 2019 14:39:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572212348; cv=none; d=google.com; s=arc-20160816; b=dZsk4SmzvU/0YtzIbRQ6zMDIRf9OW2H+ri9GZR0guEriqULxkC4fM0wZXUfwvoEOEt W7jx4GSnPm6oSwI2yp+PoU2EupNVCK5120x6wuRoovLSPmv8Yn2YEypr5QHMtff3QUK4 LcVMiBkGxU31F/4dV36ca2MrhawGoMFwC4jDi0iKcsI2m/u1Ro0qpupEEDm/2rNHkG2Q t3/bPuHK/cxTEWW4XkprT/Bbum1UtTdO2fOZTDq/pxqgWRQ4xcexLcWcuZQMoIPsUr8S aPApHCIGkE/mXTQG7P0n8x0OawalHTWkMTxPezFVphFz59TUCXaKpCjM4j4c4ynvu/O4 9bQw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=zrMZWdJ7fUzCKTK9x4/j2VY1ZwIrhXvRfQ7pgf9O6Yc=; b=R5P/cT27U4n92tRupBqmVX5uhCcF09JXVhpDqaojgkpTNC21o/61fRfkERvou9BmrK mWgKUuDN3tAuthw4oWpgreiOF3yDV1ZjBOe7qLYfXifq7agjL8snO6Yyv6qerMmiloXx tnrd2YeeZRxDRaxaz4ZmL5LZHhJvxTXnQG34x6buaSqGXLoiYMyYXrFGLbND9+dUIyGH w3iIDxDb1ASapWQMHrnGi7sJRRnGKt9UYEPb11ESUNa6B2mJ+jIuvTPssdWzfUoYp8xd CxOiNUoQGGd/XDsM63gdGoUsyo9zX8YoSZ/vJ9ko1/VwG33cNOdxbupJG+GFO+zVFCy7 Zh2w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=T2cD3IVB; 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 q44si4104868eda.242.2019.10.27.14.38.45; Sun, 27 Oct 2019 14:39:08 -0700 (PDT) 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=T2cD3IVB; 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 S1728998AbfJ0VG1 (ORCPT + 99 others); Sun, 27 Oct 2019 17:06:27 -0400 Received: from mail.kernel.org ([198.145.29.99]:52252 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728974AbfJ0VGS (ORCPT ); Sun, 27 Oct 2019 17:06:18 -0400 Received: from localhost (100.50.158.77.rev.sfr.net [77.158.50.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C121721D80; Sun, 27 Oct 2019 21:06:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1572210377; bh=HD9mHCLH10oaeXqUmRtcah0sFgC/axtPSfwRW0zPG2Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T2cD3IVBTH7+OYjIL/zZ2P/sVrvvdh2M2wSQnDg0grt8VvOlfZgKjRJT/QLP7chyw iYE8B6I93A7JCtGANAN7EEwIRh3khCdpt0hMG3lRDQ7blkr3zCRwdcGnRLIvfITKHk 7DCn4XQD529niCicfgM6RlpFA76BoTpk5wdrqta4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , "Rafael J. Wysocki" , Viresh Kumar Subject: [PATCH 4.9 45/49] cpufreq: Avoid cpufreq_suspend() deadlock on system shutdown Date: Sun, 27 Oct 2019 22:01:23 +0100 Message-Id: <20191027203202.190338203@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191027203119.468466356@linuxfoundation.org> References: <20191027203119.468466356@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rafael J. Wysocki commit 65650b35133ff20f0c9ef0abd5c3c66dbce3ae57 upstream. It is incorrect to set the cpufreq syscore shutdown callback pointer to cpufreq_suspend(), because that function cannot be run in the syscore stage of system shutdown for two reasons: (a) it may attempt to carry out actions depending on devices that have already been shut down at that point and (b) the RCU synchronization carried out by it may not be able to make progress then. The latter issue has been present since commit 45975c7d21a1 ("rcu: Define RCU-sched API in terms of RCU for Tree RCU PREEMPT builds"), but the former one has been there since commit 90de2a4aa9f3 ("cpufreq: suspend cpufreq governors on shutdown") regardless. Fix that by dropping cpufreq_syscore_ops altogether and making device_shutdown() call cpufreq_suspend() directly before shutting down devices, which is along the lines of what system-wide power management does. Fixes: 45975c7d21a1 ("rcu: Define RCU-sched API in terms of RCU for Tree RCU PREEMPT builds") Fixes: 90de2a4aa9f3 ("cpufreq: suspend cpufreq governors on shutdown") Reported-by: Ville Syrjälä Tested-by: Ville Syrjälä Signed-off-by: Rafael J. Wysocki Acked-by: Viresh Kumar Cc: 4.0+ # 4.0+ Signed-off-by: Greg Kroah-Hartman --- drivers/base/core.c | 3 +++ drivers/cpufreq/cpufreq.c | 10 ---------- 2 files changed, 3 insertions(+), 10 deletions(-) --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -10,6 +10,7 @@ * */ +#include #include #include #include @@ -2128,6 +2129,8 @@ void device_shutdown(void) wait_for_device_probe(); device_block_probing(); + cpufreq_suspend(); + spin_lock(&devices_kset->list_lock); /* * Walk the devices list backward, shutting down each in turn. --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -2543,14 +2543,6 @@ int cpufreq_unregister_driver(struct cpu } EXPORT_SYMBOL_GPL(cpufreq_unregister_driver); -/* - * Stop cpufreq at shutdown to make sure it isn't holding any locks - * or mutexes when secondary CPUs are halted. - */ -static struct syscore_ops cpufreq_syscore_ops = { - .shutdown = cpufreq_suspend, -}; - struct kobject *cpufreq_global_kobject; EXPORT_SYMBOL(cpufreq_global_kobject); @@ -2562,8 +2554,6 @@ static int __init cpufreq_core_init(void cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj); BUG_ON(!cpufreq_global_kobject); - register_syscore_ops(&cpufreq_syscore_ops); - return 0; } core_initcall(cpufreq_core_init);