From patchwork Wed Mar 9 22:39:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 550256 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 DA2F4C433FE for ; Wed, 9 Mar 2022 22:39:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238789AbiCIWkx (ORCPT ); Wed, 9 Mar 2022 17:40:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233941AbiCIWkx (ORCPT ); Wed, 9 Mar 2022 17:40:53 -0500 Received: from mail-lf1-x12b.google.com (mail-lf1-x12b.google.com [IPv6:2a00:1450:4864:20::12b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0CF95121503 for ; Wed, 9 Mar 2022 14:39:53 -0800 (PST) Received: by mail-lf1-x12b.google.com with SMTP id s25so6289935lfs.10 for ; Wed, 09 Mar 2022 14:39:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=soWKcqKpCVRBynURRotS1gzCb/Cc5Zuwi5TpQP3/+YY=; b=nAHZOAvhvsOkFTRcc8CDRqLyHOCiyOM7lSEvnltXotHrdt4R4+nGsG+cfw5ahZxODy 1gzbtYVM+IGCobQQTYwQm6zmBQA536wJTdugCWLgXxzpXyZOJpak1VrOcJXOK9AuHLkN 9y7cMN1w4TtqHjQ+Pq7920CaxJlnRiij1r7+9HFrbxvGrj801xwOugolabb5XO51vdzx uv0w+ZlNZwOFFcn893vDPYFzcyNbRZ0jVA97WUZnOvw58/dKcH/fXTvONNNZSZlymptN 2qybJ0b2Upbk51bXiXV+YG8UItC0XdKoub+BpBcoursp+C6xGpr/HxWUC6iVOLncti1c dHtQ== 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=soWKcqKpCVRBynURRotS1gzCb/Cc5Zuwi5TpQP3/+YY=; b=XkYH17cej/n9PH6bcGRSVWiVY8FbVqXp0WS0We7KdkbbPDwMuktb2QFhN6upwBJh+y uhim8CIjUqatBnK2/QQ6HaOJQ6rzXjnGcppEXjW4KvlmbKzg3vOI75UbtsbQ2UnEZuXo iJlnhM4o9MIYian8sGizDsuJr0poNJftX7C7HoYsEayrRN1ODTU5bqCFZDdWYoEzSbXk ENctu5XgheozrR3sTk6aYpmwL6VNYeLLuOxniZVEKep+IMRVHIPPikz0mHRU70hWqUoW y0IQHGZ9pV0jwmJDIUs4O34tgbSgZsIbMDFVDJCmU2aoJNqbSAoR0XQW/maKiPMH7x6n EE8w== X-Gm-Message-State: AOAM532Mj8A3uCJv20pYD2OFxVhQyFgOZ+kQ/CNTCOoU+xpPzYmM4dSf rm1EfzrBWTyWd5N/A1M2+Sd+jw== X-Google-Smtp-Source: ABdhPJykeVFKtAdF5RQ8I2WfOOkNWg8NsUOWFKa2u8g4LToyYksEZkKdZAKQ82dPcccFepg6STgP3g== X-Received: by 2002:a05:6512:1319:b0:448:429d:c6f4 with SMTP id x25-20020a056512131900b00448429dc6f4mr1189751lfu.472.1646865591430; Wed, 09 Mar 2022 14:39:51 -0800 (PST) Received: from eriador.lan ([37.153.55.125]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b004483734e0afsm621036lfj.12.2022.03.09.14.39.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Mar 2022 14:39:50 -0800 (PST) From: Dmitry Baryshkov To: Andy Gross , Bjorn Andersson , "Rafael J. Wysocki" , Viresh Kumar Cc: linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, Thara Gopinath Subject: [PATCH v2 1/4] cpufreq: qcom-hw: drop affinity hint before freeing the IRQ Date: Thu, 10 Mar 2022 01:39:35 +0300 Message-Id: <20220309223938.3819715-2-dmitry.baryshkov@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> References: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Drop affinity hint before freeing the throttling IRQ to fix the following trace. One is not allowed to call free_irq() with an affinity hint in place (which was set by qcom_cpufreq_hw_lmh_init()). [ 185.114773] ------------[ cut here ]------------ [ 185.119517] WARNING: CPU: 7 PID: 43 at kernel/irq/manage.c:1887 free_irq+0x3a4/0x3dc [ 185.127474] Modules linked in: [ 185.130618] CPU: 7 PID: 43 Comm: cpuhp/7 Tainted: G S W 5.17.0-rc6-00386-g67382a5b705d-dirty #690 [ 185.147125] pstate: 604000c5 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 185.154269] pc : free_irq+0x3a4/0x3dc [ 185.158031] lr : free_irq+0x33c/0x3dc [ 185.161792] sp : ffff80000841bc90 [ 185.165195] x29: ffff80000841bc90 x28: ffffa6edc5c3d000 x27: ffff6d93729e5908 [ 185.172515] x26: 0000000000000000 x25: ffff6d910109fc00 x24: ffff6d91011490e0 [ 185.179838] x23: ffff6d9101149218 x22: 0000000000000080 x21: 0000000000000000 [ 185.187163] x20: ffff6d9101149000 x19: ffff6d910ab61500 x18: ffffffffffffffff [ 185.194487] x17: 2e35202020202020 x16: 2020202020202020 x15: ffff80008841b9a7 [ 185.201805] x14: 00000000000003c9 x13: 0000000000000001 x12: 0000000000000040 [ 185.209135] x11: ffff6d91005aab58 x10: ffff6d91005aab5a x9 : ffffc6a5ad1c5408 [ 185.216455] x8 : ffff6d91005adb88 x7 : 0000000000000000 x6 : ffffc6a5ab5a91f4 [ 185.223776] x5 : 0000000000000000 x4 : ffff6d91011490a8 x3 : ffffc6a5ad266108 [ 185.231098] x2 : 0000000013033204 x1 : ffff6d9101149000 x0 : ffff6d910a9cc000 [ 185.238421] Call trace: [ 185.240932] free_irq+0x3a4/0x3dc [ 185.244334] qcom_cpufreq_hw_cpu_exit+0x78/0xcc [ 185.248985] cpufreq_offline.isra.0+0x228/0x270 [ 185.253639] cpuhp_cpufreq_offline+0x10/0x20 [ 185.258027] cpuhp_invoke_callback+0x16c/0x2b0 [ 185.262592] cpuhp_thread_fun+0x190/0x250 [ 185.266710] smpboot_thread_fn+0x12c/0x230 [ 185.270914] kthread+0xfc/0x100 [ 185.274145] ret_from_fork+0x10/0x20 [ 185.277820] irq event stamp: 212 [ 185.281136] hardirqs last enabled at (211): [] _raw_spin_unlock_irqrestore+0x8c/0xa0 [ 185.290775] hardirqs last disabled at (212): [] __schedule+0x710/0xa10 [ 185.299081] softirqs last enabled at (0): [] copy_process+0x7d0/0x1a14 [ 185.307475] softirqs last disabled at (0): [<0000000000000000>] 0x0 Fixes: 275157b367f4 ("cpufreq: qcom-cpufreq-hw: Add dcvs interrupt support") Signed-off-by: Dmitry Baryshkov Tested-by: Vladimir Zapolskiy Reviewed-by: Vladimir Zapolskiy Reviewed-by: Bjorn Andersson --- drivers/cpufreq/qcom-cpufreq-hw.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c index 618e436018c0..44d46e52baea 100644 --- a/drivers/cpufreq/qcom-cpufreq-hw.c +++ b/drivers/cpufreq/qcom-cpufreq-hw.c @@ -427,6 +427,7 @@ static void qcom_cpufreq_hw_lmh_exit(struct qcom_cpufreq_data *data) mutex_unlock(&data->throttle_lock); cancel_delayed_work_sync(&data->throttle_work); + irq_set_affinity_hint(data->throttle_irq, NULL); free_irq(data->throttle_irq, data); } From patchwork Wed Mar 9 22:39:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 549992 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 793D0C43219 for ; Wed, 9 Mar 2022 22:39:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233941AbiCIWky (ORCPT ); Wed, 9 Mar 2022 17:40:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44530 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238788AbiCIWkx (ORCPT ); Wed, 9 Mar 2022 17:40:53 -0500 Received: from mail-lf1-x12f.google.com (mail-lf1-x12f.google.com [IPv6:2a00:1450:4864:20::12f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 360C5120F7A for ; Wed, 9 Mar 2022 14:39:54 -0800 (PST) Received: by mail-lf1-x12f.google.com with SMTP id s25so6289987lfs.10 for ; Wed, 09 Mar 2022 14:39:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=44yRssYFeafrnrQxHUTkeHtzFlOkeHufCCecx4vqxe0=; b=mJb2TdV043zE59lW29WVbQkGmyBOXq23CJ/O7TG5xUKCM2EaPbZsEgqLFbrr5Fps/f uUqCb7TRu0uONqziSxhhwtC3BLCnW+sjItfVqeaA/0UsRPMftLxFoIxKael6xhWS4Wvf gAl1K0S4ePJoDLweG8B29CQHMjYfcJqiuSJ6MIJ9WJpnBXoo+o8QulbcNfAYVf++hwve DqioviuU75CVZqe7TOWIjQqlKyZ8/EaoxM4vLu5rh9k6Fr/cHepy9gEwnGYCB56cGopc vJL6HR0AFLp/n9e56GTtmExtBXd7N0QtbeSUhDGMypLofkNUpDJJlHux9nGX5mg9HIqx biiA== 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=44yRssYFeafrnrQxHUTkeHtzFlOkeHufCCecx4vqxe0=; b=wEwMmnxrNKNSz6AKSqs2MV/I+HB8dCatY60Z39sD2+8Y+tnWxpc0V8C4pbaUcOtOOo lRuoAHx0BbHDZIWS4BDHbkPdHfiJm+yqnsUk78qOwSQ05ycja895FIdXlqDVp0G7lMdA P/CiennjIUHbUtzt5dTCVN1em9JcsDOFWhiMUDrH9PLfPnYZ34EFUWqwGZU1305mKoGq Dw7TOVe5rV4KqbyFNw4ibG1fA+dncv8JEjCWK2/+83hs9aq52/mI4RgOYaD+k8qtYpFO qNgCLioTViYyYWmle/44ZgNH6mO/dgSjLbsqoxUSLnXI5QkUTKaF8uYVVmY9hKaKquyY MyWA== X-Gm-Message-State: AOAM530SSI7KQnzCpktja34ysj2RjiTuqK4IAkSW5yw0dfhOYMCC/kFO Hd5QucU72Bg+nwAiKxobogdseA== X-Google-Smtp-Source: ABdhPJwjaqxD+9Xy5Pz6JrWB9JFEvq3fV3yP5pceLpXOeP5/DER1SLyV6S/v15Ix+r9Sl9HgjTQ2zA== X-Received: by 2002:a05:6512:1689:b0:448:4289:abc1 with SMTP id bu9-20020a056512168900b004484289abc1mr1152926lfb.521.1646865592565; Wed, 09 Mar 2022 14:39:52 -0800 (PST) Received: from eriador.lan ([37.153.55.125]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b004483734e0afsm621036lfj.12.2022.03.09.14.39.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Mar 2022 14:39:51 -0800 (PST) From: Dmitry Baryshkov To: Andy Gross , Bjorn Andersson , "Rafael J. Wysocki" , Viresh Kumar Cc: linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, Thara Gopinath Subject: [PATCH v2 2/4] cpufreq: qcom-hw: fix the race between LMH worker and cpuhp Date: Thu, 10 Mar 2022 01:39:36 +0300 Message-Id: <20220309223938.3819715-3-dmitry.baryshkov@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> References: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org qcom_lmh_dcvs_poll() can be running when the cpu is being put offline. This results in the following warnings and an oops. The driver would disable the worker, but it happens closer to the end of cpufreq_offline(). Change the locking in the qcom_lmh_dcvs_poll(), so that the worker can not run in parallel with cpufreq_offline() call. [ 55.650435] (NULL device *): dev_pm_opp_find_freq_floor: Invalid argument freq=00000000709ccbf9 [ 55.659420] (NULL device *): Can't find the OPP for throttling: -EINVAL! [ 55.666329] Unable to handle kernel paging request at virtual address ffffadfba4bb6d81 [ 55.674491] Mem abort info: [ 55.677363] ESR = 0x96000004 [ 55.680527] EC = 0x25: DABT (current EL), IL = 32 bits [ 55.686001] SET = 0, FnV = 0 [ 55.689164] EA = 0, S1PTW = 0 [ 55.692418] FSC = 0x04: level 0 translation fault [ 55.697449] Data abort info: [ 55.700426] ISV = 0, ISS = 0x00000004 [ 55.704383] CM = 0, WnR = 0 [ 55.707455] swapper pgtable: 4k pages, 48-bit VAs, pgdp=00000000a98e9000 [ 55.714354] [ffffadfba4bb6d81] pgd=0000000000000000, p4d=0000000000000000 [ 55.721388] Internal error: Oops: 96000004 [#1] SMP [ 55.726397] Modules linked in: [ 55.729542] CPU: 7 PID: 162 Comm: kworker/7:1H Tainted: G S W 5.17.0-rc6-00100-g04890a1d9672 #724 [ 55.746066] Workqueue: events_highpri qcom_lmh_dcvs_poll [ 55.751527] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 55.758669] pc : cpufreq_cpu_get_raw+0x20/0x44 [ 55.763233] lr : qcom_cpufreq_hw_get+0x10/0x64 [ 55.767799] sp : ffff800009983d10 [ 55.771207] x29: ffff800009983d10 x28: ffffaa13a4f2b000 x27: ffff7b31329f9305 [ 55.778530] x26: ffffaa13a4f30af8 x25: ffffaa13a4f4e4c8 x24: ffff7b2ec2eda000 [ 55.785851] x23: ffffffffffffffea x22: ffff7b2ec2e9fc18 x21: ffff7b2ec2e9fc00 [ 55.793170] x20: 0000000000000100 x19: ffff7b2ec2e9fcc0 x18: ffffffffffffffff [ 55.800490] x17: 726620746e656d75 x16: 6772612064696c61 x15: ffff8000899839c7 [ 55.807812] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 [ 55.815140] x11: ffff7b2ec2e9fc80 x10: ffffaa13a59a1a70 x9 : 0000000000000000 [ 55.822468] x8 : ffff7b2eca6917c0 x7 : ffffaa13a528b000 x6 : 0000000000000001 [ 55.829788] x5 : 0000000000040000 x4 : 000000000000024f x3 : 0000000000000000 [ 55.837116] x2 : 0000000000000100 x1 : ffffaa13a4bb6d80 x0 : 000003e800000001 [ 55.844439] Call trace: [ 55.846951] cpufreq_cpu_get_raw+0x20/0x44 [ 55.851155] qcom_lmh_dcvs_poll+0x104/0x160 [ 55.855452] process_one_work+0x288/0x69c [ 55.859574] worker_thread+0x74/0x470 [ 55.863336] kthread+0xfc/0x100 [ 55.866568] ret_from_fork+0x10/0x20 [ 55.870246] Code: b00065c1 91360021 d503233f f8625800 (f8616800) [ 55.876501] ---[ end trace 0000000000000000 ]--- Fixes: 275157b367f4 ("cpufreq: qcom-cpufreq-hw: Add dcvs interrupt support") Signed-off-by: Dmitry Baryshkov Tested-by: Vladimir Zapolskiy --- drivers/cpufreq/qcom-cpufreq-hw.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c index 44d46e52baea..7c1bb002e1c3 100644 --- a/drivers/cpufreq/qcom-cpufreq-hw.c +++ b/drivers/cpufreq/qcom-cpufreq-hw.c @@ -296,6 +296,23 @@ static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data) struct dev_pm_opp *opp; unsigned int freq; + /* + * Synchronize against CPU going offline. + * cpufreq_offline() will get the write lock on policy->rwsem. + */ +retry: + if (unlikely(!down_read_trylock(&policy->rwsem))) { + mutex_lock(&data->throttle_lock); + if (data->cancel_throttle) { + mutex_unlock(&data->throttle_lock); + return; + } + + mutex_unlock(&data->throttle_lock); + + schedule(); + goto retry; + } /* * Get the h/w throttled frequency, normalize it using the * registered opp table and use it to calculate thermal pressure. @@ -314,9 +331,10 @@ static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data) /* * In the unlikely case policy is unregistered do not enable - * polling or h/w interrupt + * polling or h/w interrupt. + * If we are here, we have the policy->rwsem read lock, + * cancel_throttle can be toggled only with the write lock. */ - mutex_lock(&data->throttle_lock); if (data->cancel_throttle) goto out; @@ -331,7 +349,7 @@ static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data) msecs_to_jiffies(10)); out: - mutex_unlock(&data->throttle_lock); + up_read(&policy->rwsem); } static void qcom_lmh_dcvs_poll(struct work_struct *work) From patchwork Wed Mar 9 22:39:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 550255 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 6DA5BC43217 for ; Wed, 9 Mar 2022 22:39:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238779AbiCIWkz (ORCPT ); Wed, 9 Mar 2022 17:40:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44562 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238783AbiCIWky (ORCPT ); Wed, 9 Mar 2022 17:40:54 -0500 Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1BD32121515 for ; Wed, 9 Mar 2022 14:39:55 -0800 (PST) Received: by mail-lf1-x134.google.com with SMTP id h14so6288435lfk.11 for ; Wed, 09 Mar 2022 14:39:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=pJDgp8CUHpaD9ylrQ246UHOo+e5y0DJxgmBYb+4fh+o=; b=sy548dNInrhOj5feycY52wgoXI3ozYCkS8dmdfepJS7zBpWTBgg10z/8mrOyttEF4Q Y9v89AjI9ZoDxB5Rjyv67CrfUproJjHZe8mwUml6kpQWrrmzMbEwdTTTqv+m6uM/5hws aVzj0rTRDE5RSqGkZPVB+sS2hw5qwGsuWhzqamJ06xmsKFGKIHUtZDP8Xbi4ZTEYtM9d DpJYI4ViGKcTr/bSTZL9OWIRT4LV00QvzYo1USk6SM2OWRjAJecPyfK7Zg3YhIXAzoEV E3ZfU3CYKhRUQbl341VgtHDgOL5uN4fXvWwigMu/1OdiTjpUI++2mXbghwFo0YY7u3xo wJhQ== 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=pJDgp8CUHpaD9ylrQ246UHOo+e5y0DJxgmBYb+4fh+o=; b=7zlbGJynkMe+D+ipOyAaCt/KWKrHzal+MQRYRxqJtG60s+zk93XTkXrdKnoQ+Y65aJ imZFC9e+ap868RSLWEx77KUJaA8B9LT2pJUxk7wW5c8w72RBX3ZAtMAoyWCqG3V+WMnP QXQ6nG/kSoHfKBKNf2rU1RC+UHpo3DGt68TiTY43Do+StrmZ/OolG/CjqiB5Y+FaycbD iF4nHVFWw7Xe6MOHYWWD+3Wgh0OiYSCl8Wo8q2ET6IsMjpD5uPg0ify6699wcw4EKq5E YocKc/xkZSI5Ggrtt++y9uPcTy40VLSo3PNCqmlYBfdqbzByb8CuYKAlMPD1gwcgqh9U mEaA== X-Gm-Message-State: AOAM532IN1haLToe1jXyHf9ySdsPNGLFJl4nzz6huS7OQA/4T28qcDwq rb1gROnxqfbmzER9UuOwhOzeow== X-Google-Smtp-Source: ABdhPJz1ZSV7nbVu4FjfGFbR6MkSnvkaCK8R8D1cTZ7BJbfk7H/MMzGuibgBRiKzTduLZXPMJ2XP/w== X-Received: by 2002:ac2:58cc:0:b0:443:fbed:4613 with SMTP id u12-20020ac258cc000000b00443fbed4613mr1168069lfo.317.1646865593476; Wed, 09 Mar 2022 14:39:53 -0800 (PST) Received: from eriador.lan ([37.153.55.125]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b004483734e0afsm621036lfj.12.2022.03.09.14.39.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Mar 2022 14:39:52 -0800 (PST) From: Dmitry Baryshkov To: Andy Gross , Bjorn Andersson , "Rafael J. Wysocki" , Viresh Kumar Cc: linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, Thara Gopinath Subject: [PATCH v2 3/4] cpufreq: qcom-hw: fix the opp entries refcounting Date: Thu, 10 Mar 2022 01:39:37 +0300 Message-Id: <20220309223938.3819715-4-dmitry.baryshkov@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> References: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org The qcom_lmh_dcvs_notify() will get the dev_pm_opp instance for throttling, but will not put it, ending up with leaking a reference count and the following backtrace when putting the CPU offline. Correctly put the reference count of the returned opp instance. [ 84.418025] ------------[ cut here ]------------ [ 84.422770] WARNING: CPU: 7 PID: 43 at drivers/opp/core.c:1396 _opp_table_kref_release+0x188/0x190 [ 84.431966] Modules linked in: [ 84.435106] CPU: 7 PID: 43 Comm: cpuhp/7 Tainted: G S 5.17.0-rc6-00388-g7cf3c0d89c44-dirty #721 [ 84.451631] pstate: 82400005 (Nzcv daif +PAN -UAO +TCO -DIT -SSBS BTYPE=--) [ 84.458781] pc : _opp_table_kref_release+0x188/0x190 [ 84.463878] lr : _opp_table_kref_release+0x78/0x190 [ 84.468885] sp : ffff80000841bc70 [ 84.472294] x29: ffff80000841bc70 x28: ffff6664afe3d000 x27: ffff1db6729e5908 [ 84.479621] x26: 0000000000000000 x25: 0000000000000000 x24: ffff1db6729e58e0 [ 84.486946] x23: ffff8000080a5000 x22: ffff1db40aad80e0 x21: ffff1db4002fec80 [ 84.494277] x20: ffff1db40aad8000 x19: ffffb751c3186300 x18: ffffffffffffffff [ 84.501603] x17: 5300326563697665 x16: 645f676e696c6f6f x15: 00001186c1df5448 [ 84.508928] x14: 00000000000002e9 x13: 0000000000000000 x12: 0000000000000000 [ 84.516256] x11: ffffb751c3186368 x10: ffffb751c39a2a70 x9 : 0000000000000000 [ 84.523585] x8 : ffff1db4008edf00 x7 : ffffb751c328c000 x6 : 0000000000000001 [ 84.530916] x5 : 0000000000040000 x4 : 0000000000000001 x3 : ffff1db4008edf00 [ 84.538247] x2 : 0000000000000000 x1 : ffff1db400aa6100 x0 : ffff1db40aad80d0 [ 84.545579] Call trace: [ 84.548101] _opp_table_kref_release+0x188/0x190 [ 84.552842] dev_pm_opp_remove_all_dynamic+0x8c/0xc0 [ 84.557949] qcom_cpufreq_hw_cpu_exit+0x30/0xdc [ 84.562608] cpufreq_offline.isra.0+0x1b4/0x1d8 [ 84.567270] cpuhp_cpufreq_offline+0x10/0x6c [ 84.571663] cpuhp_invoke_callback+0x16c/0x2b0 [ 84.576231] cpuhp_thread_fun+0x190/0x250 [ 84.580353] smpboot_thread_fn+0x12c/0x230 [ 84.584568] kthread+0xfc/0x100 [ 84.587810] ret_from_fork+0x10/0x20 [ 84.591490] irq event stamp: 3482 [ 84.594901] hardirqs last enabled at (3481): [] call_rcu+0x39c/0x50c [ 84.603119] hardirqs last disabled at (3482): [] el1_dbg+0x24/0x8c [ 84.611074] softirqs last enabled at (310): [] _stext+0x410/0x588 [ 84.619028] softirqs last disabled at (305): [] __irq_exit_rcu+0x158/0x174 [ 84.627691] ---[ end trace 0000000000000000 ]--- Fixes: 275157b367f4 ("cpufreq: qcom-cpufreq-hw: Add dcvs interrupt support") Signed-off-by: Dmitry Baryshkov Tested-by: Vladimir Zapolskiy Reviewed-by: Vladimir Zapolskiy Reviewed-by: Bjorn Andersson --- drivers/cpufreq/qcom-cpufreq-hw.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c index 7c1bb002e1c3..fe638e141003 100644 --- a/drivers/cpufreq/qcom-cpufreq-hw.c +++ b/drivers/cpufreq/qcom-cpufreq-hw.c @@ -322,12 +322,18 @@ static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data) opp = dev_pm_opp_find_freq_floor(dev, &freq_hz); if (IS_ERR(opp) && PTR_ERR(opp) == -ERANGE) - dev_pm_opp_find_freq_ceil(dev, &freq_hz); + opp = dev_pm_opp_find_freq_ceil(dev, &freq_hz); - throttled_freq = freq_hz / HZ_PER_KHZ; + if (IS_ERR(opp)) { + dev_warn_ratelimited(dev, "Can't find the OPP for throttling: %pe!\n", opp); + } else { + throttled_freq = freq_hz / HZ_PER_KHZ; + + /* Update thermal pressure (the boost frequencies are accepted) */ + arch_update_thermal_pressure(policy->related_cpus, throttled_freq); - /* Update thermal pressure (the boost frequencies are accepted) */ - arch_update_thermal_pressure(policy->related_cpus, throttled_freq); + dev_pm_opp_put(opp); + } /* * In the unlikely case policy is unregistered do not enable From patchwork Wed Mar 9 22:39:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 549991 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 6F12BC4167B for ; Wed, 9 Mar 2022 22:39:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238798AbiCIWk4 (ORCPT ); Wed, 9 Mar 2022 17:40:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238791AbiCIWkz (ORCPT ); Wed, 9 Mar 2022 17:40:55 -0500 Received: from mail-lf1-x12b.google.com (mail-lf1-x12b.google.com [IPv6:2a00:1450:4864:20::12b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 317C5120E8A for ; Wed, 9 Mar 2022 14:39:56 -0800 (PST) Received: by mail-lf1-x12b.google.com with SMTP id g17so6363631lfh.2 for ; Wed, 09 Mar 2022 14:39:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=MHH5JWeg/tYAzKBUll2JAEsUSxgBB41qjFt+SHg4XS8=; b=O/mDOkszGi5FSBY13cfdOw1b2c6QOT/tZcgjcABlWA135imqMRU+yML6HYsSvC+h8m +CICPFzrmtHfZSVkM03cF1mfthaq1Lz/IQ4pfNZmst4AkauNoSe62pgYavE6FX1N3PMz 8rLK07OxgBZ2OofjzDpNxP2Unp7nsralrw5psM5lY18oiBSF+It1BKxxeFzgKg3r4KwW BLT4+g9TDlLyXbjkHNF78DovU1k6QgT9Jf9dUYnrlZr5QjP1iOAKC4UtmNHqhS0L4YdE OyNXSfX0L7hkJ6YldmSN0/fwdiPyevw9QTdrstHcRfUq5oig4piIA9ZB+DIbayq9ifZ/ SOEw== 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=MHH5JWeg/tYAzKBUll2JAEsUSxgBB41qjFt+SHg4XS8=; b=zt3EiNwOA0/8Dsy/w2BB05hxxCrZXeQW0evltZPKoElV0bApoIBosC9dgu/cwrhBzz hKn9cHC7zCgvhfDfPg9F1/T90TCc4spinGWXAC+VPyUQ1Hctt8OynPVJ7XyL5vqFaRgr SJSr9GV+gW7fpJ2pHU96gncDNI/z1EKcjq3zNilN1EfvuCrPXHPEcVUIWgzq8vHkv4MX Kjm0V3NI5IOfdnLUHTZDLX4tmraCeBAZN/zfjY42jUe69K1VPjcj0KezllbeE3iMKqQ9 qFX9eSmPt67wo+0b0Xlg6fJXsKwJVsueQgou7pftV3KWc5gHt1++17gOer31wynpD0uT 4q4g== X-Gm-Message-State: AOAM533Dn+30i/AUdaqX9k4Vc9N0dgyYAeDrEJ2WS6cowVlwP04Q2p88 P+/A94sVPCl9m2cHdmLpHTW0Aw== X-Google-Smtp-Source: ABdhPJyH3GcwJs7l8MCIwzNvO92pfZ9PABSEdKgnUldBEk5mDqcD+b3OdFOwPgbd+oibqiJ4GNsk5g== X-Received: by 2002:a05:6512:2347:b0:448:2744:26f7 with SMTP id p7-20020a056512234700b00448274426f7mr1146804lfu.683.1646865594563; Wed, 09 Mar 2022 14:39:54 -0800 (PST) Received: from eriador.lan ([37.153.55.125]) by smtp.gmail.com with ESMTPSA id b24-20020a196458000000b004483734e0afsm621036lfj.12.2022.03.09.14.39.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Mar 2022 14:39:53 -0800 (PST) From: Dmitry Baryshkov To: Andy Gross , Bjorn Andersson , "Rafael J. Wysocki" , Viresh Kumar Cc: linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org, Thara Gopinath Subject: [PATCH v2 4/4] cpufreq: qcom-hw: provide online/offline operations Date: Thu, 10 Mar 2022 01:39:38 +0300 Message-Id: <20220309223938.3819715-5-dmitry.baryshkov@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> References: <20220309223938.3819715-1-dmitry.baryshkov@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Provide lightweight online and offline operations. This saves us from parsing all the resources each time the CPU is put online. Signed-off-by: Dmitry Baryshkov Tested-by: Vladimir Zapolskiy Reviewed-by: Vladimir Zapolskiy Reviewed-by: Bjorn Andersson --- drivers/cpufreq/qcom-cpufreq-hw.c | 39 +++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c index fe638e141003..d38b1552ec13 100644 --- a/drivers/cpufreq/qcom-cpufreq-hw.c +++ b/drivers/cpufreq/qcom-cpufreq-hw.c @@ -403,11 +403,12 @@ static const struct of_device_id qcom_cpufreq_hw_match[] = { }; MODULE_DEVICE_TABLE(of, qcom_cpufreq_hw_match); +static int qcom_cpufreq_hw_lmh_online(struct cpufreq_policy *policy); + static int qcom_cpufreq_hw_lmh_init(struct cpufreq_policy *policy, int index) { struct qcom_cpufreq_data *data = policy->driver_data; struct platform_device *pdev = cpufreq_get_driver_data(); - int ret; /* * Look for LMh interrupt. If no interrupt line is specified / @@ -419,12 +420,21 @@ static int qcom_cpufreq_hw_lmh_init(struct cpufreq_policy *policy, int index) if (data->throttle_irq < 0) return data->throttle_irq; - data->cancel_throttle = false; - data->policy = policy; - mutex_init(&data->throttle_lock); INIT_DEFERRABLE_WORK(&data->throttle_work, qcom_lmh_dcvs_poll); + return qcom_cpufreq_hw_lmh_online(policy); +} + +static int qcom_cpufreq_hw_lmh_online(struct cpufreq_policy *policy) +{ + struct qcom_cpufreq_data *data = policy->driver_data; + struct platform_device *pdev = cpufreq_get_driver_data(); + int ret; + + data->cancel_throttle = false; + data->policy = policy; + snprintf(data->irq_name, sizeof(data->irq_name), "dcvsh-irq-%u", policy->cpu); ret = request_threaded_irq(data->throttle_irq, NULL, qcom_lmh_dcvs_handle_irq, IRQF_ONESHOT | IRQF_NO_AUTOEN, data->irq_name, data); @@ -441,10 +451,12 @@ static int qcom_cpufreq_hw_lmh_init(struct cpufreq_policy *policy, int index) return 0; } -static void qcom_cpufreq_hw_lmh_exit(struct qcom_cpufreq_data *data) +static int qcom_cpufreq_hw_lmh_offline(struct cpufreq_policy *policy) { + struct qcom_cpufreq_data *data = policy->driver_data; + if (data->throttle_irq <= 0) - return; + return 0; mutex_lock(&data->throttle_lock); data->cancel_throttle = true; @@ -453,6 +465,8 @@ static void qcom_cpufreq_hw_lmh_exit(struct qcom_cpufreq_data *data) cancel_delayed_work_sync(&data->throttle_work); irq_set_affinity_hint(data->throttle_irq, NULL); free_irq(data->throttle_irq, data); + + return 0; } static int qcom_cpufreq_hw_cpu_init(struct cpufreq_policy *policy) @@ -567,6 +581,16 @@ static int qcom_cpufreq_hw_cpu_init(struct cpufreq_policy *policy) return ret; } +static int qcom_cpufreq_hw_cpu_online(struct cpufreq_policy *policy) +{ + return qcom_cpufreq_hw_lmh_online(policy); +} + +static int qcom_cpufreq_hw_cpu_offline(struct cpufreq_policy *policy) +{ + return qcom_cpufreq_hw_lmh_offline(policy); +} + static int qcom_cpufreq_hw_cpu_exit(struct cpufreq_policy *policy) { struct device *cpu_dev = get_cpu_device(policy->cpu); @@ -576,7 +600,6 @@ static int qcom_cpufreq_hw_cpu_exit(struct cpufreq_policy *policy) dev_pm_opp_remove_all_dynamic(cpu_dev); dev_pm_opp_of_cpumask_remove_table(policy->related_cpus); - qcom_cpufreq_hw_lmh_exit(data); kfree(policy->freq_table); kfree(data); iounmap(base); @@ -608,6 +631,8 @@ static struct cpufreq_driver cpufreq_qcom_hw_driver = { .get = qcom_cpufreq_hw_get, .init = qcom_cpufreq_hw_cpu_init, .exit = qcom_cpufreq_hw_cpu_exit, + .online = qcom_cpufreq_hw_cpu_online, + .offline = qcom_cpufreq_hw_cpu_offline, .register_em = cpufreq_register_em_with_opp, .fast_switch = qcom_cpufreq_hw_fast_switch, .name = "qcom-cpufreq-hw",