Bottom: daf53db464152f40dc8d6f2c99844510b03f8567
-Top: 52637b17efade61815ce9a543e6ac319af39e10a
+Top: f577125f6a6e9da1cf989ea2c4e933c66a84cf05
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2012-10-21 14:16:03 -0700
}
#endif
diff --git a/man/rsocket.7 b/man/rsocket.7
-index 2ed5ca4..dc3f9ab 100644
+index 2ed5ca4..bc5bb10 100644
--- a/man/rsocket.7
+++ b/man/rsocket.7
-@@ -6,7 +6,7 @@ rsocket \- RDMA socket API
+@@ -6,9 +6,9 @@ rsocket \- RDMA socket API
.SH "DESCRIPTION"
RDMA socket API and protocol
.SH "NOTES"
-rsockets is a protocol over RDMA that supports a socket-level API
+-for applications. rsocket APIs are intended to match the behavior
+-of corresponding socket calls, except where noted. rsocket
+Rsockets is a protocol over RDMA that supports a socket-level API
- for applications. rsocket APIs are intended to match the behavior
- of corresponding socket calls, except where noted. rsocket
++for applications. Rsocket APIs are intended to match the behavior
++of corresponding socket calls, except where noted. Rsocket
functions match the name and function signature of socket calls,
+ with the exception that all function calls are prefixed with an 'r'.
+ .P
@@ -30,7 +30,7 @@ rgetpeername, rgetsockname
.P
rsetsockopt, rgetsockopt, rfcntl
local: *;
};
diff --git a/src/rsocket.c b/src/rsocket.c
-index cc5effe..29b8c01 100644
+index cc5effe..74dbcc7 100644
--- a/src/rsocket.c
+++ b/src/rsocket.c
@@ -55,6 +55,7 @@
*
* for data transfers:
- * bits [28:0]: bytes transfered, 0 = 1 GB
-+ * bits [28:0]: bytes transfered
++ * bits [28:0]: bytes transferred
* for control messages:
+ * SGL, CTRL
* bits [28-0]: receive credits granted
rs->rbuf = calloc(rs->rbuf_size, sizeof(*rs->rbuf));
if (!rs->rbuf)
return -1;
-@@ -452,6 +519,42 @@ static int rs_create_ep(struct rsocket *rs)
+@@ -452,6 +519,35 @@ static int rs_create_ep(struct rsocket *rs)
return 0;
}
-+/*
-+static xxx rs_acquire_iomap_mr(struct rsocket *rs, ...)
-+{
-+ TODO: write me
-+}
-+*/
-+
+static void rs_release_iomap_mr(struct rs_iomap_mr *iomr)
+{
+ if (atomic_dec(&iomr->refcnt))
static void rs_free(struct rsocket *rs)
{
if (rs->index >= 0)
-@@ -472,15 +575,20 @@ static void rs_free(struct rsocket *rs)
+@@ -472,15 +568,20 @@ static void rs_free(struct rsocket *rs)
free(rs->rbuf);
}
fastlock_destroy(&rs->cq_wait_lock);
fastlock_destroy(&rs->cq_lock);
fastlock_destroy(&rs->rlock);
-@@ -492,9 +600,11 @@ static void rs_set_conn_data(struct rsocket *rs, struct rdma_conn_param *param,
+@@ -492,9 +593,11 @@ static void rs_set_conn_data(struct rsocket *rs, struct rdma_conn_param *param,
struct rs_conn_data *conn)
{
conn->version = 1;
conn->target_sgl.addr = htonll((uintptr_t) rs->target_sgl);
conn->target_sgl.length = htonl(RS_SGL_SIZE);
-@@ -518,6 +628,13 @@ static void rs_save_conn_data(struct rsocket *rs, struct rs_conn_data *conn)
+@@ -518,6 +621,13 @@ static void rs_save_conn_data(struct rsocket *rs, struct rs_conn_data *conn)
(!rs_host_is_net() && (conn->flags & RS_CONN_FLAG_NET)))
rs->opts = RS_OPT_SWAP_SGL;
rs->target_sgl[0].addr = ntohll(conn->data_buf.addr);
rs->target_sgl[0].length = ntohl(conn->data_buf.length);
rs->target_sgl[0].key = ntohl(conn->data_buf.key);
-@@ -753,7 +870,7 @@ int rconnect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+@@ -753,7 +863,7 @@ int rconnect(int socket, const struct sockaddr *addr, socklen_t addrlen)
return rs_do_connect(rs);
}
struct ibv_sge *sgl, int nsge,
uint32_t imm_data, int flags,
uint64_t addr, uint32_t rkey)
-@@ -773,6 +890,25 @@ static int rs_post_write(struct rsocket *rs,
+@@ -773,6 +883,25 @@ static int rs_post_write(struct rsocket *rs,
return rdma_seterrno(ibv_post_send(rs->cm_id->qp, &wr, &bad));
}
/*
* Update target SGE before sending data. Otherwise the remote side may
* update the entry before we do.
-@@ -799,8 +935,35 @@ static int rs_write_data(struct rsocket *rs,
+@@ -799,8 +928,35 @@ static int rs_write_data(struct rsocket *rs,
rs->target_sge = 0;
}
}
static uint32_t rs_sbuf_left(struct rsocket *rs)
-@@ -831,12 +994,12 @@ static void rs_send_credits(struct rsocket *rs)
+@@ -831,12 +987,12 @@ static void rs_send_credits(struct rsocket *rs)
ibsge.lkey = 0;
ibsge.length = sizeof(sge);
rs->rbuf_bytes_avail -= rs->rbuf_size >> 1;
rs->rbuf_free_offset += rs->rbuf_size >> 1;
-@@ -845,8 +1008,9 @@ static void rs_send_credits(struct rsocket *rs)
+@@ -845,8 +1001,9 @@ static void rs_send_credits(struct rsocket *rs)
if (++rs->remote_sge == rs->remote_sgl.length)
rs->remote_sge = 0;
} else {
}
}
-@@ -880,6 +1044,9 @@ static int rs_poll_cq(struct rsocket *rs)
+@@ -880,6 +1037,9 @@ static int rs_poll_cq(struct rsocket *rs)
case RS_OP_SGL:
rs->sseq_comp = (uint16_t) rs_msg_data(imm_data);
break;
case RS_OP_CTRL:
if (rs_msg_data(imm_data) == RS_CTRL_DISCONNECT) {
rs->state = rs_disconnected;
-@@ -888,6 +1055,9 @@ static int rs_poll_cq(struct rsocket *rs)
+@@ -888,6 +1048,9 @@ static int rs_poll_cq(struct rsocket *rs)
rs->state &= ~rs_connect_rd;
}
break;
default:
rs->rmsg[rs->rmsg_tail].op = rs_msg_op(imm_data);
rs->rmsg[rs->rmsg_tail].data = rs_msg_data(imm_data);
-@@ -905,6 +1075,10 @@ static int rs_poll_cq(struct rsocket *rs)
+@@ -905,6 +1068,10 @@ static int rs_poll_cq(struct rsocket *rs)
if (rs_msg_data((uint32_t) wc.wr_id) == RS_CTRL_DISCONNECT)
rs->state = rs_disconnected;
break;
default:
rs->sqe_avail++;
rs->sbuf_bytes_avail += rs_msg_data((uint32_t) wc.wr_id);
-@@ -1046,7 +1220,7 @@ static int rs_poll_all(struct rsocket *rs)
+@@ -1046,7 +1213,7 @@ static int rs_poll_all(struct rsocket *rs)
*/
static int rs_can_send(struct rsocket *rs)
{
(rs->sseq_no != rs->sseq_comp) &&
(rs->target_sgl[rs->target_sge].length != 0);
}
-@@ -1216,6 +1390,73 @@ ssize_t rreadv(int socket, const struct iovec *iov, int iovcnt)
+@@ -1216,6 +1383,73 @@ ssize_t rreadv(int socket, const struct iovec *iov, int iovcnt)
return rrecvv(socket, iov, iovcnt, 0);
}
/*
* We overlap sending the data, by posting a small work request immediately,
* then increasing the size of the send on each iteration.
-@@ -1224,7 +1465,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
+@@ -1224,7 +1458,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
{
struct rsocket *rs;
struct ibv_sge sge;
uint32_t xfer_size, olen = RS_OLAP_START_SIZE;
int ret = 0;
-@@ -1239,7 +1480,12 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
+@@ -1239,7 +1473,12 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
}
fastlock_acquire(&rs->slock);
if (!rs_can_send(rs)) {
ret = rs_get_comp(rs, rs_nonblocking(rs, flags),
rs_conn_can_send);
-@@ -1289,6 +1535,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
+@@ -1289,6 +1528,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
if (ret)
break;
}
fastlock_release(&rs->slock);
return (ret && left == len) ? ret : len - left;
-@@ -1345,9 +1592,15 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
+@@ -1345,9 +1585,15 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
len = iov[0].iov_len;
for (i = 1; i < iovcnt; i++)
len += iov[i].iov_len;
if (!rs_can_send(rs)) {
ret = rs_get_comp(rs, rs_nonblocking(rs, flags),
rs_conn_can_send);
-@@ -1395,6 +1648,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
+@@ -1395,6 +1641,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
if (ret)
break;
}
fastlock_release(&rs->slock);
return (ret && left == len) ? ret : len - left;
-@@ -1725,8 +1979,8 @@ int rshutdown(int socket, int how)
+@@ -1725,8 +1972,8 @@ int rshutdown(int socket, int how)
if ((rs->state & rs_connected) && rs->ctrl_avail) {
rs->ctrl_avail--;
}
}
-@@ -1814,6 +2068,8 @@ int rsetsockopt(int socket, int level, int optname,
+@@ -1814,6 +2061,8 @@ int rsetsockopt(int socket, int level, int optname,
case SO_SNDBUF:
if (!rs->sbuf)
rs->sbuf_size = (*(uint32_t *) optval) << 1;
ret = 0;
break;
case SO_LINGER:
-@@ -1878,6 +2134,10 @@ int rsetsockopt(int socket, int level, int optname,
+@@ -1878,6 +2127,10 @@ int rsetsockopt(int socket, int level, int optname,
if (rs->sq_inline < RS_MIN_INLINE)
rs->sq_inline = RS_MIN_INLINE;
break;
default:
break;
}
-@@ -1979,6 +2239,10 @@ int rgetsockopt(int socket, int level, int optname,
+@@ -1979,6 +2232,10 @@ int rgetsockopt(int socket, int level, int optname,
*((int *) optval) = rs->sq_inline;
*optlen = sizeof(int);
break;
default:
ret = ENOTSUP;
break;
-@@ -2020,3 +2284,201 @@ int rfcntl(int socket, int cmd, ... /* arg */ )
+@@ -2020,3 +2277,201 @@ int rfcntl(int socket, int cmd, ... /* arg */ )
va_end(args);
return ret;
}