diff mbox

[v5,0/5] Functional dependencies between devices

Message ID a49cc8aa-84fe-5752-efdc-113a116e588d@samsung.com
State New
Headers show

Commit Message

Marek Szyprowski Oct. 20, 2016, 10:21 a.m. UTC
Hi Rafael,


On 2016-10-19 13:57, Rafael J. Wysocki wrote:
> On Tue, Oct 18, 2016 at 12:46 PM, Marek Szyprowski

> <m.szyprowski@samsung.com> wrote:

>> On 2016-10-10 14:36, Rafael J. Wysocki wrote:

>>> [...]

>>>

>>> One more update after some conversations during LinuxCon Europe.

>>>

>>> The main point was to make it possible for device_link_add() to figure out

>>> the

>>> initial state of the link instead of expecting the caller to provide it

>>> which

>>> might not be reliable enough in general.

>>>

>>> In this version device_link_add() takes three arguments, the supplier and

>>> consumer pointers and flags and it sets the correct initial state of the

>>> link

>>> automatically (unless invoked with the "stateless" flag, of course).  The

>>> cost

>>> is one additional field in struct device (I moved all of the links-related

>>> fields in struct device to a separate sub-structure while at it) to track

>>> the "driver presence status" of the device (to be used by

>>> device_link_add()).

>>>

>>> In addition to that, the links list walks in the core.c and dd.c code are

>>> under the device links mutex now, so the iternal link spinlock is not

>>> needed

>>> any more and I have renamed symbols to distinguish between flags, link

>>> states

>>> and device "driver presence statuses".

>>>

>>> More information is there in the changelogs.

>> Thanks for the update. This version is indeed easier to use and still works

>> fine

>> with my Exynos IOMMU runtime pm rework. You can keep my:

>>

>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>

>>

>> I will send updated version of my patchset soon.

> Thanks for the testing, much appreciated!

>

> The series is in a new branch called "device-links-test" in my tree now:

>

> git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git

> device-links-test


While working on integrating IOMMU deferred probing patches I found a bug,
which has been introduced in v4 of device dependency patchset (v3 worked
fine in this area, v5 also contains this bug). The following fixup is
needed to properly create links with DL_FLAG_PM_RUNTIME flag set during
consumer device probing:

From: Marek Szyprowski <m.szyprowski@samsung.com>

Date: Thu, 20 Oct 2016 12:12:14 +0200
Subject: [PATCH] driver core: fix runtime pm state for
  DEVICE_LINK_CONSUMER_PROBE links

If link is added during consumer probe with DL_FLAG_PM_RUNTIME flag set,
the code will do additional pm_runtime_put() on the supplier after
finishing consumer probing. This will break runtime pm operation for
the supplier device. To solve this issue, enforce additional call to
pm_runtime_get_sync() on the supplier device while creating such link.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>

---
  drivers/base/core.c | 3 +++
  1 file changed, 3 insertions(+)

       * of dpm_list and the devices_kset list.
-- 
1.9.1

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland

--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Rafael J. Wysocki Oct. 20, 2016, 12:54 p.m. UTC | #1
Hi,

On Thu, Oct 20, 2016 at 12:21 PM, Marek Szyprowski
<m.szyprowski@samsung.com> wrote:
> Hi Rafael,

>

>

> On 2016-10-19 13:57, Rafael J. Wysocki wrote:

>>

>> On Tue, Oct 18, 2016 at 12:46 PM, Marek Szyprowski

>> <m.szyprowski@samsung.com> wrote:

>>>

>>> On 2016-10-10 14:36, Rafael J. Wysocki wrote:

>>>>

>>>> [...]

>>>>

>>>> One more update after some conversations during LinuxCon Europe.

>>>>

>>>> The main point was to make it possible for device_link_add() to figure

>>>> out

>>>> the

>>>> initial state of the link instead of expecting the caller to provide it

>>>> which

>>>> might not be reliable enough in general.

>>>>

>>>> In this version device_link_add() takes three arguments, the supplier

>>>> and

>>>> consumer pointers and flags and it sets the correct initial state of the

>>>> link

>>>> automatically (unless invoked with the "stateless" flag, of course).

>>>> The

>>>> cost

>>>> is one additional field in struct device (I moved all of the

>>>> links-related

>>>> fields in struct device to a separate sub-structure while at it) to

>>>> track

>>>> the "driver presence status" of the device (to be used by

>>>> device_link_add()).

>>>>

>>>> In addition to that, the links list walks in the core.c and dd.c code

>>>> are

>>>> under the device links mutex now, so the iternal link spinlock is not

>>>> needed

>>>> any more and I have renamed symbols to distinguish between flags, link

>>>> states

>>>> and device "driver presence statuses".

>>>>

>>>> More information is there in the changelogs.

>>>

>>> Thanks for the update. This version is indeed easier to use and still

>>> works

>>> fine

>>> with my Exynos IOMMU runtime pm rework. You can keep my:

>>>

>>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>

>>>

>>> I will send updated version of my patchset soon.

>>

>> Thanks for the testing, much appreciated!

>>

>> The series is in a new branch called "device-links-test" in my tree now:

>>

>> git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git

>> device-links-test

>

>

> While working on integrating IOMMU deferred probing patches I found a bug,

> which has been introduced in v4 of device dependency patchset (v3 worked

> fine in this area, v5 also contains this bug). The following fixup is

> needed to properly create links with DL_FLAG_PM_RUNTIME flag set during

> consumer device probing:

>

> From: Marek Szyprowski <m.szyprowski@samsung.com>

> Date: Thu, 20 Oct 2016 12:12:14 +0200

> Subject: [PATCH] driver core: fix runtime pm state for

>  DEVICE_LINK_CONSUMER_PROBE links

>

> If link is added during consumer probe with DL_FLAG_PM_RUNTIME flag set,

> the code will do additional pm_runtime_put() on the supplier after

> finishing consumer probing. This will break runtime pm operation for

> the supplier device. To solve this issue, enforce additional call to

> pm_runtime_get_sync() on the supplier device while creating such link.

>

> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>

> ---

>  drivers/base/core.c | 3 +++

>  1 file changed, 3 insertions(+)

>

> diff --git a/drivers/base/core.c b/drivers/base/core.c

> index 48bc5a362f7d..d4cc285a1df7 100644

> --- a/drivers/base/core.c

> +++ b/drivers/base/core.c

> @@ -217,6 +217,9 @@ struct device_link *device_link_add(struct device

> *consumer,

>          }

>      }

>

> +    if (flags & DL_FLAG_PM_RUNTIME && status == DL_STATE_CONSUMER_PROBE)

> +        pm_runtime_get_sync(supplier);

> +


Good catch!

I'd prefer to do this slightly differently, though, so I'll send an
update of the runtime PM patch with this folded in shortly.

Thanks,
Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/base/core.c b/drivers/base/core.c
index 48bc5a362f7d..d4cc285a1df7 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -217,6 +217,9 @@  struct device_link *device_link_add(struct device 
*consumer,
          }
      }

+    if (flags & DL_FLAG_PM_RUNTIME && status == DL_STATE_CONSUMER_PROBE)
+        pm_runtime_get_sync(supplier);
+
      /*
       * Move the consumer and all of the devices depending on it to the end