From patchwork Sun Dec 29 17:25:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kroah-Hartman X-Patchwork-Id: 182566 Delivered-To: patch@linaro.org Received: by 2002:a92:815a:0:0:0:0:0 with SMTP id e87csp5465273ild; Sun, 29 Dec 2019 09:53:22 -0800 (PST) X-Google-Smtp-Source: APXvYqyYDtfrvwYrRifdEr0jWYIyB6OgB/CGlDgS/GvzR2L+owZyeu5Qk6kgB4I/4tFc1ts2xNtC X-Received: by 2002:a9d:7448:: with SMTP id p8mr56367007otk.96.1577642002016; Sun, 29 Dec 2019 09:53:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577642002; cv=none; d=google.com; s=arc-20160816; b=gvrSUPwkbt9EaigKpo67QU+Evy/J2TSQEdDvvc+QnXOPiE9PuPye3Rqi96CPMsV9Pb t/+Ss3JCtgPJU0AC0CbgPfPq0NzVMTWFrSVQUSlBANVJMvnw8AtN8njysD6IF+XaI+sK l2ObUJgA4XvVfxCyCX2UMhrPEC/5G/x99I2TGdNK3JWXZXMaeuk31//xw4TyKyhRpE+t 6HcQcWQAk4ki1JhXfzYsZjseYGHSmCQQhllFPJZxI5rssUsi0YFnrzw5hGBlO3RBkK48 G3jIi38vG69bBRtsb2Eqoyeebk2wVAk3nLnBODx2HpEr11S37AYbxjhu+eS4kK6oWZM5 gT5g== 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=55wsPhovc2rkQB9eyvlKsZLY6c2Uow20NhgHTvchkn8=; b=n00Nxa+gYH67mGw1BL9HK2AlDzrIKjm6SWbHnldelnaCZrkOdoM/1Y9Fvfhv6m9t3F u1Gy1b7QVyjcxuALVKxWn6m2/N3I+7BNG/sfMYinrcU8xJ5+bcM1V03wD9P7wR8CQZA4 gX3KkRjgKt0uRRSpH5Jk/R8BF1UMQ196yo612Le4pNkVZuVsNivc6gzixodrevWaIq1u oaYYRhHSDFRd1OqFJq3zc5Xbx17jMgpbnmMDNLdJ6tuTq5URiq3uGP3y8GHMd+1MyA5w x2iisxIUNY2yKEITzLG0CVM2YlO1Bl8GG06+c1cKQ02TKlCqDQd1MiQMwhlLLq76Cugg Pjaw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="r/PE5+IS"; 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 t12si21759372otq.53.2019.12.29.09.53.21; Sun, 29 Dec 2019 09:53:22 -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="r/PE5+IS"; 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 S1732451AbfL2RxT (ORCPT + 27 others); Sun, 29 Dec 2019 12:53:19 -0500 Received: from mail.kernel.org ([198.145.29.99]:40178 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732440AbfL2RxS (ORCPT ); Sun, 29 Dec 2019 12:53:18 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 3D217208C4; Sun, 29 Dec 2019 17:53:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1577641997; bh=zGS+aqvAvxMzGQtbGteTq1Bu11ZdWToCeo4/By73nVI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r/PE5+ISbURZ+dyOC5f0NA8GLSSdEf7br4qTE0NnVmdcBcBIE37i108/FltGyA1jw fX1Z3gpPaET+EgzzC0HzSDSbTtwSl4YfB+KgebbVPWSxIIR7QT5ZLS1vvQPoQCcEZt XSvuAd9gfXmRc7BVgpIENnEimDUPkCFk0jJ1o7go= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Bjorn Andersson , Viresh Kumar , Amit Kucheria , "Rafael J. Wysocki" , Sasha Levin Subject: [PATCH 5.4 299/434] cpufreq: Register drivers only after CPU devices have been registered Date: Sun, 29 Dec 2019 18:25:52 +0100 Message-Id: <20191229172721.812455633@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20191229172702.393141737@linuxfoundation.org> References: <20191229172702.393141737@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Viresh Kumar [ Upstream commit 46770be0cf94149ca48be87719bda1d951066644 ] The cpufreq core heavily depends on the availability of the struct device for CPUs and if they aren't available at the time cpufreq driver is registered, we will never succeed in making cpufreq work. This happens due to following sequence of events: - cpufreq_register_driver() - subsys_interface_register() - return 0; //successful registration of driver ... at a later point of time - register_cpu(); - device_register(); - bus_probe_device(); - sif->add_dev(); - cpufreq_add_dev(); - get_cpu_device(); //FAILS - per_cpu(cpu_sys_devices, num) = &cpu->dev; //used by get_cpu_device() - return 0; //CPU registered successfully Because the per-cpu variable cpu_sys_devices is set only after the CPU device is regsitered, cpufreq will never be able to get it when cpufreq_add_dev() is called. This patch avoids this failure by making sure device structure of at least CPU0 is available when the cpufreq driver is registered, else return -EPROBE_DEFER. Reported-by: Bjorn Andersson Co-developed-by: Amit Kucheria Signed-off-by: Viresh Kumar Tested-by: Amit Kucheria Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/cpufreq/cpufreq.c | 7 +++++++ 1 file changed, 7 insertions(+) -- 2.20.1 diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index bc19d6c16aaa..a7db4f22a077 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -2634,6 +2634,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) if (cpufreq_disabled()) return -ENODEV; + /* + * The cpufreq core depends heavily on the availability of device + * structure, make sure they are available before proceeding further. + */ + if (!get_cpu_device(0)) + return -EPROBE_DEFER; + if (!driver_data || !driver_data->verify || !driver_data->init || !(driver_data->setpolicy || driver_data->target_index || driver_data->target) ||