diff mbox

base: power: domain: Replace mdelay with msleep

Message ID 1516955899-31810-1-git-send-email-baijiaju1990@gmail.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Jia-Ju Bai Jan. 26, 2018, 8:38 a.m. UTC
After checking all possible call chains to genpd_dev_pm_detach() and
genpd_dev_pm_attach() here,
my tool finds that these functions are never called in atomic context,
namely never in an interrupt handler or holding a spinlock.
Thus mdelay can be replaced with msleep to avoid busy wait.

This is found by a static analysis tool named DCNS written by myself.

Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
---
 drivers/base/power/domain.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Pavel Machek Jan. 26, 2018, 10:26 a.m. UTC | #1
On Fri 2018-01-26 16:38:19, Jia-Ju Bai wrote:
> After checking all possible call chains to genpd_dev_pm_detach() and
> genpd_dev_pm_attach() here,
> my tool finds that these functions are never called in atomic context,
> namely never in an interrupt handler or holding a spinlock.
> Thus mdelay can be replaced with msleep to avoid busy wait.
> 
> This is found by a static analysis tool named DCNS written by
myself.

Well, cond_resched() just after msleep certainly looks like that.

Did the patch receive any testing?

> Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
> ---
>  drivers/base/power/domain.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> index 0c80bea..f84ac72 100644
> --- a/drivers/base/power/domain.c
> +++ b/drivers/base/power/domain.c
> @@ -2144,7 +2144,7 @@ static void genpd_dev_pm_detach(struct device *dev, bool power_off)
>  		if (ret != -EAGAIN)
>  			break;
>  
> -		mdelay(i);
> +		msleep(i);
>  		cond_resched();
>  	}
>  
> @@ -2231,7 +2231,7 @@ int genpd_dev_pm_attach(struct device *dev)
>  		if (ret != -EAGAIN)
>  			break;
>  
> -		mdelay(i);
> +		msleep(i);
>  		cond_resched();
>  	}
>  	mutex_unlock(&gpd_list_lock);
Jia-Ju Bai Jan. 26, 2018, 10:28 a.m. UTC | #2
On 2018/1/26 18:26, Pavel Machek wrote:
> On Fri 2018-01-26 16:38:19, Jia-Ju Bai wrote:
>> After checking all possible call chains to genpd_dev_pm_detach() and
>> genpd_dev_pm_attach() here,
>> my tool finds that these functions are never called in atomic context,
>> namely never in an interrupt handler or holding a spinlock.
>> Thus mdelay can be replaced with msleep to avoid busy wait.
>>
>> This is found by a static analysis tool named DCNS written by
> myself.
>
> Well, cond_resched() just after msleep certainly looks like that.
>
> Did the patch receive any testing?
>

Thanks for reply :)

I only perform compilation testing but did not run it in real execution.


Thanks,
Jia-Ju Bai
Rafael J. Wysocki Feb. 9, 2018, 11:56 a.m. UTC | #3
On Friday, January 26, 2018 9:38:19 AM CET Jia-Ju Bai wrote:
> After checking all possible call chains to genpd_dev_pm_detach() and
> genpd_dev_pm_attach() here,
> my tool finds that these functions are never called in atomic context,
> namely never in an interrupt handler or holding a spinlock.
> Thus mdelay can be replaced with msleep to avoid busy wait.
> 
> This is found by a static analysis tool named DCNS written by myself.
> 
> Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
> ---
>  drivers/base/power/domain.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> index 0c80bea..f84ac72 100644
> --- a/drivers/base/power/domain.c
> +++ b/drivers/base/power/domain.c
> @@ -2144,7 +2144,7 @@ static void genpd_dev_pm_detach(struct device *dev, bool power_off)
>  		if (ret != -EAGAIN)
>  			break;
>  
> -		mdelay(i);
> +		msleep(i);
>  		cond_resched();
>  	}
>  
> @@ -2231,7 +2231,7 @@ int genpd_dev_pm_attach(struct device *dev)
>  		if (ret != -EAGAIN)
>  			break;
>  
> -		mdelay(i);
> +		msleep(i);
>  		cond_resched();
>  	}
>  	mutex_unlock(&gpd_list_lock);
> 

Ulf, Kevin, any concerns or objections?
Ulf Hansson Feb. 9, 2018, 1:58 p.m. UTC | #4
On 26 January 2018 at 09:38, Jia-Ju Bai <baijiaju1990@gmail.com> wrote:
> After checking all possible call chains to genpd_dev_pm_detach() and
> genpd_dev_pm_attach() here,
> my tool finds that these functions are never called in atomic context,
> namely never in an interrupt handler or holding a spinlock.
> Thus mdelay can be replaced with msleep to avoid busy wait.
>
> This is found by a static analysis tool named DCNS written by myself.
>
> Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
> ---
>  drivers/base/power/domain.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> index 0c80bea..f84ac72 100644
> --- a/drivers/base/power/domain.c
> +++ b/drivers/base/power/domain.c
> @@ -2144,7 +2144,7 @@ static void genpd_dev_pm_detach(struct device *dev, bool power_off)
>                 if (ret != -EAGAIN)
>                         break;
>
> -               mdelay(i);
> +               msleep(i);

This looks like a nice improvement, however moving to msleep() makes
the call to cond_resched() below a bit superfluous. Perhaps remove
that as well.

>                 cond_resched();
>         }
>
> @@ -2231,7 +2231,7 @@ int genpd_dev_pm_attach(struct device *dev)
>                 if (ret != -EAGAIN)
>                         break;
>
> -               mdelay(i);
> +               msleep(i);

Ditto.

>                 cond_resched();
>         }
>         mutex_unlock(&gpd_list_lock);
> --
> 1.7.9.5
>

Kind regards
Uffe
Lucas Stach Feb. 12, 2018, 10:38 a.m. UTC | #5
Am Freitag, den 09.02.2018, 14:58 +0100 schrieb Ulf Hansson:
> On 26 January 2018 at 09:38, Jia-Ju Bai <baijiaju1990@gmail.com>
> wrote:
> > After checking all possible call chains to genpd_dev_pm_detach()
> > and
> > genpd_dev_pm_attach() here,
> > my tool finds that these functions are never called in atomic
> > context,
> > namely never in an interrupt handler or holding a spinlock.
> > Thus mdelay can be replaced with msleep to avoid busy wait.
> > 
> > This is found by a static analysis tool named DCNS written by
> > myself.
> > 
> > Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
> > ---
> >  drivers/base/power/domain.c |    4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/base/power/domain.c
> > b/drivers/base/power/domain.c
> > index 0c80bea..f84ac72 100644
> > --- a/drivers/base/power/domain.c
> > +++ b/drivers/base/power/domain.c
> > @@ -2144,7 +2144,7 @@ static void genpd_dev_pm_detach(struct device
> > *dev, bool power_off)
> >                 if (ret != -EAGAIN)
> >                         break;
> > 
> > -               mdelay(i);
> > +               msleep(i);
> 
> This looks like a nice improvement, however moving to msleep() makes
> the call to cond_resched() below a bit superfluous. Perhaps remove
> that as well.

At least for small values of i, msleep also has a high chance to
overshoot the desired sleep by a lot. It would be better to convert
them to usleep_range with an acceptable slack.

Regards,
Lucas

> >                 cond_resched();
> >         }
> > 
> > @@ -2231,7 +2231,7 @@ int genpd_dev_pm_attach(struct device *dev)
> >                 if (ret != -EAGAIN)
> >                         break;
> > 
> > -               mdelay(i);
> > +               msleep(i);
> 
> Ditto.
> 
> >                 cond_resched();
> >         }
> >         mutex_unlock(&gpd_list_lock);
> > --
> > 1.7.9.5
> > 
> 
> Kind regards
> Uffe
Ulf Hansson Feb. 12, 2018, 12:40 p.m. UTC | #6
On 12 February 2018 at 11:38, Lucas Stach <l.stach@pengutronix.de> wrote:
> Am Freitag, den 09.02.2018, 14:58 +0100 schrieb Ulf Hansson:
>> On 26 January 2018 at 09:38, Jia-Ju Bai <baijiaju1990@gmail.com>
>> wrote:
>> > After checking all possible call chains to genpd_dev_pm_detach()
>> > and
>> > genpd_dev_pm_attach() here,
>> > my tool finds that these functions are never called in atomic
>> > context,
>> > namely never in an interrupt handler or holding a spinlock.
>> > Thus mdelay can be replaced with msleep to avoid busy wait.
>> >
>> > This is found by a static analysis tool named DCNS written by
>> > myself.
>> >
>> > Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
>> > ---
>> >  drivers/base/power/domain.c |    4 ++--
>> >  1 file changed, 2 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/drivers/base/power/domain.c
>> > b/drivers/base/power/domain.c
>> > index 0c80bea..f84ac72 100644
>> > --- a/drivers/base/power/domain.c
>> > +++ b/drivers/base/power/domain.c
>> > @@ -2144,7 +2144,7 @@ static void genpd_dev_pm_detach(struct device
>> > *dev, bool power_off)
>> >                 if (ret != -EAGAIN)
>> >                         break;
>> >
>> > -               mdelay(i);
>> > +               msleep(i);
>>
>> This looks like a nice improvement, however moving to msleep() makes
>> the call to cond_resched() below a bit superfluous. Perhaps remove
>> that as well.
>
> At least for small values of i, msleep also has a high chance to
> overshoot the desired sleep by a lot. It would be better to convert
> them to usleep_range with an acceptable slack.

Ack!

[...]

Kind regards
Uffe
diff mbox

Patch

diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 0c80bea..f84ac72 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -2144,7 +2144,7 @@  static void genpd_dev_pm_detach(struct device *dev, bool power_off)
 		if (ret != -EAGAIN)
 			break;
 
-		mdelay(i);
+		msleep(i);
 		cond_resched();
 	}
 
@@ -2231,7 +2231,7 @@  int genpd_dev_pm_attach(struct device *dev)
 		if (ret != -EAGAIN)
 			break;
 
-		mdelay(i);
+		msleep(i);
 		cond_resched();
 	}
 	mutex_unlock(&gpd_list_lock);