lkml.org 
[lkml]   [2000]   [Nov]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [patch] NE2000
    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 majordomo@vger.kernel.org
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 12:45    [W:0.027 / U:93.428 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site