From: <peter.wang@mediatek.com>
To: <matthias.bgg@gmail.com>, <len.brown@intel.com>, <pavel@ucw.cz>,
<rafael@kernel.org>, <gregkh@linuxfoundation.org>,
<stanley.chu@mediatek.com>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <linux-pm@vger.kernel.org>,
<martin.petersen@oracle.com>, <avri.altman@wdc.com>,
<alim.akhtar@samsung.com>, <jejb@linux.ibm.com>
Cc: <wsd_upstream@mediatek.com>, <linux-mediatek@lists.infradead.org>,
<peter.wang@mediatek.com>, <chun-hung.wu@mediatek.com>,
<alice.chao@mediatek.com>, <cc.chou@mediatek.com>,
<chaotian.jing@mediatek.com>, <jiajie.hao@mediatek.com>,
<powen.kao@mediatek.com>, <qilin.tan@mediatek.com>,
<lin.gui@mediatek.com>, <tun-yu.yu@mediatek.com>
Subject: [PATCH v1] PM-runtime: Check supplier_preactivated before release supplier
Date: Mon, 13 Jun 2022 20:07:55 +0800 [thread overview]
Message-ID: <20220613120755.14306-1-peter.wang@mediatek.com> (raw)
From: Peter Wang <peter.wang@mediatek.com>
With divice link of DL_FLAG_PM_RUNTIME, if consumer call pm_runtime_get_suppliers
to prevent supplier enter suspend, pm_runtime_release_supplier should
check supplier_preactivated before let supplier enter suspend.
If the link is drop or release, bypass check supplier_preactivated.
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
drivers/base/core.c | 2 +-
drivers/base/power/runtime.c | 15 ++++++++++++---
include/linux/pm_runtime.h | 5 +++--
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 7cd789c4985d..3b9cc559928f 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -486,7 +486,7 @@ static void device_link_release_fn(struct work_struct *work)
/* Ensure that all references to the link object have been dropped. */
device_link_synchronize_removal();
- pm_runtime_release_supplier(link, true);
+ pm_runtime_release_supplier(link, true, true);
put_device(link->consumer);
put_device(link->supplier);
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 676dc72d912d..3c4f425937a1 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -314,10 +314,19 @@ static int rpm_get_suppliers(struct device *dev)
* and if @check_idle is set, check if that device is idle (and so it can be
* suspended).
*/
-void pm_runtime_release_supplier(struct device_link *link, bool check_idle)
+void pm_runtime_release_supplier(struct device_link *link, bool check_idle,
+ bool drop)
{
struct device *supplier = link->supplier;
+ /*
+ * When consumer hold supplier, supplier cannot enter suspend.
+ * Driect release supplier and let supplier enter suspend is not allow.
+ * Unless the link is drop, direct relsease supplier should be okay.
+ */
+ if (link->supplier_preactivated && !drop)
+ return;
+
/*
* The additional power.usage_count check is a safety net in case
* the rpm_active refcount becomes saturated, in which case
@@ -338,7 +347,7 @@ static void __rpm_put_suppliers(struct device *dev, bool try_to_suspend)
list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
device_links_read_lock_held())
- pm_runtime_release_supplier(link, try_to_suspend);
+ pm_runtime_release_supplier(link, try_to_suspend, false);
}
static void rpm_put_suppliers(struct device *dev)
@@ -1838,7 +1847,7 @@ void pm_runtime_drop_link(struct device_link *link)
return;
pm_runtime_drop_link_count(link->consumer);
- pm_runtime_release_supplier(link, true);
+ pm_runtime_release_supplier(link, true, true);
}
static bool pm_runtime_need_not_resume(struct device *dev)
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
index 9e4d056967c6..354ffb1eaec0 100644
--- a/include/linux/pm_runtime.h
+++ b/include/linux/pm_runtime.h
@@ -88,7 +88,8 @@ extern void pm_runtime_get_suppliers(struct device *dev);
extern void pm_runtime_put_suppliers(struct device *dev);
extern void pm_runtime_new_link(struct device *dev);
extern void pm_runtime_drop_link(struct device_link *link);
-extern void pm_runtime_release_supplier(struct device_link *link, bool check_idle);
+extern void pm_runtime_release_supplier(struct device_link *link,
+ bool check_idle, bool drop);
extern int devm_pm_runtime_enable(struct device *dev);
@@ -315,7 +316,7 @@ static inline void pm_runtime_put_suppliers(struct device *dev) {}
static inline void pm_runtime_new_link(struct device *dev) {}
static inline void pm_runtime_drop_link(struct device_link *link) {}
static inline void pm_runtime_release_supplier(struct device_link *link,
- bool check_idle) {}
+ bool check_idle, bool drop) {}
#endif /* !CONFIG_PM */
--
2.18.0
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek
WARNING: multiple messages have this Message-ID (diff)
From: <peter.wang@mediatek.com>
To: <matthias.bgg@gmail.com>, <len.brown@intel.com>, <pavel@ucw.cz>,
<rafael@kernel.org>, <gregkh@linuxfoundation.org>,
<stanley.chu@mediatek.com>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <linux-pm@vger.kernel.org>,
<martin.petersen@oracle.com>, <avri.altman@wdc.com>,
<alim.akhtar@samsung.com>, <jejb@linux.ibm.com>
Cc: <wsd_upstream@mediatek.com>, <linux-mediatek@lists.infradead.org>,
<peter.wang@mediatek.com>, <chun-hung.wu@mediatek.com>,
<alice.chao@mediatek.com>, <cc.chou@mediatek.com>,
<chaotian.jing@mediatek.com>, <jiajie.hao@mediatek.com>,
<powen.kao@mediatek.com>, <qilin.tan@mediatek.com>,
<lin.gui@mediatek.com>, <tun-yu.yu@mediatek.com>
Subject: [PATCH v1] PM-runtime: Check supplier_preactivated before release supplier
Date: Mon, 13 Jun 2022 20:07:55 +0800 [thread overview]
Message-ID: <20220613120755.14306-1-peter.wang@mediatek.com> (raw)
From: Peter Wang <peter.wang@mediatek.com>
With divice link of DL_FLAG_PM_RUNTIME, if consumer call pm_runtime_get_suppliers
to prevent supplier enter suspend, pm_runtime_release_supplier should
check supplier_preactivated before let supplier enter suspend.
If the link is drop or release, bypass check supplier_preactivated.
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
drivers/base/core.c | 2 +-
drivers/base/power/runtime.c | 15 ++++++++++++---
include/linux/pm_runtime.h | 5 +++--
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 7cd789c4985d..3b9cc559928f 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -486,7 +486,7 @@ static void device_link_release_fn(struct work_struct *work)
/* Ensure that all references to the link object have been dropped. */
device_link_synchronize_removal();
- pm_runtime_release_supplier(link, true);
+ pm_runtime_release_supplier(link, true, true);
put_device(link->consumer);
put_device(link->supplier);
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 676dc72d912d..3c4f425937a1 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -314,10 +314,19 @@ static int rpm_get_suppliers(struct device *dev)
* and if @check_idle is set, check if that device is idle (and so it can be
* suspended).
*/
-void pm_runtime_release_supplier(struct device_link *link, bool check_idle)
+void pm_runtime_release_supplier(struct device_link *link, bool check_idle,
+ bool drop)
{
struct device *supplier = link->supplier;
+ /*
+ * When consumer hold supplier, supplier cannot enter suspend.
+ * Driect release supplier and let supplier enter suspend is not allow.
+ * Unless the link is drop, direct relsease supplier should be okay.
+ */
+ if (link->supplier_preactivated && !drop)
+ return;
+
/*
* The additional power.usage_count check is a safety net in case
* the rpm_active refcount becomes saturated, in which case
@@ -338,7 +347,7 @@ static void __rpm_put_suppliers(struct device *dev, bool try_to_suspend)
list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
device_links_read_lock_held())
- pm_runtime_release_supplier(link, try_to_suspend);
+ pm_runtime_release_supplier(link, try_to_suspend, false);
}
static void rpm_put_suppliers(struct device *dev)
@@ -1838,7 +1847,7 @@ void pm_runtime_drop_link(struct device_link *link)
return;
pm_runtime_drop_link_count(link->consumer);
- pm_runtime_release_supplier(link, true);
+ pm_runtime_release_supplier(link, true, true);
}
static bool pm_runtime_need_not_resume(struct device *dev)
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
index 9e4d056967c6..354ffb1eaec0 100644
--- a/include/linux/pm_runtime.h
+++ b/include/linux/pm_runtime.h
@@ -88,7 +88,8 @@ extern void pm_runtime_get_suppliers(struct device *dev);
extern void pm_runtime_put_suppliers(struct device *dev);
extern void pm_runtime_new_link(struct device *dev);
extern void pm_runtime_drop_link(struct device_link *link);
-extern void pm_runtime_release_supplier(struct device_link *link, bool check_idle);
+extern void pm_runtime_release_supplier(struct device_link *link,
+ bool check_idle, bool drop);
extern int devm_pm_runtime_enable(struct device *dev);
@@ -315,7 +316,7 @@ static inline void pm_runtime_put_suppliers(struct device *dev) {}
static inline void pm_runtime_new_link(struct device *dev) {}
static inline void pm_runtime_drop_link(struct device_link *link) {}
static inline void pm_runtime_release_supplier(struct device_link *link,
- bool check_idle) {}
+ bool check_idle, bool drop) {}
#endif /* !CONFIG_PM */
--
2.18.0
WARNING: multiple messages have this Message-ID (diff)
From: <peter.wang@mediatek.com>
To: <matthias.bgg@gmail.com>, <len.brown@intel.com>, <pavel@ucw.cz>,
<rafael@kernel.org>, <gregkh@linuxfoundation.org>,
<stanley.chu@mediatek.com>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <linux-pm@vger.kernel.org>,
<martin.petersen@oracle.com>, <avri.altman@wdc.com>,
<alim.akhtar@samsung.com>, <jejb@linux.ibm.com>
Cc: <wsd_upstream@mediatek.com>, <linux-mediatek@lists.infradead.org>,
<peter.wang@mediatek.com>, <chun-hung.wu@mediatek.com>,
<alice.chao@mediatek.com>, <cc.chou@mediatek.com>,
<chaotian.jing@mediatek.com>, <jiajie.hao@mediatek.com>,
<powen.kao@mediatek.com>, <qilin.tan@mediatek.com>,
<lin.gui@mediatek.com>, <tun-yu.yu@mediatek.com>
Subject: [PATCH v1] PM-runtime: Check supplier_preactivated before release supplier
Date: Mon, 13 Jun 2022 20:07:55 +0800 [thread overview]
Message-ID: <20220613120755.14306-1-peter.wang@mediatek.com> (raw)
From: Peter Wang <peter.wang@mediatek.com>
With divice link of DL_FLAG_PM_RUNTIME, if consumer call pm_runtime_get_suppliers
to prevent supplier enter suspend, pm_runtime_release_supplier should
check supplier_preactivated before let supplier enter suspend.
If the link is drop or release, bypass check supplier_preactivated.
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
---
drivers/base/core.c | 2 +-
drivers/base/power/runtime.c | 15 ++++++++++++---
include/linux/pm_runtime.h | 5 +++--
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 7cd789c4985d..3b9cc559928f 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -486,7 +486,7 @@ static void device_link_release_fn(struct work_struct *work)
/* Ensure that all references to the link object have been dropped. */
device_link_synchronize_removal();
- pm_runtime_release_supplier(link, true);
+ pm_runtime_release_supplier(link, true, true);
put_device(link->consumer);
put_device(link->supplier);
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 676dc72d912d..3c4f425937a1 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -314,10 +314,19 @@ static int rpm_get_suppliers(struct device *dev)
* and if @check_idle is set, check if that device is idle (and so it can be
* suspended).
*/
-void pm_runtime_release_supplier(struct device_link *link, bool check_idle)
+void pm_runtime_release_supplier(struct device_link *link, bool check_idle,
+ bool drop)
{
struct device *supplier = link->supplier;
+ /*
+ * When consumer hold supplier, supplier cannot enter suspend.
+ * Driect release supplier and let supplier enter suspend is not allow.
+ * Unless the link is drop, direct relsease supplier should be okay.
+ */
+ if (link->supplier_preactivated && !drop)
+ return;
+
/*
* The additional power.usage_count check is a safety net in case
* the rpm_active refcount becomes saturated, in which case
@@ -338,7 +347,7 @@ static void __rpm_put_suppliers(struct device *dev, bool try_to_suspend)
list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
device_links_read_lock_held())
- pm_runtime_release_supplier(link, try_to_suspend);
+ pm_runtime_release_supplier(link, try_to_suspend, false);
}
static void rpm_put_suppliers(struct device *dev)
@@ -1838,7 +1847,7 @@ void pm_runtime_drop_link(struct device_link *link)
return;
pm_runtime_drop_link_count(link->consumer);
- pm_runtime_release_supplier(link, true);
+ pm_runtime_release_supplier(link, true, true);
}
static bool pm_runtime_need_not_resume(struct device *dev)
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
index 9e4d056967c6..354ffb1eaec0 100644
--- a/include/linux/pm_runtime.h
+++ b/include/linux/pm_runtime.h
@@ -88,7 +88,8 @@ extern void pm_runtime_get_suppliers(struct device *dev);
extern void pm_runtime_put_suppliers(struct device *dev);
extern void pm_runtime_new_link(struct device *dev);
extern void pm_runtime_drop_link(struct device_link *link);
-extern void pm_runtime_release_supplier(struct device_link *link, bool check_idle);
+extern void pm_runtime_release_supplier(struct device_link *link,
+ bool check_idle, bool drop);
extern int devm_pm_runtime_enable(struct device *dev);
@@ -315,7 +316,7 @@ static inline void pm_runtime_put_suppliers(struct device *dev) {}
static inline void pm_runtime_new_link(struct device *dev) {}
static inline void pm_runtime_drop_link(struct device_link *link) {}
static inline void pm_runtime_release_supplier(struct device_link *link,
- bool check_idle) {}
+ bool check_idle, bool drop) {}
#endif /* !CONFIG_PM */
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next reply other threads:[~2022-06-13 12:15 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-13 12:07 peter.wang [this message]
2022-06-13 12:07 ` [PATCH v1] PM-runtime: Check supplier_preactivated before release supplier peter.wang
2022-06-13 12:07 ` peter.wang
2022-06-22 6:09 ` Peter Wang
2022-06-22 6:48 ` Greg KH
2022-06-22 6:48 ` Greg KH
2022-06-27 14:14 ` Greg KH
2022-06-27 14:14 ` Greg KH
2022-06-27 14:27 ` Rafael J. Wysocki
2022-06-27 14:27 ` Rafael J. Wysocki
2022-06-28 1:49 ` Peter Wang
2022-06-27 19:00 ` Rafael J. Wysocki
2022-06-27 19:00 ` Rafael J. Wysocki
2022-06-28 1:53 ` Peter Wang
2022-06-28 15:54 ` Rafael J. Wysocki
2022-06-28 15:54 ` Rafael J. Wysocki
[not found] ` <b55d5691-0b2d-56bb-26ff-dcac56770611@mediatek.com>
[not found] ` <CAJZ5v0gTpv2gt_Gm9rUd+8Jmp4=ij2=J20o7qO0sC-hm=w3=_A@mail.gmail.com>
2022-06-29 16:01 ` Rafael J. Wysocki
2022-06-30 14:26 ` Peter Wang
2022-06-30 14:47 ` Rafael J. Wysocki
2022-06-30 15:19 ` Peter Wang
2022-06-30 16:28 ` Rafael J. Wysocki
2022-07-01 10:21 ` Peter Wang
2022-08-02 3:19 ` Peter Wang
2022-08-02 11:01 ` Rafael J. Wysocki
2022-08-02 13:33 ` Peter Wang
2022-10-12 10:31 ` Nitin Rawat
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=20220613120755.14306-1-peter.wang@mediatek.com \
--to=peter.wang@mediatek.com \
--cc=alice.chao@mediatek.com \
--cc=alim.akhtar@samsung.com \
--cc=avri.altman@wdc.com \
--cc=cc.chou@mediatek.com \
--cc=chaotian.jing@mediatek.com \
--cc=chun-hung.wu@mediatek.com \
--cc=gregkh@linuxfoundation.org \
--cc=jejb@linux.ibm.com \
--cc=jiajie.hao@mediatek.com \
--cc=len.brown@intel.com \
--cc=lin.gui@mediatek.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-pm@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=matthias.bgg@gmail.com \
--cc=pavel@ucw.cz \
--cc=powen.kao@mediatek.com \
--cc=qilin.tan@mediatek.com \
--cc=rafael@kernel.org \
--cc=stanley.chu@mediatek.com \
--cc=tun-yu.yu@mediatek.com \
--cc=wsd_upstream@mediatek.com \
/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.