Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp1314691imm; Fri, 22 Jun 2018 14:23:28 -0700 (PDT) X-Google-Smtp-Source: ADUXVKITCEwrqyJWtvePk70w0aHe2OIPQU5xNJUJvb72CeTPp/x7kcTU2hRd7jEGH/QQib4S+f5N X-Received: by 2002:a62:1013:: with SMTP id y19-v6mr3307764pfi.166.1529702608063; Fri, 22 Jun 2018 14:23:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529702608; cv=none; d=google.com; s=arc-20160816; b=KwP7KfxGQHrN0CIataECCgNduqZ1/m2eyjlMrAGE+iu7jQ1/3f/JsCZk1vwZN70cyZ Nywj07l3xr1zL9Ph0/E7nOO3tHu/qr2X3WWHO4tNW784g6DVa0I5Sgvs+CZtYTjRxgPJ ARpQWEAdff7EjGzyBarZ6QveLIMfuZ/lAy1OlvXvinMt75SGRWd+V8OmKHTfPwnge8lq WaMzm6m81mNzGJuGnwNmqv2h04jteDOJ3RvMlabdPdq6Kpn5MsJ5BE9p7gxKz7Tox/XA CLQFlvkimfPlSsW6Fud6KgIDjgBXrCsxLieZ/kVbxrRkSgS5NvpAeWvHiTB3zBbf8Iru MygA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:message-id:references :in-reply-to:subject:cc:to:from:date:content-transfer-encoding :mime-version:dkim-signature:dkim-signature :arc-authentication-results; bh=hqCF22TrL/ydvKgSYNN+PmOI1Vxq2lH73OXHcBldTqI=; b=1LDAP6IC69yBPU1dUADsMOlm9ayf41hypWX3Nbo/XG8Qm66j3xcW4EB/o4w04byILs iBDLcqoVTpsAhLQbSOS2yQUctvnwrodQoKFbCI37yILYDCj1qGuD2VxhrI5dGEBx5Ap8 Iki+64vEaFCQfvpNTTUN2VYw/QimEnbhjW3+U+t4r2qRNIyup/DiA89XSAO4anQlGZ63 nI96h+a2h2sYkOPmEZ2R+qyXRRPHScJShB7ARk2jnE6EigIGoDATxwsLIU7dGLE8D3lf rY6maHKgM1A4IgLsWbNzIc4WyZPJYzH3Ezel+pJN5BvCmH7SkgWh2h5WCjD6jNtyw443 zzLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=jyxPek+v; dkim=pass header.i=@codeaurora.org header.s=default header.b=jyxPek+v; 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 f71-v6si8023490pfc.316.2018.06.22.14.23.12; Fri, 22 Jun 2018 14:23:28 -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=@codeaurora.org header.s=default header.b=jyxPek+v; dkim=pass header.i=@codeaurora.org header.s=default header.b=jyxPek+v; 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 S933463AbeFVVWb (ORCPT + 99 others); Fri, 22 Jun 2018 17:22:31 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:39202 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751551AbeFVVWa (ORCPT ); Fri, 22 Jun 2018 17:22:30 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id C080F60791; Fri, 22 Jun 2018 21:22:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1529702549; bh=47at7Z0OwYB2ExnmsJY6L1enuO6Xiai5/Qv+1iuN5rU=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=jyxPek+vu/Vce95CS/ser45LkuzMHFJO93Ne7GMDXCQqb6KV2qle7jxGCgdAB2nUO dFj1byP7RP61hxShD7lHBbbJtWuiZOewD1Ty/Lk8wxyTwTpKAnr1vtutK1wSDrRADk WGh5dwLZXJq6rAjtVeVbtK1YmVFSnvMs7HiNf7vI= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.codeaurora.org (Postfix) with ESMTP id 5E67F604A6; Fri, 22 Jun 2018 21:22:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1529702549; bh=47at7Z0OwYB2ExnmsJY6L1enuO6Xiai5/Qv+1iuN5rU=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=jyxPek+vu/Vce95CS/ser45LkuzMHFJO93Ne7GMDXCQqb6KV2qle7jxGCgdAB2nUO dFj1byP7RP61hxShD7lHBbbJtWuiZOewD1Ty/Lk8wxyTwTpKAnr1vtutK1wSDrRADk WGh5dwLZXJq6rAjtVeVbtK1YmVFSnvMs7HiNf7vI= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Sat, 23 Jun 2018 02:52:29 +0530 From: akhilpo@codeaurora.org To: Ezequiel Garcia Cc: Enric Balletbo i Serra , linux-kernel@vger.kernel.org, kernel@collabora.com, Chanwoo Choi , Kyungmin Park , MyungJoo Ham , linux-pm@vger.kernel.org Subject: Re: [PATCH v3] PM / devfreq: Fix devfreq_add_device() when drivers are built as modules. In-Reply-To: <1e792d3c972998f92109c127886243e32c4cde71.camel@collabora.com> References: <20180621220430.25644-1-enric.balletbo@collabora.com> <0383b4a703a0b619023c0654a4a7637419c72ebd.camel@collabora.com> <1e792d3c972998f92109c127886243e32c4cde71.camel@collabora.com> Message-ID: <7c67974e40afd15abfca5907b27de097@codeaurora.org> X-Sender: akhilpo@codeaurora.org User-Agent: Roundcube Webmail/1.2.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2018-06-22 22:43, Ezequiel Garcia wrote: > Hey Akhil, > > On Fri, 2018-06-22 at 12:33 +0530, Akhil P Oommen wrote: >> On 6/22/2018 6:41 AM, Ezequiel Garcia wrote: >> > Hey Enric, >> > >> > On Fri, 2018-06-22 at 00:04 +0200, Enric Balletbo i Serra wrote: >> > > When the devfreq driver and the governor driver are built as >> > > modules, >> > > the call to devfreq_add_device() or governor_store() fails >> > > because >> > > the >> > > governor driver is not loaded at the time the devfreq driver >> > > loads. >> > > The >> > > devfreq driver has a build dependency on the governor but also >> > > should >> > > have a runtime dependency. We need to make sure that the governor >> > > driver >> > > is loaded before the devfreq driver. >> > > >> > > This patch fixes this bug by adding a try_then_request_governor() >> > > function. First tries to find the governor, and then, if it is >> > > not >> > > found, >> > > it requests the module and tries again. >> > > >> > > Fixes: 1b5c1be2c88e (PM / devfreq: map devfreq drivers to >> > > governor >> > > using name) >> > > Signed-off-by: Enric Balletbo i Serra > > > om> >> > > --- >> > > >> > > Changes in v3: >> > > - Remove unneded change in dev_err message. >> > > - Fix err returned value in case to not find the governor. >> > > >> > > Changes in v2: >> > > - Add a new function to request the module and call that function >> > > from >> > > devfreq_add_device and governor_store. >> > > >> > > drivers/devfreq/devfreq.c | 65 >> > > ++++++++++++++++++++++++++++++++----- >> > > -- >> > >> > [snip snip] >> > > - governor = find_devfreq_governor(devfreq- >> > > >governor_name); >> > > + governor = try_then_request_governor(devfreq- >> > > > governor_name); >> > > >> > > if (IS_ERR(governor)) { >> > > dev_err(dev, "%s: Unable to find governor for >> > > the >> > > device\n", >> > > __func__); >> > > err = PTR_ERR(governor); >> > > - goto err_init; >> > > + goto err_unregister; >> > > } >> > > >> > > + mutex_lock(&devfreq_list_lock); >> > > + >> > >> > I know it's not something we are introducing in this patch, >> > but still... calling a hook with a mutex held looks >> > fishy to me. >> > >> > This lock should only protect the list, unless I am missing >> > something. >> > >> > > devfreq->governor = governor; >> > > err = devfreq->governor->event_handler(devfreq, >> > > DEVFREQ_GOV_START, >> > > NULL); >> > > @@ -663,14 +703,16 @@ struct devfreq *devfreq_add_device(struct >> > > device *dev, >> > > __func__); >> > > goto err_init; >> > > } >> > > + >> > > + list_add(&devfreq->node, &devfreq_list); >> > > + >> > > mutex_unlock(&devfreq_list_lock); >> > > >> > > return devfreq; >> > > >> > > err_init: >> > > - list_del(&devfreq->node); >> > > mutex_unlock(&devfreq_list_lock); >> > > - >> > > +err_unregister: >> > > device_unregister(&devfreq->dev); >> > > err_dev: >> > > if (devfreq) >> > > @@ -988,12 +1030,13 @@ static ssize_t governor_store(struct >> > > device >> > > *dev, struct device_attribute *attr, >> > > if (ret != 1) >> > > return -EINVAL; >> > > >> > > - mutex_lock(&devfreq_list_lock); >> > > - governor = find_devfreq_governor(str_governor); >> > > + governor = try_then_request_governor(str_governor); >> > > if (IS_ERR(governor)) { >> > > - ret = PTR_ERR(governor); >> > > - goto out; >> > > + return PTR_ERR(governor); >> > > } >> > > + >> > > + mutex_lock(&devfreq_list_lock); >> > > + >> > > if (df->governor == governor) { >> > > ret = 0; >> > > goto out; >> > > -- >> > > 2.17.1 >> > > >> > > >> > >> > Regards, >> > Eze >> >> Adding to Ezequiel's point, shouldn't we take more granular lock >> (devfreq->lock) first and then call devfreq_list_lock at the time of >> adding to the list? >> > > Not sure why we should do that. devfreq->lock should be used to > protect the struct devfreq state, while the devfreq_list_lock > is apparently protecting the two lists (which seem unrelated > lists). > > So, the two locks are not correlated. > > Regards, > Eze In governor_store(), we do 'df->governor = governor;' without taking df->lock. So it is possible to switch governor while update_devfreq() is in progress. I smell trouble there. Don't you think so? I am assuming df->lock protects 'struct devfreq' and devfreq_list_lock protects both device and governor lists. -Akhil.