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.
*/
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
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.
-
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
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.
*/
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 :))
-
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.
*/
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