Jorge Nerin wrote:
> 
> ...
> So I think that it could be a little window near sock_wait_for_wmem that
> could be SMP insecure wich is affecting me.
> 
> The code of sock_wait_for_wmem in 2.4.0-test10 is this:
> 
> static long sock_wait_for_wmem(struct sock * sk, long timeo)
> {
>         DECLARE_WAITQUEUE(wait, current);
> 
>         clear_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags);
>         add_wait_queue(sk->sleep, &wait);
>         for (;;) {
>                 if (signal_pending(current))
>                         break;
>                 set_bit(SOCK_NOSPACE, &sk->socket->flags);
>                 set_current_state(TASK_INTERRUPTIBLE);
>                 if (atomic_read(&sk->wmem_alloc) < sk->sndbuf)
>                         break;
>                 if (sk->shutdown & SEND_SHUTDOWN)
>                         break;
>                 if (sk->err)
>                         break;
>                 timeo = schedule_timeout(timeo);
>         }
>         __set_current_state(TASK_RUNNING);
>         remove_wait_queue(sk->sleep, &wait);
>         return timeo;
> }
> 
> Does someone see something SMP insecure? Perhaps I'm totally wrong, this
> could also be somewhere in the interrupt handling, don't know.

No, that code is correct, provided (current->state == TASK_RUNNING)
on entry.  If it isn't, there's a race window which can cause
lost wakeups.   As a check you could add:

        if ((current->state & (TASK_INTERRUPTIBLE|TASK_UNINTERRUPTIBLE)) == 0)
                BUG();

to the start of this function.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to