linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] block: paride: on26: Replace mdelay with msleep in on26_test_port
@ 2018-01-26 15:42 Jia-Ju Bai
  2018-01-26 17:31 ` Al Viro
  0 siblings, 1 reply; 3+ messages in thread
From: Jia-Ju Bai @ 2018-01-26 15:42 UTC (permalink / raw)
  To: tim; +Cc: linux-kernel, Jia-Ju Bai

After checking all possible call chains to on26_test_port() here,
my tool finds that this function is never called in atomic context,
namely never in an interrupt handler or holding a spinlock.
And on26_test_port() is only called by pi_probe_unit() that calls 
wait_event() through pi_claim(),
so it indicates that on26_test_port() can call functions that can sleep.
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/block/paride/on26.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/block/paride/on26.c b/drivers/block/paride/on26.c
index 95ba256..3240d6f 100644
--- a/drivers/block/paride/on26.c
+++ b/drivers/block/paride/on26.c
@@ -163,7 +163,7 @@ static int on26_test_port( PIA *pi)  /* hard reset */
                 on26_write_regr(pi,0,6,0xb0);
                 y = on26_read_regr(pi,0,7);
                 if (!((x&0x80)||(y&0x80))) break;
-                mdelay(100);
+                msleep(100);
             }
 
 	    if (i == RESET_WAIT) 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] block: paride: on26: Replace mdelay with msleep in on26_test_port
  2018-01-26 15:42 [PATCH] block: paride: on26: Replace mdelay with msleep in on26_test_port Jia-Ju Bai
@ 2018-01-26 17:31 ` Al Viro
  2018-01-27  4:13   ` Jia-Ju Bai
  0 siblings, 1 reply; 3+ messages in thread
From: Al Viro @ 2018-01-26 17:31 UTC (permalink / raw)
  To: Jia-Ju Bai; +Cc: tim, linux-kernel

On Fri, Jan 26, 2018 at 11:42:25PM +0800, Jia-Ju Bai wrote:
> After checking all possible call chains to on26_test_port() here,
> my tool finds that this function is never called in atomic context,
> namely never in an interrupt handler or holding a spinlock.
> And on26_test_port() is only called by pi_probe_unit() that calls 
> wait_event() through pi_claim(),
> so it indicates that on26_test_port() can call functions that can sleep.
> Thus mdelay can be replaced with msleep to avoid busy wait.

Sigh...  Here's how I would've written it:

"
on26_test_port() is never called from atomic contexts.

It has no direct callers and it is reachable only via ->test_port.
->test_port has only one user:
drivers/block/paride/paride.c:322:              max = pi->proto->test_port(pi);
in pi_probe_unit().  That gets called only from pi_init(), called from
p{d,cd,f,t,g}_detect(), called from module_init stuff, all of the above
without entering atomic contexts along the way.

Despite never getting called from atomic contexts, on26_test_port() contains
mdelay(100), i.e. busy-loops for 0.1s; that's neither nice nor needed, since
msleep() would serve just as well.

Found by [reference to tool]"

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] block: paride: on26: Replace mdelay with msleep in on26_test_port
  2018-01-26 17:31 ` Al Viro
@ 2018-01-27  4:13   ` Jia-Ju Bai
  0 siblings, 0 replies; 3+ messages in thread
From: Jia-Ju Bai @ 2018-01-27  4:13 UTC (permalink / raw)
  To: Al Viro; +Cc: tim, linux-kernel



On 2018/1/27 1:31, Al Viro wrote:
> On Fri, Jan 26, 2018 at 11:42:25PM +0800, Jia-Ju Bai wrote:
>> After checking all possible call chains to on26_test_port() here,
>> my tool finds that this function is never called in atomic context,
>> namely never in an interrupt handler or holding a spinlock.
>> And on26_test_port() is only called by pi_probe_unit() that calls
>> wait_event() through pi_claim(),
>> so it indicates that on26_test_port() can call functions that can sleep.
>> Thus mdelay can be replaced with msleep to avoid busy wait.
> Sigh...  Here's how I would've written it:
>
> "
> on26_test_port() is never called from atomic contexts.
>
> It has no direct callers and it is reachable only via ->test_port.
> ->test_port has only one user:
> drivers/block/paride/paride.c:322:              max = pi->proto->test_port(pi);
> in pi_probe_unit().  That gets called only from pi_init(), called from
> p{d,cd,f,t,g}_detect(), called from module_init stuff, all of the above
> without entering atomic contexts along the way.
>
> Despite never getting called from atomic contexts, on26_test_port() contains
> mdelay(100), i.e. busy-loops for 0.1s; that's neither nice nor needed, since
> msleep() would serve just as well.
>
> Found by [reference to tool]"

Okay, thanks for your patient guidance :)
I will revise the description and send v2 patch, and follow the advice 
in my next patches.


Thanks,
Jia-Ju Bai

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-01-27  4:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-26 15:42 [PATCH] block: paride: on26: Replace mdelay with msleep in on26_test_port Jia-Ju Bai
2018-01-26 17:31 ` Al Viro
2018-01-27  4:13   ` Jia-Ju Bai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).