patch-2.4.21 linux-2.4.21/net/sunrpc/xprt.c
Next file: linux-2.4.21/net/unix/sysctl_net_unix.c
Previous file: linux-2.4.21/net/sunrpc/xdr.c
Back to the patch index
Back to the overall index
- Lines: 108
- Date:
2003-06-13 07:51:39.000000000 -0700
- Orig file:
linux-2.4.20/net/sunrpc/xprt.c
- Orig date:
2002-11-28 15:53:16.000000000 -0800
diff -urN linux-2.4.20/net/sunrpc/xprt.c linux-2.4.21/net/sunrpc/xprt.c
@@ -226,23 +226,34 @@
/* Dont repeat bytes */
skip = req->rq_bytes_sent;
slen = xdr->len - skip;
- niov = xdr_kmap(niv, xdr, skip);
+ oldfs = get_fs(); set_fs(get_ds());
+ do {
+ unsigned int slen_part, n;
- msg.msg_flags = MSG_DONTWAIT|MSG_NOSIGNAL;
- msg.msg_iov = niv;
- msg.msg_iovlen = niov;
- msg.msg_name = (struct sockaddr *) &xprt->addr;
- msg.msg_namelen = sizeof(xprt->addr);
- msg.msg_control = NULL;
- msg.msg_controllen = 0;
+ niov = xdr_kmap(niv, xdr, skip);
- oldfs = get_fs(); set_fs(get_ds());
- clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
- result = sock_sendmsg(sock, &msg, slen);
+ msg.msg_flags = MSG_DONTWAIT|MSG_NOSIGNAL;
+ msg.msg_iov = niv;
+ msg.msg_iovlen = niov;
+ msg.msg_name = (struct sockaddr *) &xprt->addr;
+ msg.msg_namelen = sizeof(xprt->addr);
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+
+ slen_part = 0;
+ for (n = 0; n < niov; n++)
+ slen_part += niv[n].iov_len;
+
+ clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
+ result = sock_sendmsg(sock, &msg, slen_part);
+
+ xdr_kunmap(xdr, skip, niov);
+
+ skip += slen_part;
+ slen -= slen_part;
+ } while (result >= 0 && slen);
set_fs(oldfs);
- xdr_kunmap(xdr, skip);
-
dprintk("RPC: xprt_sendmsg(%d) = %d\n", slen, result);
if (result >= 0)
@@ -1239,26 +1250,41 @@
}
/*
+ * Allocate a 'unique' XID
+ */
+static u32
+xprt_alloc_xid(void)
+{
+ static spinlock_t xid_lock = SPIN_LOCK_UNLOCKED;
+ static int need_init = 1;
+ static u32 xid;
+ u32 ret;
+
+ spin_lock(&xid_lock);
+ if (unlikely(need_init)) {
+ xid = CURRENT_TIME << 12;
+ need_init = 0;
+ }
+ ret = xid++;
+ spin_unlock(&xid_lock);
+ return ret;
+}
+
+/*
* Initialize RPC request
*/
static void
xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
{
struct rpc_rqst *req = task->tk_rqstp;
- static u32 xid = 0;
-
- if (!xid)
- xid = CURRENT_TIME << 12;
- dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid, req, xid);
- task->tk_status = 0;
req->rq_timeout = xprt->timeout;
req->rq_task = task;
req->rq_xprt = xprt;
- req->rq_xid = xid++;
- if (!xid)
- xid++;
+ req->rq_xid = xprt_alloc_xid();
INIT_LIST_HEAD(&req->rq_list);
+ dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid,
+ req, req->rq_xid);
}
/*
@@ -1416,6 +1442,8 @@
sk->no_check = UDP_CSUM_NORCV;
xprt_set_connected(xprt);
} else {
+ struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
+ tp->nonagle = 1; /* disable Nagle's algorithm */
sk->data_ready = tcp_data_ready;
sk->state_change = tcp_state_change;
xprt_clear_connected(xprt);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)