2001-02-25 22:41:04

by Tim Waugh

[permalink] [raw]
Subject: timing out on a semaphore

I'm trying to chase down a semaphore time-out problem. I want to
sleep on a semaphore until either

(a) it's signalled, or
(b) some amount of time has elapsed.

What I'm doing is calling add_timer, and then down_interruptible, and
finally del_timer. The timer's function ups the semaphore.

The code is in parport_wait_event, in drivers/parport/ieee1284.c.

Can anyone see anything obviously wrong with it? It seems to
sometimes get stuck.

Tim.
*/


Attachments:
(No filename) (452.00 B)
(No filename) (232.00 B)
Download all attachments

2001-02-25 22:52:34

by Davide Libenzi

[permalink] [raw]
Subject: RE: timing out on a semaphore


On 25-Feb-2001 Tim Waugh wrote:
> I'm trying to chase down a semaphore time-out problem. I want to
> sleep on a semaphore until either
>
> (a) it's signalled, or
> (b) some amount of time has elapsed.
>
> What I'm doing is calling add_timer, and then down_interruptible, and
> finally del_timer. The timer's function ups the semaphore.
>
> The code is in parport_wait_event, in drivers/parport/ieee1284.c.
>
> Can anyone see anything obviously wrong with it? It seems to
> sometimes get stuck.

If it's SMP, have You tried to call del_timer_sync() ?




- Davide

2001-02-25 23:11:16

by Andrew Morton

[permalink] [raw]
Subject: Re: timing out on a semaphore

Tim Waugh wrote:
>
> I'm trying to chase down a semaphore time-out problem. I want to
> sleep on a semaphore until either
>
> (a) it's signalled, or
> (b) some amount of time has elapsed.
>
> What I'm doing is calling add_timer, and then down_interruptible, and
> finally del_timer. The timer's function ups the semaphore.
>
> The code is in parport_wait_event, in drivers/parport/ieee1284.c.
>
> Can anyone see anything obviously wrong with it? It seems to
> sometimes get stuck.

I think there might be a bogon in __down_interruptible's
handling of the semaphore state in this case. I remember
spotting something a few months back but I can't immediately
remember what it was :(

I'd suggest you slot a

sema_init(&port->physport->ieee1284.irq, 1);

into parport_wait_event() prior to adding the timer. If that
fixes it I'll go back through my patchpile, see if I can
resurrect that grey cell.

-

2001-02-26 14:34:41

by Arjan van de Ven

[permalink] [raw]
Subject: Re: timing out on a semaphore

In article <[email protected]> you wrote:

> --2F7AbV2suvT8PGoH
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: inline

> I'm trying to chase down a semaphore time-out problem. I want to
> sleep on a semaphore until either

> (a) it's signalled, or
> (b) some amount of time has elapsed.

> What I'm doing is calling add_timer, and then down_interruptible, and
> finally del_timer. The timer's function ups the semaphore.


What we _really_ need is down_timeout(), which I plan to implement for early
2.5. The semantics should by similar to the try_lock functions, exect that
it will try for a specified amount of time first.

Greetings,
Arjan van de Ven

2001-02-27 14:40:10

by Tim Waugh

[permalink] [raw]
Subject: Re: timing out on a semaphore

On Sun, Feb 25, 2001 at 11:10:39PM +0000, Andrew Morton wrote:

> I think there might be a bogon in __down_interruptible's
> handling of the semaphore state in this case. I remember
> spotting something a few months back but I can't immediately
> remember what it was :(
>
> I'd suggest you slot a
>
> sema_init(&port->physport->ieee1284.irq, 1);
>
> into parport_wait_event() prior to adding the timer. If that
> fixes it I'll go back through my patchpile, see if I can
> resurrect that grey cell.

I haven't been able to confirm that it works around it (can't repeat
the problem here), but what would you say if I said it did? ;-)

Tim.
*/


Attachments:
(No filename) (648.00 B)
(No filename) (232.00 B)
Download all attachments

2001-02-27 22:41:23

by Andrew Morton

[permalink] [raw]
Subject: Re: timing out on a semaphore

Tim Waugh wrote:
>
> On Sun, Feb 25, 2001 at 11:10:39PM +0000, Andrew Morton wrote:
>
> > I think there might be a bogon in __down_interruptible's
> > handling of the semaphore state in this case. I remember
> > spotting something a few months back but I can't immediately
> > remember what it was :(
> >
> > I'd suggest you slot a
> >
> > sema_init(&port->physport->ieee1284.irq, 1);
> >
> > into parport_wait_event() prior to adding the timer. If that
> > fixes it I'll go back through my patchpile, see if I can
> > resurrect that grey cell.
>
> I haven't been able to confirm that it works around it (can't repeat
> the problem here), but what would you say if I said it did? ;-)

One of two things:

1: Your code is leaving the semaphore in a down'ed state
somehow.

2: The semaphore code is leaving the semaphore in a funny
state.

hmm. I see from your other email that the sema_init() has
made the problem go away. Could you please review the code,
see if there's an imbalance somewhere?

What is parport_ieee1284_write_compat() trying to do with
the semaphore? It will leave the semaphore in a downed
state. Intentional? Is this code actually being used
by the person who is having the problem? Could this
loop be replaced by a simple sema_init()?

(As you can tell, I'm desparately avoiding having
to understand the semaphore code again :))

-

2001-02-27 23:29:25

by Tim Waugh

[permalink] [raw]
Subject: Re: timing out on a semaphore

On Tue, Feb 27, 2001 at 10:40:35PM +0000, Andrew Morton wrote:

> 1: Your code is leaving the semaphore in a down'ed state
> somehow.

This was probably it. I don't know why it works for me but not some
other people though. :-/

> (As you can tell, I'm desparately avoiding having
> to understand the semaphore code again :))

:-)

Tim.
*/


Attachments:
(No filename) (344.00 B)
(No filename) (232.00 B)
Download all attachments

2001-02-27 23:34:38

by Davide Libenzi

[permalink] [raw]
Subject: Re: timing out on a semaphore


On 27-Feb-2001 Tim Waugh wrote:
> On Tue, Feb 27, 2001 at 10:40:35PM +0000, Andrew Morton wrote:
>
>> 1: Your code is leaving the semaphore in a down'ed state
>> somehow.
>
> This was probably it. I don't know why it works for me but not some
> other people though. :-/

UP vs. MP ?



- Davide