Thread (17 messages) 17 messages, 6 authors, 2015-06-24

Re: [PATCH 2/2] PM / Domains: Avoid infinite loops in attach/detach code

From: Rafael J. Wysocki <hidden>
Date: 2015-06-24 13:44:15
Also in: linux-sh, lkml

On Tuesday, June 23, 2015 03:45:43 PM Geert Uytterhoeven wrote:
Hi Rafael,

On Tue, Jun 23, 2015 at 3:38 PM, Rafael J. Wysocki [off-list ref] wrote:
quoted
quoted
quoted
quoted
@@ -2218,10 +2227,13 @@ int genpd_dev_pm_attach(struct device *dev)

        dev_dbg(dev, "adding to PM domain %s\n", pd->name);

-       while (1) {
+       for (i = 0; i < GENPD_RETRIES; i++) {
                ret = pm_genpd_add_device(pd, dev);
                if (ret != -EAGAIN)
                        break;
+
+               if (i > GENPD_RETRIES / 2)
+                       udelay(GENPD_DELAY_US);
In this execution path, we retry when getting -EAGAIN while believing
the reason to the error are only *temporary* as we are soon waiting
for all devices in the genpd to be system PM resumed. At least that's
my understanding to why we want to deal with -EAGAIN here, but I might
be wrong.

In this regards, I wonder whether it could be better to re-try only a
few times but with a far longer interval time than a couple us. What
do you think?
That's indeed viable. I have no idea for how long this temporary state can
extend.
A usual approach to this kind of thing is to use exponential fallback
where you increase the delay twice with respect to the previous one
every time.
Right, but when do you give up?
Well, I guess you know what a reasonable timeout should be?
Note that udelay() is a busy loop. Should it fall back to msleep() after
a while?
If we can't fall back to msleep() at one point, you may as well simply poll
periodically as you did originally.

Thanks,
Rafael
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help