2008-03-26 14:48:20

by Richard Kennedy

[permalink] [raw]
Subject: ohci : strange looking use of round_jiffies_relative. possible bug ?

I was looking at the uses of round_jiffies and noticed that the ohci
unlink_watchdog_func() calls
mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));

Which looks a bit strange as it will set the timer to 0 <= t < HZ.
Reading the comments I think that is really is expecting to setup timer
to (now + 1s)

mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));

If this is not true then perhaps it needs a comment to explain what it
_is_ trying to do, because it's got me baffled ;)


Cheers
Richard



2008-03-26 15:37:58

by Alan Stern

[permalink] [raw]
Subject: Re: ohci : strange looking use of round_jiffies_relative. possible bug ?

On Wed, 26 Mar 2008, Richard Kennedy wrote:

> I was looking at the uses of round_jiffies and noticed that the ohci
> unlink_watchdog_func() calls
> mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));
>
> Which looks a bit strange as it will set the timer to 0 <= t < HZ.
> Reading the comments I think that is really is expecting to setup timer
> to (now + 1s)
>
> mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));
>
> If this is not true then perhaps it needs a comment to explain what it
> _is_ trying to do, because it's got me baffled ;)

I'd say it's a bug. Or rather a pair of bugs, since that mod_timer()
call appears in two places.

Alan Stern

2008-03-26 15:46:59

by Richard Kennedy

[permalink] [raw]
Subject: Re: ohci : strange looking use of round_jiffies_relative. possible bug ?


On Wed, 2008-03-26 at 11:37 -0400, Alan Stern wrote:
> On Wed, 26 Mar 2008, Richard Kennedy wrote:
>
> > I was looking at the uses of round_jiffies and noticed that the ohci
> > unlink_watchdog_func() calls
> > mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));
> >
> > Which looks a bit strange as it will set the timer to 0 <= t < HZ.
> > Reading the comments I think that is really is expecting to setup timer
> > to (now + 1s)
> >
> > mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));
> >
> > If this is not true then perhaps it needs a comment to explain what it
> > _is_ trying to do, because it's got me baffled ;)
>
> I'd say it's a bug. Or rather a pair of bugs, since that mod_timer()
> call appears in two places.
>
> Alan Stern
>
Thanks. In that case I'll post a patch.
Richard

2008-03-26 16:33:29

by Richard Kennedy

[permalink] [raw]
Subject: [patch] usb ohci : fix 2 timers to fire at jiffies + 1s

Code inspection discovered in 2 places timers were being
incorrectly setup using round_jiffies_relative(HZ).
The timer would then fire at time (0 <= T < HZ).

Fix them to use round_jiffies(jiffies + HZ);

Signed-off-by: Richard Kennedy <[email protected]>
---

compiled on latest v2.6.25-rc7-11 git head but not otherwise tested.
Richard

diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index dd4798e..33f1c1c 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -467,7 +467,7 @@ static void unlink_watchdog_func(unsigned long _ohci)
out:
kfree(seen);
if (ohci->eds_scheduled)
- mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));
+ mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));
done:
spin_unlock_irqrestore(&ohci->lock, flags);
}
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
index 5181732..9c9f3b5 100644
--- a/drivers/usb/host/ohci-q.c
+++ b/drivers/usb/host/ohci-q.c
@@ -169,7 +169,7 @@ static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed)
if (quirk_zfmicro(ohci)
&& (ed->type == PIPE_INTERRUPT)
&& !(ohci->eds_scheduled++))
- mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));
+ mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));
wmb ();

/* we care about rm_list when setting CLE/BLE in case the HC was at

2008-03-26 18:07:04

by Mike Nuss

[permalink] [raw]
Subject: Re: ohci : strange looking use of round_jiffies_relative. possible bug ?

On Wed, Mar 26, 2008 at 11:46 AM, Richard Kennedy
<[email protected]> wrote:
>
> On Wed, 2008-03-26 at 11:37 -0400, Alan Stern wrote:
> > On Wed, 26 Mar 2008, Richard Kennedy wrote:
> >
> > > I was looking at the uses of round_jiffies and noticed that the ohci
> > > unlink_watchdog_func() calls
> > > mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));
> > >
> > > Which looks a bit strange as it will set the timer to 0 <= t < HZ.
> > > Reading the comments I think that is really is expecting to setup timer
> > > to (now + 1s)
> > >
> > > mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));
> > >
> > > If this is not true then perhaps it needs a comment to explain what it
> > > _is_ trying to do, because it's got me baffled ;)

Yes, my intent there was a roughly 1 second delay. You're correct, it's wrong.

> > I'd say it's a bug. Or rather a pair of bugs, since that mod_timer()
> > call appears in two places.

Yup.

Mike

2008-03-27 19:07:28

by David Brownell

[permalink] [raw]
Subject: Re: [patch] usb ohci : fix 2 timers to fire at jiffies + 1s

On Wednesday 26 March 2008, Richard Kennedy wrote:
> Code inspection discovered in 2 places timers were being
> incorrectly setup using round_jiffies_relative(HZ).
> The timer would then fire at time (0 <= T < HZ).
>
> Fix them to use round_jiffies(jiffies + HZ);
>
> Signed-off-by: Richard Kennedy <[email protected]>

Acked-by: David Brownell <[email protected]>

> ---
>
> compiled on latest v2.6.25-rc7-11 git head but not otherwise tested.
> Richard
>
> diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
> index dd4798e..33f1c1c 100644
> --- a/drivers/usb/host/ohci-hcd.c
> +++ b/drivers/usb/host/ohci-hcd.c
> @@ -467,7 +467,7 @@ static void unlink_watchdog_func(unsigned long _ohci)
> out:
> kfree(seen);
> if (ohci->eds_scheduled)
> - mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));
> + mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));
> done:
> spin_unlock_irqrestore(&ohci->lock, flags);
> }
> diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
> index 5181732..9c9f3b5 100644
> --- a/drivers/usb/host/ohci-q.c
> +++ b/drivers/usb/host/ohci-q.c
> @@ -169,7 +169,7 @@ static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed)
> if (quirk_zfmicro(ohci)
> && (ed->type == PIPE_INTERRUPT)
> && !(ohci->eds_scheduled++))
> - mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ));
> + mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ));
> wmb ();
>
> /* we care about rm_list when setting CLE/BLE in case the HC was at
>
>

2008-03-27 19:07:41

by David Brownell

[permalink] [raw]
Subject: Re: ohci : strange looking use of round_jiffies_relative. possible bug ?

On Wednesday 26 March 2008, Mike Nuss wrote:
> On Wed, Mar 26, 2008 at 11:46 AM, Richard Kennedy
> <[email protected]> wrote:
>
> > > I'd say it's a bug. Or rather a pair of bugs, since that mod_timer()
> > > call appears in two places.
>
> Yup.

Although ... one specific to the Compaq ZF Micro chipset,
so it's a bug with rather limited impact. Do Not Panic.