Received: by 10.223.176.46 with SMTP id f43csp152962wra; Tue, 23 Jan 2018 18:04:20 -0800 (PST) X-Google-Smtp-Source: AH8x2245u6Lv9L+a1W0UhdTK6EN/3Ou2+HKIY5Ju8uaYYlXzES42dEe4lI2W5OIWJ7dAg6N5GBoj X-Received: by 10.99.137.195 with SMTP id v186mr9821327pgd.25.1516759460131; Tue, 23 Jan 2018 18:04:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516759460; cv=none; d=google.com; s=arc-20160816; b=KJWTvchUIMFP466YehjqlsaY+tAd7ClWNz0WmhfV9wovs+Xq151rpxAG8+bEDR/TR5 37YCQZqZlPXISkEEBcvFajgO3bxFymMvTYmsGIEkqXu94YQ1yIBIKN4+n1VGLIOVgTDz 8whLODIuJbMFSfUhZ3Z0vSpVAd7YJOEDnonILGUI2DPN7eQEeFdEdOeIephE6d7HwP3h T2vDQIXjAC94LUXueG9JTyMZ0pBQSjzE0te1uzQO/B523N3ujSa+6Q6n6JL9snp3VyXD 4RZRaAVW9hGStthUzmkVrtEFXR27i67G7hQM2WTz4EbFJPs3rT5QW5Rlr0ptV+Dzfl+4 UCTA== 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 :arc-authentication-results; bh=3gPGsXr9o+iIvtE8xUlWfanxeajxahUm1REBc2U/IjY=; b=wHa3WE5vlYI5B6TTfjU27Y4B7/YeS6RPVi4RZRxPZOD8VoUCMrWih5JlhaL/b7NAM8 pyERbdDmSeALwd/adpZbj2QLUQ2386pzrFHdLTiYZ6/UzK06emAEF2ZLDXi1q9WtSBLw fW90zzQ8JzxnAqRQKXKc+89owqZFGWSafpSEAJyVybmHjwnmLd2B6s9x6TNCFpsm5lvS S6ssnPeqDTR4pg5K6qmJAE3z6PSir5a6eKP975SMRH9WcDxhhh1MNhha7vijKAP8JwP2 sQMC7p/x0sr4Ke43Of7V8zBWtb/z1h9nYdco4DXQZDGm88heeFhwgGAO9zrgjr+X4EZw JJXQ== 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 j67si15452019pgc.743.2018.01.23.18.04.06; Tue, 23 Jan 2018 18:04:20 -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 S1752148AbeAXCDl (ORCPT + 99 others); Tue, 23 Jan 2018 21:03:41 -0500 Received: from cloudserver094114.home.pl ([79.96.170.134]:41606 "EHLO cloudserver094114.home.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752043AbeAXCDk (ORCPT ); Tue, 23 Jan 2018 21:03:40 -0500 Received: from 138.44.250.224 (138.44.250.224) (HELO aspire.rjw.lan) by serwer1319399.home.pl (79.96.170.134) with SMTP (IdeaSmtpServer 0.82) id 419f4627bd68ad18; Wed, 24 Jan 2018 03:03:36 +0100 From: "Rafael J. Wysocki" To: Bo Yan Cc: viresh.kumar@linaro.org, sgurrappadi@nvidia.com, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] cpufreq: skip cpufreq resume if it's not suspended Date: Wed, 24 Jan 2018 03:02:09 +0100 Message-ID: <1744712.rO4QOLozun@aspire.rjw.lan> In-Reply-To: <1516744675-21233-1-git-send-email-byan@nvidia.com> References: <1516744675-21233-1-git-send-email-byan@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tuesday, January 23, 2018 10:57:55 PM CET Bo Yan wrote: > cpufreq_resume can be called even without preceding cpufreq_suspend. > This can happen in following scenario: > > suspend_devices_and_enter > --> dpm_suspend_start > --> dpm_prepare > --> device_prepare : this function errors out > --> dpm_suspend: this is skipped due to dpm_prepare failure > this means cpufreq_suspend is skipped over > --> goto Recover_platform, due to previous error > --> goto Resume_devices > --> dpm_resume_end > --> dpm_resume > --> cpufreq_resume > > In case schedutil is used as frequency governor, cpufreq_resume will > eventually call sugov_start, which does following: > > memset(sg_cpu, 0, sizeof(*sg_cpu)); > .... > > This effectively erases function pointer for frequency update, causing > crash later on. The function pointer would have been set correctly if > subsequent cpufreq_add_update_util_hook runs successfully, but that > function returns earlier because cpufreq_suspend was not called: > > if (WARN_ON(per_cpu(cpufreq_update_util_data, cpu))) > return; > > Ideally, suspend should succeed, then things will be fine. But even > in case of suspend failure, system should not crash. > > The fix is to check cpufreq_suspended first, if it's false, that means > cpufreq_suspend was not called in the first place, so do not resume > cpufreq. > > Signed-off-by: Bo Yan > --- > drivers/cpufreq/cpufreq.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > index 41d148af7748..95b1c4afe14e 100644 > --- a/drivers/cpufreq/cpufreq.c > +++ b/drivers/cpufreq/cpufreq.c > @@ -1680,6 +1680,10 @@ void cpufreq_resume(void) > if (!cpufreq_driver) > return; > > + if (unlikely(!cpufreq_suspended)) { > + pr_warn("%s: resume after failing suspend\n", __func__); > + return; > + } > cpufreq_suspended = false; > > if (!has_target() && !cpufreq_driver->resume) > Good catch, but rather than doing this it would be better to avoid calling cpufreq_resume() at all if cpufreq_suspend() has not been called. Thanks, Rafael