netdev
[Top] [All Lists]

[PATCH] ipv4 skbuff locking scope

To: "David S. Miller" <davem@xxxxxxxxxx>
Subject: [PATCH] ipv4 skbuff locking scope
From: Tom Leete <tleete@xxxxxxxxxxxx>
Date: Mon, 30 Oct 2000 17:24:24 -0500
Cc: linux-kernel@xxxxxxxxxxxxxxx, netdev <netdev@xxxxxxxxxxx>
Sender: owner-netdev@xxxxxxxxxxx
Hello,

This fixes tests of a socket buffer done without holding the
lock. tcp_data_wait() and wait_for_tcp_memory() both had
unguarded refs in their sleep conditionals.

Tom
--- linux-2.4.0-test10-pre5/net/ipv4/tcp.c~     Sun Oct 29 01:21:09 2000
+++ linux/net/ipv4/tcp.c        Mon Oct 30 16:53:19 2000
@@ -204,6 +204,9 @@
  *             Andi Kleen      :       Make poll agree with SIGIO
  *     Salvatore Sanfilippo    :       Support SO_LINGER with linger == 1 and
  *                                     lingertime == 0 (RFC 793 ABORT Call)
+ *              Tom Leete       :       Fix locking scope in
+ *                                      wait_for_tcp_memory, tcp_data_wait
+ *
  *                                     
  *             This program is free software; you can redistribute it and/or
  *             modify it under the terms of the GNU General Public License
@@ -871,10 +874,11 @@
                        break;
                if (sk->err)
                        break;
-               release_sock(sk);
-               if (!tcp_memory_free(sk) || vm_wait)
+               if (!tcp_memory_free(sk) || vm_wait) {
+                       release_sock(sk);
                        current_timeo = schedule_timeout(current_timeo);
-               lock_sock(sk);
+                       lock_sock(sk);
+               }
                if (vm_wait) {
                        if (timeo != MAX_SCHEDULE_TIMEOUT &&
                            (timeo -= vm_wait-current_timeo) < 0)
@@ -1273,12 +1277,12 @@
        __set_current_state(TASK_INTERRUPTIBLE);
 
        set_bit(SOCK_ASYNC_WAITDATA, &sk->socket->flags);
-       release_sock(sk);
 
-       if (skb_queue_empty(&sk->receive_queue))
+       if (skb_queue_empty(&sk->receive_queue)){
+               release_sock(sk);
                timeo = schedule_timeout(timeo);
-
-       lock_sock(sk);
+               lock_sock(sk);
+       }
        clear_bit(SOCK_ASYNC_WAITDATA, &sk->socket->flags);
 
        remove_wait_queue(sk->sleep, &wait);
<Prev in Thread] Current Thread [Next in Thread>