All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Danilo Krummrich" <dakr@kernel.org>
To: "Ulf Hansson" <ulf.hansson@linaro.org>
Cc: "Saravana Kannan" <saravanak@kernel.org>,
	"Rafael J . Wysocki" <rafael@kernel.org>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	<linux-pm@vger.kernel.org>,
	"Sudeep Holla" <sudeep.holla@kernel.org>,
	"Cristian Marussi" <cristian.marussi@arm.com>,
	"Kevin Hilman" <khilman@baylibre.com>,
	"Stephen Boyd" <sboyd@kernel.org>,
	"Marek Szyprowski" <m.szyprowski@samsung.com>,
	"Bjorn Andersson" <andersson@kernel.org>,
	"Abel Vesa" <abel.vesa@oss.qualcomm.com>,
	"Peng Fan" <peng.fan@oss.nxp.com>,
	"Tomi Valkeinen" <tomi.valkeinen@ideasonboard.com>,
	"Maulik Shah" <maulik.shah@oss.qualcomm.com>,
	"Konrad Dybcio" <konradybcio@kernel.org>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"Jonathan Hunter" <jonathanh@nvidia.com>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>,
	"Dmitry Baryshkov" <dmitry.baryshkov@oss.qualcomm.com>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-kernel@vger.kernel.org>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	<driver-core@lists.linux.dev>
Subject: Re: [PATCH v2 1/9] driver core: Enable suppliers to implement fine grained sync_state support
Date: Sat, 18 Apr 2026 13:23:44 +0200	[thread overview]
Message-ID: <DHW8QPU1VU1F.3P6PH69HLFBYC@kernel.org> (raw)
In-Reply-To: <20260410104058.83748-2-ulf.hansson@linaro.org>

On Fri Apr 10, 2026 at 12:40 PM CEST, Ulf Hansson wrote:
> The common sync_state support isn't fine grained enough for some types of
> suppliers, like power domains for example. Especially when a supplier
> provides multiple independent power domains, each with their own set of
> consumers. In these cases we need to wait for all consumers for all the
> provided power domains before invoking the supplier's ->sync_state().
>
> To allow a more fine grained sync_state support to be implemented on per
> supplier's driver basis, let's add a new optional callback. As soon as
> there is an update worth to consider in regards to managing sync_state for
> a supplier device, __device_links_queue_sync_state() invokes the callback.
>
> Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
> ---
>  drivers/base/core.c           | 7 ++++++-
>  include/linux/device/driver.h | 7 +++++++
>  2 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index 09b98f02f559..4085a011d8ca 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -1106,7 +1106,9 @@ int device_links_check_suppliers(struct device *dev)
>   * Queues a device for a sync_state() callback when the device links write lock
>   * isn't held. This allows the sync_state() execution flow to use device links
>   * APIs.  The caller must ensure this function is called with
> - * device_links_write_lock() held.
> + * device_links_write_lock() held.  Note, if the optional queue_sync_state()
> + * callback has been assigned too, it gets called for every update to allowing a

s/allowing/allow/

> + * more fine grained support to be implemented on per supplier basis.
>   *
>   * This function does a get_device() to make sure the device is not freed while
>   * on this list.
> @@ -1126,6 +1128,9 @@ static void __device_links_queue_sync_state(struct device *dev,
>  	if (dev->state_synced)
>  		return;
>  
> +	if (dev->driver && dev->driver->queue_sync_state)
> +		dev->driver->queue_sync_state(dev);

This seems to be called without the device lock being held, which seems to allow
the queue_sync_state() callback to execute concurrently with remove(). This
opens the door for all kinds of UAF conditions in drivers.

This also made me aware that the above dev_has_sync_state() is probably broken,
as it also performs the following check without the device lock being held.

	dev->driver && dev->driver->sync_state

I think nothing prevents dev->driver to become NULL concurrently; in this case
READ_ONCE() should be sufficient though as it doesn't execute the callback.

I will send a patch for this.

> +
>  	list_for_each_entry(link, &dev->links.consumers, s_node) {
>  		if (!device_link_test(link, DL_FLAG_MANAGED))
>  			continue;
> diff --git a/include/linux/device/driver.h b/include/linux/device/driver.h
> index bbc67ec513ed..bc9ae1cbe03c 100644
> --- a/include/linux/device/driver.h
> +++ b/include/linux/device/driver.h
> @@ -68,6 +68,12 @@ enum probe_type {
>   *		be called at late_initcall_sync level. If the device has
>   *		consumers that are never bound to a driver, this function
>   *		will never get called until they do.
> + * @queue_sync_state: Similar to the ->sync_state() callback, but called to
> + *		allow syncing device state to software state in a more fine
> + *		grained way. It is called when there is an updated state that
> + *		may be worth to consider for any of the consumers linked to
> + *		this device. If implemented, the ->sync_state() callback is
> + *		required too.

What happens if this is not the case? Maybe worth to check and warn about this
in driver_register().

>   * @remove:	Called when the device is removed from the system to
>   *		unbind a device from this driver.
>   * @shutdown:	Called at shut-down time to quiesce the device.
> @@ -110,6 +116,7 @@ struct device_driver {
>  
>  	int (*probe) (struct device *dev);
>  	void (*sync_state)(struct device *dev);
> +	void (*queue_sync_state)(struct device *dev);
>  	int (*remove) (struct device *dev);
>  	void (*shutdown) (struct device *dev);
>  	int (*suspend) (struct device *dev, pm_message_t state);
> -- 
> 2.43.0


  reply	other threads:[~2026-04-18 11:23 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-10 10:40 [PATCH v2 0/9] driver core / pmdomain: Add support for fined grained sync_state Ulf Hansson
2026-04-10 10:40 ` [PATCH v2 1/9] driver core: Enable suppliers to implement fine grained sync_state support Ulf Hansson
2026-04-18 11:23   ` Danilo Krummrich [this message]
2026-04-22 10:07     ` Ulf Hansson
2026-04-22 10:59       ` Danilo Krummrich
2026-05-05 11:12         ` Ulf Hansson
2026-05-05 12:46           ` Danilo Krummrich
2026-05-05 14:15             ` Ulf Hansson
2026-04-10 10:40 ` [PATCH v2 2/9] driver core: Add dev_set_drv_queue_sync_state() Ulf Hansson
2026-04-18 11:23   ` Danilo Krummrich
2026-04-22 10:25     ` Ulf Hansson
2026-04-22 11:30       ` Danilo Krummrich
2026-04-10 10:40 ` [PATCH v2 3/9] pmdomain: core: Move genpd_get_from_provider() Ulf Hansson
2026-04-10 10:40 ` [PATCH v2 4/9] pmdomain: core: Add initial fine grained sync_state support Ulf Hansson
2026-04-20  8:49   ` Geert Uytterhoeven
2026-04-10 10:40 ` [PATCH v2 5/9] pmdomain: core: Extend fine grained sync_state to more onecell providers Ulf Hansson
2026-04-10 10:40 ` [PATCH v2 6/9] pmdomain: core: Export a common function for ->queue_sync_state() Ulf Hansson
2026-04-10 10:40 ` [PATCH v2 7/9] pmdomain: renesas: rcar-gen4-sysc: Drop GENPD_FLAG_NO_STAY_ON Ulf Hansson
2026-04-10 10:40 ` [PATCH v2 8/9] pmdomain: renesas: rcar-sysc: " Ulf Hansson
2026-04-10 10:40 ` [PATCH v2 9/9] pmdomain: renesas: rmobile-sysc: " Ulf Hansson
2026-04-16  9:15 ` [PATCH v2 0/9] driver core / pmdomain: Add support for fined grained sync_state Geert Uytterhoeven
2026-04-16  9:42   ` Ulf Hansson
2026-04-17 11:27 ` Ulf Hansson
2026-04-18 11:23   ` Danilo Krummrich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DHW8QPU1VU1F.3P6PH69HLFBYC@kernel.org \
    --to=dakr@kernel.org \
    --cc=abel.vesa@oss.qualcomm.com \
    --cc=andersson@kernel.org \
    --cc=cristian.marussi@arm.com \
    --cc=dmitry.baryshkov@oss.qualcomm.com \
    --cc=driver-core@lists.linux.dev \
    --cc=geert+renesas@glider.be \
    --cc=geert@linux-m68k.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jonathanh@nvidia.com \
    --cc=khilman@baylibre.com \
    --cc=konradybcio@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=maulik.shah@oss.qualcomm.com \
    --cc=peng.fan@oss.nxp.com \
    --cc=rafael@kernel.org \
    --cc=saravanak@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=sudeep.holla@kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=tomi.valkeinen@ideasonboard.com \
    --cc=ulf.hansson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.