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 6F58AC43217 for ; Mon, 10 Jan 2022 12:19:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245345AbiAJMTR (ORCPT ); Mon, 10 Jan 2022 07:19:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229677AbiAJMTP (ORCPT ); Mon, 10 Jan 2022 07:19:15 -0500 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CEB06C06173F for ; Mon, 10 Jan 2022 04:19:14 -0800 (PST) Received: by mail-lf1-x135.google.com with SMTP id g26so43606258lfv.11 for ; Mon, 10 Jan 2022 04:19:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=m3cdTQamqwc5wvi/XQ/FOwI7VvBmgKes9aExDZLIFjA=; b=gSOGJgj/TY6JNMK0G2JxMu/WZFwY7zR+ZYiKDN6iQ0Ra9n4bMKcvoREscljN5Zxf6+ Jv8XTn8e1ietgSFsjNrQvIkgg2RQRdFt1gPZd8OPutrgR3vV3KVsXoeFxCqakP7dQ5IK tPgz5rE1t2ny6zDiI3eN0TDLS/iS+n9akUTmUr7Asu7W8+eAEMyLKMpkVxu+z1yP9o0W 2Pu4YGcelUcN+PmFXSgtdvkQJfZQZkaGTd+nwid/qg+z/8njXLMJ7XA1IE5HE61dtbrt PYiZJCgdYYy1KqVmbiAjWa9OVsgX8vxo+MOuv1NNONCoDufVIuC0/s8fWegL93t7jZDt XOHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=m3cdTQamqwc5wvi/XQ/FOwI7VvBmgKes9aExDZLIFjA=; b=ClSXs/kINqFWVQWe5N12Mr4ekP8hMc7oyLDYrqVP0oEqEW3j7qULta74NwZvcdIcUd QHoO0sXPKMd4kh0YKHWs5gh9tPofhri4y6aXb5MLWZgvPCpjYvCbBviYP8baeR22MPA/ oYewEZZTY+BFzB1bFPvk25CWN90UiauocJGHmVEEVuT7y4fhxIvLZaWU1mx4SClKWuds SDo/7+YMmtwK+DT5fyAeQD5w0WGcpojPgCh85YwI7WcYZecSP7jdgUvO8cYT2nkVuepL n9TY8ke6C0e02+rXEvmzZZiP6ebIvfxRLGD0ng58+Y7xU0T6UIIAr+QuQrfEk9RK40wt dfnw== X-Gm-Message-State: AOAM532SvSXLboPhc4SYDSDM2uyrB02uzhiK1dj+NfZviUX0s2VO62JJ StswA5/CJ0oC6kmcQbIGYlk7b++ilwUSeltsoPAQow== X-Google-Smtp-Source: ABdhPJxvPy8twDY+Ak+Q1oU4Zqi1NunN2lX57+GA7fBUxaLuRAj0pvnI5p/lmSlBQl36w0P/08dUpkNOXSvaTJemqeI= X-Received: by 2002:a05:6512:4021:: with SMTP id br33mr4206761lfb.233.1641817153127; Mon, 10 Jan 2022 04:19:13 -0800 (PST) MIME-Version: 1.0 References: <20220107181723.54392-1-paul@crapouillou.net> <20220107181723.54392-4-paul@crapouillou.net> In-Reply-To: <20220107181723.54392-4-paul@crapouillou.net> From: Ulf Hansson Date: Mon, 10 Jan 2022 13:18:36 +0100 Message-ID: Subject: Re: [PATCH v3 3/6] PM: core: Add EXPORT[_GPL]_SIMPLE_DEV_PM_OPS macros To: Paul Cercueil Cc: "Rafael J . Wysocki" , Jonathan Cameron , Lars-Peter Clausen , Linus Walleij , Arnd Bergmann , Len Brown , Pavel Machek , list@opendingux.net, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org, linux-mmc@vger.kernel.org, linux-pm@vger.kernel.org, Jonathan Cameron Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 7 Jan 2022 at 19:17, Paul Cercueil wrote: > > These macros are defined conditionally, according to CONFIG_PM: > - if CONFIG_PM is enabled, these macros resolve to > DEFINE_SIMPLE_DEV_PM_OPS(), and the dev_pm_ops symbol will be > exported. > > - if CONFIG_PM is disabled, these macros will result in a dummy static > dev_pm_ops to be created with the __maybe_unused flag. The dev_pm_ops > will then be discarded by the compiler, along with the provided > callback functions if they are not used anywhere else. > > In the second case, the symbol is not exported, which should be > perfectly fine - users of the symbol should all use the pm_ptr() or > pm_sleep_ptr() macro, so the dev_pm_ops marked as "extern" in the > client's code will never be accessed. > > Signed-off-by: Paul Cercueil > Acked-by: Jonathan Cameron Clearly this can be useful! My main concern is rather that the macros become a bit complicated (for understandable reasons) and that kind of continues while looking at patch4 and patch5 too. Hopefully that doesn't prevent users from adopting them, and the current situation deserves improvements, so I think this is worth a try! Reviewed-by: Ulf Hansson Kind regards Uffe > --- > > Notes: > v2: Remove useless empty line > v3: - Reorder the code to have non-private macros together in the file > - Add comment about the necesity to use the new export macro when > the dev_pm_ops has to be exported > > include/linux/pm.h | 35 ++++++++++++++++++++++++++++++++--- > 1 file changed, 32 insertions(+), 3 deletions(-) > > diff --git a/include/linux/pm.h b/include/linux/pm.h > index 8e13387e70ec..8279af2c538a 100644 > --- a/include/linux/pm.h > +++ b/include/linux/pm.h > @@ -8,6 +8,7 @@ > #ifndef _LINUX_PM_H > #define _LINUX_PM_H > > +#include > #include > #include > #include > @@ -357,14 +358,42 @@ struct dev_pm_ops { > #define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) > #endif > > +#define _DEFINE_DEV_PM_OPS(name, \ > + suspend_fn, resume_fn, \ > + runtime_suspend_fn, runtime_resume_fn, idle_fn) \ > +const struct dev_pm_ops name = { \ > + SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ > + RUNTIME_PM_OPS(runtime_suspend_fn, runtime_resume_fn, idle_fn) \ > +} > + > +#ifdef CONFIG_PM > +#define _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \ > + runtime_resume_fn, idle_fn, sec) \ > + _DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \ > + runtime_resume_fn, idle_fn); \ > + _EXPORT_SYMBOL(name, sec) > +#else > +#define _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \ > + runtime_resume_fn, idle_fn, sec) \ > +static __maybe_unused _DEFINE_DEV_PM_OPS(__static_##name, suspend_fn, \ > + resume_fn, runtime_suspend_fn, \ > + runtime_resume_fn, idle_fn) > +#endif > + > /* > * Use this if you want to use the same suspend and resume callbacks for suspend > * to RAM and hibernation. > + * > + * If the underlying dev_pm_ops struct symbol has to be exported, use > + * EXPORT_SIMPLE_DEV_PM_OPS() or EXPORT_GPL_SIMPLE_DEV_PM_OPS() instead. > */ > #define DEFINE_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ > -const struct dev_pm_ops name = { \ > - SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ > -} > + _DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL) > + > +#define EXPORT_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ > + _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL, "") > +#define EXPORT_GPL_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ > + _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL, "_gpl") > > /* Deprecated. Use DEFINE_SIMPLE_DEV_PM_OPS() instead. */ > #define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ > -- > 2.34.1 >