From patchwork Tue Jun 14 11:06:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12880927 X-Patchwork-Delegate: cw00.choi@samsung.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4C224C43334 for ; Tue, 14 Jun 2022 11:07:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1355812AbiFNLH0 (ORCPT ); Tue, 14 Jun 2022 07:07:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58076 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241869AbiFNLHZ (ORCPT ); Tue, 14 Jun 2022 07:07:25 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 352391C2; Tue, 14 Jun 2022 04:07:23 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id y19so16439614ejq.6; Tue, 14 Jun 2022 04:07:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1nFYikEZQyy7dcuLpIYSHTQjryLYDTf8L+QZXU1RkIA=; b=QS+9nJAugz9WPCBTtO6v5P2CE7DxfNzf6c8HFpXvyccj0UpFO/HlaYRL01gRyCJwSm krROrCcBtCRH1ET0pgUE3o8iOzVLxRu7Ag1kPO/Nz5YnsUbUElUA6D4SAs8AFiJS152X NtcHZD1gh9C5OApmH9ufLKOx4j+Z0BIBtgYjV8pF1wle2qpodY6todKJWAox1jbGZMDc 1mS5KL+5snp0NQLbCW2r2QE8IlVeYPJaZjW1ERGFUvLYtkL27mfnRyrLup3nkd0mt+wt LwqNgRpp2R0IhqPYFLzY9qzty+KljSd8m7AfkiMLLuayX0jtnP7Ajkt+q3swucU2jMlT SWtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1nFYikEZQyy7dcuLpIYSHTQjryLYDTf8L+QZXU1RkIA=; b=GcL1h5imv3wYrKMolpJE38Fi7cdXKbwON9uKJcZC83EM3+XczZpa+fHxmqhRYMuKFS wdNJ78PjGzIr8mRHaCUKnO55g3r+SGfsEmlu3xQvxdD+r7zGI7QDka9UQ7fz7POoMUhk spC8kxcosAE9D+GqUuDkBWdPfGX+UVi+eusvdNSA4M9hzaX4uAj+1SkMSvl3BFSx/hpW BVKI4j+DMWN52KJPmjD+eVzvNU8Z7MAFEYS92pmosXng5/xJ0ief5DpkyVz099vNJ1Cd W9xAcaT3VnyL1cA0UdZ/loMwAJg+hQZWHZ8jqsk+p/sR1qOf1Yh1AHpnxWHGo5CW0RH9 bSzQ== X-Gm-Message-State: AOAM530VoONla89ARzuleeu7AgULBBee77Bz1k6ay4QCIkbdMD+Vkryo PSvs5U+aSPDeAVkO4IkwoY0= X-Google-Smtp-Source: ABdhPJzhBZAqXGSKoy4zcGJmq9W2gGQRovFlV7OvqS6GK/RC/Izv4TSuHzZiMmJRTLN7tbg+0Ouhkw== X-Received: by 2002:a17:906:fb0f:b0:715:7e23:bbbc with SMTP id lz15-20020a170906fb0f00b007157e23bbbcmr3762937ejb.373.1655204841530; Tue, 14 Jun 2022 04:07:21 -0700 (PDT) Received: from localhost.localdomain (93-42-70-190.ip85.fastwebnet.it. [93.42.70.190]) by smtp.googlemail.com with ESMTPSA id cb2-20020a0564020b6200b00433b5f22864sm6867456edb.20.2022.06.14.04.07.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 04:07:21 -0700 (PDT) From: Christian 'Ansuel' Marangi To: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Sibi Sankar , Saravana Kannan , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Christian 'Ansuel' Marangi Subject: [PATCH v3 1/5] PM / devfreq: Fix cpufreq passive unregister erroring on PROBE_DEFER Date: Tue, 14 Jun 2022 13:06:57 +0200 Message-Id: <20220614110701.31240-2-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220614110701.31240-1-ansuelsmth@gmail.com> References: <20220614110701.31240-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org With the passive governor, the cpu based scaling can PROBE_DEFER due to the fact that CPU policy are not ready. The cpufreq passive unregister notifier is called both from the GOV_START errors and for the GOV_STOP and assume the notifier is successfully registred every time. With GOV_START failing it's wrong to loop over each possible CPU since the register path has failed for some CPU policy not ready. Change the logic and unregister the notifer based on the current allocated parent_cpu_data list to correctly handle errors and the governor unregister path. Fixes: a03dacb0316f ("PM / devfreq: Add cpu based scaling support to passive governor") Signed-off-by: Christian 'Ansuel' Marangi --- drivers/devfreq/governor_passive.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c index 72c67979ebe1..0188c32f5198 100644 --- a/drivers/devfreq/governor_passive.c +++ b/drivers/devfreq/governor_passive.c @@ -222,8 +222,8 @@ static int cpufreq_passive_unregister_notifier(struct devfreq *devfreq) { struct devfreq_passive_data *p_data = (struct devfreq_passive_data *)devfreq->data; - struct devfreq_cpu_data *parent_cpu_data; - int cpu, ret = 0; + struct devfreq_cpu_data *parent_cpu_data, *tmp; + int ret; if (p_data->nb.notifier_call) { ret = cpufreq_unregister_notifier(&p_data->nb, @@ -232,27 +232,16 @@ static int cpufreq_passive_unregister_notifier(struct devfreq *devfreq) return ret; } - for_each_possible_cpu(cpu) { - struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); - if (!policy) { - ret = -EINVAL; - continue; - } - - parent_cpu_data = get_parent_cpu_data(p_data, policy); - if (!parent_cpu_data) { - cpufreq_cpu_put(policy); - continue; - } - + list_for_each_entry_safe(parent_cpu_data, tmp, &p_data->cpu_data_list, node) { list_del(&parent_cpu_data->node); + if (parent_cpu_data->opp_table) dev_pm_opp_put_opp_table(parent_cpu_data->opp_table); + kfree(parent_cpu_data); - cpufreq_cpu_put(policy); } - return ret; + return 0; } static int cpufreq_passive_register_notifier(struct devfreq *devfreq) From patchwork Tue Jun 14 11:06:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12880928 X-Patchwork-Delegate: cw00.choi@samsung.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1783BCCA47A for ; Tue, 14 Jun 2022 11:07:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356021AbiFNLH1 (ORCPT ); Tue, 14 Jun 2022 07:07:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58082 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1354637AbiFNLHZ (ORCPT ); Tue, 14 Jun 2022 07:07:25 -0400 Received: from mail-ed1-x534.google.com (mail-ed1-x534.google.com [IPv6:2a00:1450:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 457CF1DD; Tue, 14 Jun 2022 04:07:24 -0700 (PDT) Received: by mail-ed1-x534.google.com with SMTP id 25so11065796edw.8; Tue, 14 Jun 2022 04:07:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2VpymEQ2SM4sdFNjN8CXfMk2cob9z6e+G7rfp2XXs6Y=; b=g80KvKkijMyNFribSNfDp/tQz40YkJoztJe2wI3n8bEln512a8vq3onke9yY0WShbP PhXkoeXhiBeQlY6kQ/HZCunsBvi3vAFScpzfrSkQzIw7u1afCQqei1RywDwzyEZkz9gi B3cDLtPC6zzUf7fuJkWcnBIpSqafmXBdiFrtVhiSkaA/zCmEq/AWiNGN9Pw89e0sBRR+ jHS/alOGQHkDw6hTxRhNz9w6Wcf7GxwE66kBxtvxewV4k2T2Cq7DGKfvb4vTCfN711ez RrQXZ5jjFMru5m2LAFaCNqHn2WJPFSSfIpjU9Z3ZvLysIQD1Oxc6YI10tsQCnqU63lxy U1rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2VpymEQ2SM4sdFNjN8CXfMk2cob9z6e+G7rfp2XXs6Y=; b=HqzSN9zuVMm/KFYpqCxLDLPOgLLWHC+IXcFhGwIi3uTMOMf3DkoTtS4amwm8m0Zgyl a4luuy1JAHJ7vENyzRLejnsf3fJE/u2RD6p+GXdn0yS8fr7YM+lsiRWZRIlwu2ZP32e5 zudqIjI09bwQvLPNtX6y8V3vAvyr4uXqD4KIUGnw2oeGZ5XtmeUULZVEH51YgoPaRc6K 6unRM+oavI1S98ne3oXXzAPMBExUq+luRxHnX2LLrspi0VbYTmQx9jf6Ue1f38jLFIxF Rw8LDhre8DiuPxbKNFfJ4FsMzQs8ArrmXjmXEf30vvTk9wC8gbJ51vjDGKuJ6IcwAkMg Uj9A== X-Gm-Message-State: AOAM530PTdjvEo2JhTlZhoc020pc8MAQGhEaoctK1du6iX1XZDKfq1sH hqZnyUxU00XJOmmwPejGTwQ= X-Google-Smtp-Source: ABdhPJxsT+N/LKmek9PUQmIhbgUYTJBYSR+4rnrZPzzWsTxxbw2G2mwupPxhF4Xg1v0lIweCY5q0zA== X-Received: by 2002:a05:6402:908:b0:434:f9d9:3b18 with SMTP id g8-20020a056402090800b00434f9d93b18mr5351491edz.37.1655204842728; Tue, 14 Jun 2022 04:07:22 -0700 (PDT) Received: from localhost.localdomain (93-42-70-190.ip85.fastwebnet.it. [93.42.70.190]) by smtp.googlemail.com with ESMTPSA id cb2-20020a0564020b6200b00433b5f22864sm6867456edb.20.2022.06.14.04.07.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 04:07:22 -0700 (PDT) From: Christian 'Ansuel' Marangi To: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Sibi Sankar , Saravana Kannan , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Christian 'Ansuel' Marangi Subject: [PATCH v3 2/5] PM / devfreq: Fix kernel warning with cpufreq passive register fail Date: Tue, 14 Jun 2022 13:06:58 +0200 Message-Id: <20220614110701.31240-3-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220614110701.31240-1-ansuelsmth@gmail.com> References: <20220614110701.31240-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org When the cpufreq passive register path from the passive governor fails, the cpufreq_passive_unregister is called and a kernel WARNING is always reported. This is caused by the fact that the devfreq driver already call the governor unregister with the GOV_STOP, for this reason the second cpufreq_passive_unregister always return error and a WARN is printed from the WARN_ON function. Remove the unregister call from the error handling of the cpufreq register notifier as it's fundamentally wrong and already handled by the devfreq core code. Fixes: a03dacb0316f ("PM / devfreq: Add cpu based scaling support to passive governor") Signed-off-by: Christian 'Ansuel' Marangi --- drivers/devfreq/governor_passive.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c index 0188c32f5198..3c3322adea03 100644 --- a/drivers/devfreq/governor_passive.c +++ b/drivers/devfreq/governor_passive.c @@ -325,7 +325,6 @@ static int cpufreq_passive_register_notifier(struct devfreq *devfreq) err_put_policy: cpufreq_cpu_put(policy); err: - WARN_ON(cpufreq_passive_unregister_notifier(devfreq)); return ret; } From patchwork Tue Jun 14 11:06:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12880929 X-Patchwork-Delegate: cw00.choi@samsung.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 889FDC433EF for ; Tue, 14 Jun 2022 11:07:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356110AbiFNLH2 (ORCPT ); Tue, 14 Jun 2022 07:07:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58148 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356034AbiFNLH1 (ORCPT ); Tue, 14 Jun 2022 07:07:27 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F49CB96; Tue, 14 Jun 2022 04:07:25 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id u12so16413067eja.8; Tue, 14 Jun 2022 04:07:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TQRKcneckEoQfUsqmL/gDuP5mWDW/X0t3xQBfS3Jwuo=; b=kLGoYYcwIJ6dy51CeEEDy8kuyJs/x+mXeTbeBBcigCk4pJ4loGmskQ2xP1f2ONBfye wRKi0C6TScDpNEXIuRFNvYCRlWfPBWmA+spZXr/h/vNRAAzf9IDJs6f9CIQJ3hcE65Jr IUJFT4NfwQ4wAEcLEhuPIAEyQQw08rTMn6HidDUirxEmFs6kyFIC9KzsEoGqMiCu47mw 7BcPS+t2f5jDNYCn3VLXbjztNBru6Q6Y0jnut68IptCKvUgDitrAcWNHA1aMAcU71qYT glL8NwhWp8jKkrKr8psUW3onOiilQqp9EeeDRTgYd6kKgQgNDky6P3EeqlLI8KetXqsz u6kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TQRKcneckEoQfUsqmL/gDuP5mWDW/X0t3xQBfS3Jwuo=; b=W8Ki+Ck9o0hUD6q+/dlwTx54VQCEGsQ4J/1ASUpDjeuq5lqcxSNipqyskg9GcD8wrC 5+cGdHP4bQed+uiOhOfoXWSbJKmiy/96WHcuNdtJAXe0uFgeZoE8DUzmxzQ/wwnaubLr NW56ki21DTKqoL5o0WybByAYveF/c655gP9xCChai/BLob3rP1xv6witT+ZiPnuuo/po QrDH1/eOzLNuXuoz2kkA60VJIE8OR/0UngrrcZEryFJ1f4gcKNl+W1arTkmza3hEpxnH ik6t1jf5DdlAcQWTGWiSK3jR2xgoSUA2DbydWd//5LGPbInaAjKG7yAMEkBVltD51oZI ms6A== X-Gm-Message-State: AOAM532/FkgZNqcan5lrUJ0RgItxqTnfCqu1KwHKmuxPdaZGU8c/mnYX f5DcAaKYZiMO82/mrfN8Fwo= X-Google-Smtp-Source: ABdhPJztbuXyv1YfbeZOKjCqoXuR2KgLu6Mte9TpLLqB9kpU8+xb6nsz8Nu7M7RYMAu7rQlpAA3Wng== X-Received: by 2002:a17:907:7f2a:b0:711:dbde:19a1 with SMTP id qf42-20020a1709077f2a00b00711dbde19a1mr3736907ejc.87.1655204843822; Tue, 14 Jun 2022 04:07:23 -0700 (PDT) Received: from localhost.localdomain (93-42-70-190.ip85.fastwebnet.it. [93.42.70.190]) by smtp.googlemail.com with ESMTPSA id cb2-20020a0564020b6200b00433b5f22864sm6867456edb.20.2022.06.14.04.07.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 04:07:23 -0700 (PDT) From: Christian 'Ansuel' Marangi To: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Sibi Sankar , Saravana Kannan , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Christian 'Ansuel' Marangi Subject: [PATCH v3 3/5] PM / devfreq: Fix kernel panic with cpu based scaling to passive gov Date: Tue, 14 Jun 2022 13:06:59 +0200 Message-Id: <20220614110701.31240-4-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220614110701.31240-1-ansuelsmth@gmail.com> References: <20220614110701.31240-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org The cpufreq passive register notifier can PROBE_DEFER and the devfreq struct is freed and then reallocaed on probe retry. The current logic assume that the code can't PROBE_DEFER so the devfreq struct in the this variable in devfreq_passive_data is assumed to be (if already set) always correct. This cause kernel panic as the code try to access the wrong address. To correctly handle this, update the this variable in devfreq_passive_data to the devfreq reallocated struct. Fixes: a03dacb0316f ("PM / devfreq: Add cpu based scaling support to passive governor") Signed-off-by: Christian 'Ansuel' Marangi --- drivers/devfreq/governor_passive.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c index 3c3322adea03..be8aa6830413 100644 --- a/drivers/devfreq/governor_passive.c +++ b/drivers/devfreq/governor_passive.c @@ -395,8 +395,7 @@ static int devfreq_passive_event_handler(struct devfreq *devfreq, if (!p_data) return -EINVAL; - if (!p_data->this) - p_data->this = devfreq; + p_data->this = devfreq; switch (event) { case DEVFREQ_GOV_START: From patchwork Tue Jun 14 11:07:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12880930 X-Patchwork-Delegate: cw00.choi@samsung.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id ADB48C43334 for ; Tue, 14 Jun 2022 11:07:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356123AbiFNLH2 (ORCPT ); Tue, 14 Jun 2022 07:07:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58212 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356047AbiFNLH1 (ORCPT ); Tue, 14 Jun 2022 07:07:27 -0400 Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 66A981DD; Tue, 14 Jun 2022 04:07:26 -0700 (PDT) Received: by mail-ej1-x633.google.com with SMTP id m20so16400760ejj.10; Tue, 14 Jun 2022 04:07:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rqB+OoXjgNk851kkUlzbVA9H8QBK9O7nKndldIMVx7w=; b=dbvaXKsDEZhbl3v2nCrc1LVI+/Hqk3iNuDviXzfox9fP9Et+oFhGqbLKQ+CyAeyDIM 6/dzKf3auTFsSo1M8V7+ZHvu7vlOdiTHHf+iwfJVdolQZk8VhZDJbCOLELtfeU86AEDK GPu0GFP+dc9NfXnRVfGRAjj3PfnS1LadcN3/gDz3IrTaIYM77zUeNfF8CAHAOkQTNeAA kbFthnxf9G/vwZTkVWZKW2l3XLCAlhab4deih9k0cYidlerUbNPfOpffCl7YGIK/xA07 LOUmiHpzSQhSOL6cyo/5zxnIWqXjLI85rasV8KnAozW0uUkVvtDQX2UdsTTA8PFljPgD TVeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rqB+OoXjgNk851kkUlzbVA9H8QBK9O7nKndldIMVx7w=; b=fp2jNuq97vazAL9SbYUAaKRFptCPi7rrahwVrXSDFnwG1WwirHUneY0zqSccIWHcRq Mi+FNJWLEclEbIGq99lKj0WpinzA4uH859cRHsnrQdPs37YOtElF93VW2cTJOm9LoeU1 Xpjmko54dHF4aSb6YNf97kKXQ/NkbOd79YluXotizzDMRfyPUOJBUKpC/SWYe6xx42xm XZXrhA1h3qvEBEQ9TmcUDD70/SX5pHRMYQ68pyGSodWLd5+asnoqqyUvmaN/v59MSbPm ZqIzV3iyO6yWY3YhjYRKG9KD8tvgpYTx6LX7jTsHaWpXJ8MqHNTv03YJpb3VYFFfb1sh YRJA== X-Gm-Message-State: AJIora/Lk2FyiOIMZ3nnaX9sMwQXJfMGm6gDnF8gwM4sBSS+UZUBJhHI MilnuMIIlk3KjjL0G8mEhWdFPH5ajpE= X-Google-Smtp-Source: ABdhPJxRv0mrkAyo3i9Z954BoLu69hieVHAZlFrabPmh+3xhiyquKh/oxTvfIiiiszHI1wHRw7Thlg== X-Received: by 2002:a17:906:7a47:b0:713:a267:5962 with SMTP id i7-20020a1709067a4700b00713a2675962mr3825854ejo.585.1655204844860; Tue, 14 Jun 2022 04:07:24 -0700 (PDT) Received: from localhost.localdomain (93-42-70-190.ip85.fastwebnet.it. [93.42.70.190]) by smtp.googlemail.com with ESMTPSA id cb2-20020a0564020b6200b00433b5f22864sm6867456edb.20.2022.06.14.04.07.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 04:07:24 -0700 (PDT) From: Christian 'Ansuel' Marangi To: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Sibi Sankar , Saravana Kannan , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Christian 'Ansuel' Marangi Subject: [PATCH v3 4/5] PM / devfreq: Rework freq_table to be local to devfreq struct Date: Tue, 14 Jun 2022 13:07:00 +0200 Message-Id: <20220614110701.31240-5-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220614110701.31240-1-ansuelsmth@gmail.com> References: <20220614110701.31240-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Currently we reference the freq_table to the profile defined one and we make changes on it. Devfreq never supported PROBE_DEFER before the cpu based scaling support to the passive governor and assumed that a devfreq device could only had error and be done with it. Now that a device can PROBE_DEFER a rework to the freq_table logic is required. If a device PROBE_DEFER on the GOV_START, the freq_table is already set in the device profile struct and its init is skipped. This is due to the fact that it's common for devs to declare this kind of struct static. This cause the devfreq logic to find a freq table declared (freq_table not NULL) with random data and poiting to the old addrs freed by devm. This problem CAN be solved by devs by clearing the freq_table in their profile struct on driver exit path but it should not be trusted and it looks to use a flawed logic. A better solution is to move the freq_table and max_state to the devfreq struct and never change the profile struct. This permit to correctly handle PROBE_DEFER since the devfreq struct is reallocated and contains new values. Also the profile struct should only be used to init the driver and should not be used by the devfreq to write the freq_table if it's not provided by the driver. Fixes: a03dacb0316f ("PM / devfreq: Add cpu based scaling support to passive governor") Signed-off-by: Christian 'Ansuel' Marangi --- drivers/devfreq/devfreq.c | 71 ++++++++++++++---------------- drivers/devfreq/governor_passive.c | 14 +++--- include/linux/devfreq.h | 4 ++ 3 files changed, 45 insertions(+), 44 deletions(-) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 01474daf4548..2e2b3b414d67 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -123,7 +123,7 @@ void devfreq_get_freq_range(struct devfreq *devfreq, unsigned long *min_freq, unsigned long *max_freq) { - unsigned long *freq_table = devfreq->profile->freq_table; + unsigned long *freq_table = devfreq->freq_table; s32 qos_min_freq, qos_max_freq; lockdep_assert_held(&devfreq->lock); @@ -133,11 +133,11 @@ void devfreq_get_freq_range(struct devfreq *devfreq, * The devfreq drivers can initialize this in either ascending or * descending order and devfreq core supports both. */ - if (freq_table[0] < freq_table[devfreq->profile->max_state - 1]) { + if (freq_table[0] < freq_table[devfreq->max_state - 1]) { *min_freq = freq_table[0]; - *max_freq = freq_table[devfreq->profile->max_state - 1]; + *max_freq = freq_table[devfreq->max_state - 1]; } else { - *min_freq = freq_table[devfreq->profile->max_state - 1]; + *min_freq = freq_table[devfreq->max_state - 1]; *max_freq = freq_table[0]; } @@ -169,8 +169,8 @@ static int devfreq_get_freq_level(struct devfreq *devfreq, unsigned long freq) { int lev; - for (lev = 0; lev < devfreq->profile->max_state; lev++) - if (freq == devfreq->profile->freq_table[lev]) + for (lev = 0; lev < devfreq->max_state; lev++) + if (freq == devfreq->freq_table[lev]) return lev; return -EINVAL; @@ -178,7 +178,6 @@ static int devfreq_get_freq_level(struct devfreq *devfreq, unsigned long freq) static int set_freq_table(struct devfreq *devfreq) { - struct devfreq_dev_profile *profile = devfreq->profile; struct dev_pm_opp *opp; unsigned long freq; int i, count; @@ -188,25 +187,22 @@ static int set_freq_table(struct devfreq *devfreq) if (count <= 0) return -EINVAL; - profile->max_state = count; - profile->freq_table = devm_kcalloc(devfreq->dev.parent, - profile->max_state, - sizeof(*profile->freq_table), - GFP_KERNEL); - if (!profile->freq_table) { - profile->max_state = 0; + devfreq->max_state = count; + devfreq->freq_table = devm_kcalloc(devfreq->dev.parent, + devfreq->max_state, + sizeof(*devfreq->freq_table), + GFP_KERNEL); + if (!devfreq->freq_table) return -ENOMEM; - } - for (i = 0, freq = 0; i < profile->max_state; i++, freq++) { + for (i = 0, freq = 0; i < devfreq->max_state; i++, freq++) { opp = dev_pm_opp_find_freq_ceil(devfreq->dev.parent, &freq); if (IS_ERR(opp)) { - devm_kfree(devfreq->dev.parent, profile->freq_table); - profile->max_state = 0; + devm_kfree(devfreq->dev.parent, devfreq->freq_table); return PTR_ERR(opp); } dev_pm_opp_put(opp); - profile->freq_table[i] = freq; + devfreq->freq_table[i] = freq; } return 0; @@ -246,7 +242,7 @@ int devfreq_update_status(struct devfreq *devfreq, unsigned long freq) if (lev != prev_lev) { devfreq->stats.trans_table[ - (prev_lev * devfreq->profile->max_state) + lev]++; + (prev_lev * devfreq->max_state) + lev]++; devfreq->stats.total_trans++; } @@ -835,6 +831,9 @@ struct devfreq *devfreq_add_device(struct device *dev, if (err < 0) goto err_dev; mutex_lock(&devfreq->lock); + } else { + devfreq->freq_table = devfreq->profile->freq_table; + devfreq->max_state = devfreq->profile->max_state; } devfreq->scaling_min_freq = find_available_min_freq(devfreq); @@ -870,8 +869,8 @@ struct devfreq *devfreq_add_device(struct device *dev, devfreq->stats.trans_table = devm_kzalloc(&devfreq->dev, array3_size(sizeof(unsigned int), - devfreq->profile->max_state, - devfreq->profile->max_state), + devfreq->max_state, + devfreq->max_state), GFP_KERNEL); if (!devfreq->stats.trans_table) { mutex_unlock(&devfreq->lock); @@ -880,7 +879,7 @@ struct devfreq *devfreq_add_device(struct device *dev, } devfreq->stats.time_in_state = devm_kcalloc(&devfreq->dev, - devfreq->profile->max_state, + devfreq->max_state, sizeof(*devfreq->stats.time_in_state), GFP_KERNEL); if (!devfreq->stats.time_in_state) { @@ -1665,9 +1664,9 @@ static ssize_t available_frequencies_show(struct device *d, mutex_lock(&df->lock); - for (i = 0; i < df->profile->max_state; i++) + for (i = 0; i < df->max_state; i++) count += scnprintf(&buf[count], (PAGE_SIZE - count - 2), - "%lu ", df->profile->freq_table[i]); + "%lu ", df->freq_table[i]); mutex_unlock(&df->lock); /* Truncate the trailing space */ @@ -1690,7 +1689,7 @@ static ssize_t trans_stat_show(struct device *dev, if (!df->profile) return -EINVAL; - max_state = df->profile->max_state; + max_state = df->max_state; if (max_state == 0) return sprintf(buf, "Not Supported.\n"); @@ -1707,19 +1706,17 @@ static ssize_t trans_stat_show(struct device *dev, len += sprintf(buf + len, " :"); for (i = 0; i < max_state; i++) len += sprintf(buf + len, "%10lu", - df->profile->freq_table[i]); + df->freq_table[i]); len += sprintf(buf + len, " time(ms)\n"); for (i = 0; i < max_state; i++) { - if (df->profile->freq_table[i] - == df->previous_freq) { + if (df->freq_table[i] == df->previous_freq) len += sprintf(buf + len, "*"); - } else { + else len += sprintf(buf + len, " "); - } - len += sprintf(buf + len, "%10lu:", - df->profile->freq_table[i]); + + len += sprintf(buf + len, "%10lu:", df->freq_table[i]); for (j = 0; j < max_state; j++) len += sprintf(buf + len, "%10u", df->stats.trans_table[(i * max_state) + j]); @@ -1743,7 +1740,7 @@ static ssize_t trans_stat_store(struct device *dev, if (!df->profile) return -EINVAL; - if (df->profile->max_state == 0) + if (df->max_state == 0) return count; err = kstrtoint(buf, 10, &value); @@ -1751,11 +1748,11 @@ static ssize_t trans_stat_store(struct device *dev, return -EINVAL; mutex_lock(&df->lock); - memset(df->stats.time_in_state, 0, (df->profile->max_state * + memset(df->stats.time_in_state, 0, (df->max_state * sizeof(*df->stats.time_in_state))); memset(df->stats.trans_table, 0, array3_size(sizeof(unsigned int), - df->profile->max_state, - df->profile->max_state)); + df->max_state, + df->max_state)); df->stats.total_trans = 0; df->stats.last_update = get_jiffies_64(); mutex_unlock(&df->lock); diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c index be8aa6830413..4ae880e171bc 100644 --- a/drivers/devfreq/governor_passive.c +++ b/drivers/devfreq/governor_passive.c @@ -131,18 +131,18 @@ static int get_target_freq_with_devfreq(struct devfreq *devfreq, goto out; /* Use interpolation if required opps is not available */ - for (i = 0; i < parent_devfreq->profile->max_state; i++) - if (parent_devfreq->profile->freq_table[i] == *freq) + for (i = 0; i < parent_devfreq->max_state; i++) + if (parent_devfreq->freq_table[i] == *freq) break; - if (i == parent_devfreq->profile->max_state) + if (i == parent_devfreq->max_state) return -EINVAL; - if (i < devfreq->profile->max_state) { - child_freq = devfreq->profile->freq_table[i]; + if (i < devfreq->max_state) { + child_freq = devfreq->freq_table[i]; } else { - count = devfreq->profile->max_state; - child_freq = devfreq->profile->freq_table[count - 1]; + count = devfreq->max_state; + child_freq = devfreq->freq_table[count - 1]; } out: diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index dc10bee75a72..770a7532655c 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -185,6 +185,10 @@ struct devfreq { struct notifier_block nb; struct delayed_work work; + /* devfreq local freq_table */ + unsigned long *freq_table; + unsigned int max_state; + unsigned long previous_freq; struct devfreq_dev_status last_status; From patchwork Tue Jun 14 11:07:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12880931 X-Patchwork-Delegate: cw00.choi@samsung.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 815CBC433EF for ; Tue, 14 Jun 2022 11:07:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241869AbiFNLHc (ORCPT ); Tue, 14 Jun 2022 07:07:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356147AbiFNLHa (ORCPT ); Tue, 14 Jun 2022 07:07:30 -0400 Received: from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com [IPv6:2a00:1450:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0E6DBEB7; Tue, 14 Jun 2022 04:07:27 -0700 (PDT) Received: by mail-ej1-x62d.google.com with SMTP id m20so16400893ejj.10; Tue, 14 Jun 2022 04:07:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wyraSSKv1jqCeF4xZjEyVevZ1Z/RuxxufoUeosKgARw=; b=B02DeuPO+BZECqpvp/HqctH5+yuZhfdhDrn4GY1DbZ1slBnwpFZFJI7APngu8tHNIm IKOiauuMDwdK69gedR8dslBR/BKsp0swY2J45WBTHgyHy+PcBlb3+GetSipQBZldnru/ N1PxRO3KhPGcDJGv2fTqrlKnyQ5N3JkltnBARkms4JjPrkHZx7aQ7BUAksbPTssIhFsQ o45dJqMUI2KjWNriW47ltltFr8lAYgpX8Ws6AiqXgoCMnUpddzc1ugJx6pDgJQsL6E44 dUiNfkyWXv2m+TjNOazTDH4sWLAlG6+Pes4n7gy9YjEEdg22AojGOhG/A3OhtF+fK4J+ Kf0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wyraSSKv1jqCeF4xZjEyVevZ1Z/RuxxufoUeosKgARw=; b=efzsyZ9j33r42vtStk5oFm28GsIniLT8EJzvEnkvXIVsdsbt/tekYxbUKN6SsZEiYZ kNfOYF/IC3sGLeR3awfpn9M1qIxzI+fI2kWE1N+j6Z01VEUb3zI+GpywxAugtZ1nkqUQ i74XLBBiSMHrP/TSGxhmPnbTY95ODTFiYj7QSg3netTF3NJ6jOOZNShrgbtKHtXyF6O3 ANRxBTjc3pRG2shhjBLTqeeXPZmSU3QrwxucAEgRmRuamnGXN44KGlwByb9yIToDJ2vY ujZPdj8a9qurEZsShgGE6uFUYqiNUWL5gUW/lQiXvyX78z08/3I9RXgz8tgcf81vG7kG uDJQ== X-Gm-Message-State: AOAM532sUo9uzFiOTCQBlppgEICwdUj8qzYu1PGw3atKypYerFg/W/sz 4IkfVMvtlYTTGVhr7zGvhEM= X-Google-Smtp-Source: AGRyM1ugMGU1GzBQZaCq6t82MbN9CwgPTCVr+506Anu6EgxBOpCVd7X6Nc3zIURwowiLXvicDNoUyQ== X-Received: by 2002:a17:906:8416:b0:705:6a1b:e8ef with SMTP id n22-20020a170906841600b007056a1be8efmr3648558ejx.614.1655204846265; Tue, 14 Jun 2022 04:07:26 -0700 (PDT) Received: from localhost.localdomain (93-42-70-190.ip85.fastwebnet.it. [93.42.70.190]) by smtp.googlemail.com with ESMTPSA id cb2-20020a0564020b6200b00433b5f22864sm6867456edb.20.2022.06.14.04.07.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 04:07:25 -0700 (PDT) From: Christian 'Ansuel' Marangi To: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Sibi Sankar , Saravana Kannan , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Christian 'Ansuel' Marangi Subject: [PATCH v3 5/5] PM / devfreq: Mute warning on governor PROBE_DEFER Date: Tue, 14 Jun 2022 13:07:01 +0200 Message-Id: <20220614110701.31240-6-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220614110701.31240-1-ansuelsmth@gmail.com> References: <20220614110701.31240-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Don't print warning when a governor PROBE_DEFER as it's not a real GOV_START fail. Fixes: a03dacb0316f ("PM / devfreq: Add cpu based scaling support to passive governor") Signed-off-by: Christian 'Ansuel' Marangi --- drivers/devfreq/devfreq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 2e2b3b414d67..df6972bb0ce8 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -931,8 +931,8 @@ struct devfreq *devfreq_add_device(struct device *dev, err = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_START, NULL); if (err) { - dev_err(dev, "%s: Unable to start governor for the device\n", - __func__); + dev_err_probe(dev, -EPROBE_DEFER, "%s: Unable to start governor for the device\n", + __func__); goto err_init; } create_sysfs_files(devfreq, devfreq->governor);