Messages in this thread Patch in this message |  | | Date | Fri, 12 Jan 2001 13:45:07 +0100 (CET) | Subject | Spinlocking patch for in xprt.c | From | Trond Myklebust <> |
| |
The following patch (taken from the zero copy networking) upgrades the spinlocking of the xprt_(up|down)_transmit() 'semaphores' in order to work safely with the networking bottom halves. Several of the latter (cf. xprt.c:tcp_write_space() & friends) do want to test the value of 'xprt->snd_task'.
Cheers, Trond
diff -u --recursive --new-file linux-2.4.1-fh_align/net/sunrpc/xprt.c linux-2.4.1-xprt/net/sunrpc/xprt.c --- linux-2.4.1-fh_align/net/sunrpc/xprt.c Wed Nov 29 07:34:01 2000 +++ linux-2.4.1-xprt/net/sunrpc/xprt.c Fri Jan 12 11:58:42 2001 @@ -1116,7 +1116,7 @@ struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; struct rpc_rqst *req = task->tk_rqstp; - spin_lock(&xprt_lock); + spin_lock_bh(&xprt_sock_lock); if (xprt->snd_task && xprt->snd_task != task) { dprintk("RPC: %4d TCP write queue full (task %d)\n", task->tk_pid, xprt->snd_task->tk_pid); @@ -1130,7 +1130,7 @@ #endif req->rq_bytes_sent = 0; } - spin_unlock(&xprt_lock); + spin_unlock_bh(&xprt_sock_lock); return xprt->snd_task == task; } @@ -1143,10 +1143,10 @@ struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; if (xprt->snd_task && xprt->snd_task == task) { - spin_lock(&xprt_lock); + spin_lock_bh(&xprt_sock_lock); xprt->snd_task = NULL; rpc_wake_up_next(&xprt->sending); - spin_unlock(&xprt_lock); + spin_unlock_bh(&xprt_sock_lock); } } - 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/
|  |