Commit 77dd550e authored by Andy Grover's avatar Andy Grover

RDS: Stop supporting old cong map sending method

We now ask the transport to give us a rm for the congestion
map, and then we handle it normally. Previously, the
transport defined a function that we would call to send
a congestion map.

Convert TCP and loop transports to new cong map method.
Signed-off-by: default avatarAndy Grover <andy.grover@oracle.com>
parent e32b4a70
...@@ -265,7 +265,6 @@ struct rds_transport rds_ib_transport = { ...@@ -265,7 +265,6 @@ struct rds_transport rds_ib_transport = {
.laddr_check = rds_ib_laddr_check, .laddr_check = rds_ib_laddr_check,
.xmit_complete = rds_ib_xmit_complete, .xmit_complete = rds_ib_xmit_complete,
.xmit = rds_ib_xmit, .xmit = rds_ib_xmit,
.xmit_cong_map = NULL,
.xmit_rdma = rds_ib_xmit_rdma, .xmit_rdma = rds_ib_xmit_rdma,
.xmit_atomic = rds_ib_xmit_atomic, .xmit_atomic = rds_ib_xmit_atomic,
.recv = rds_ib_recv, .recv = rds_ib_recv,
......
...@@ -264,7 +264,6 @@ struct rds_transport rds_iw_transport = { ...@@ -264,7 +264,6 @@ struct rds_transport rds_iw_transport = {
.laddr_check = rds_iw_laddr_check, .laddr_check = rds_iw_laddr_check,
.xmit_complete = rds_iw_xmit_complete, .xmit_complete = rds_iw_xmit_complete,
.xmit = rds_iw_xmit, .xmit = rds_iw_xmit,
.xmit_cong_map = NULL,
.xmit_rdma = rds_iw_xmit_rdma, .xmit_rdma = rds_iw_xmit_rdma,
.recv = rds_iw_recv, .recv = rds_iw_recv,
.conn_alloc = rds_iw_conn_alloc, .conn_alloc = rds_iw_conn_alloc,
......
...@@ -61,6 +61,12 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, ...@@ -61,6 +61,12 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm,
unsigned int hdr_off, unsigned int sg, unsigned int hdr_off, unsigned int sg,
unsigned int off) unsigned int off)
{ {
/* Do not send cong updates to loopback */
if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) {
rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;
}
BUG_ON(hdr_off || sg || off); BUG_ON(hdr_off || sg || off);
rds_inc_init(&rm->m_inc, conn, conn->c_laddr); rds_inc_init(&rm->m_inc, conn, conn->c_laddr);
...@@ -88,18 +94,6 @@ static void rds_loop_inc_free(struct rds_incoming *inc) ...@@ -88,18 +94,6 @@ static void rds_loop_inc_free(struct rds_incoming *inc)
rds_message_put(rm); rds_message_put(rm);
} }
static int rds_loop_xmit_cong_map(struct rds_connection *conn,
struct rds_cong_map *map,
unsigned long offset)
{
BUG_ON(offset);
BUG_ON(map != conn->c_lcong);
rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;
}
/* we need to at least give the thread something to succeed */ /* we need to at least give the thread something to succeed */
static int rds_loop_recv(struct rds_connection *conn) static int rds_loop_recv(struct rds_connection *conn)
{ {
...@@ -180,7 +174,6 @@ void rds_loop_exit(void) ...@@ -180,7 +174,6 @@ void rds_loop_exit(void)
*/ */
struct rds_transport rds_loop_transport = { struct rds_transport rds_loop_transport = {
.xmit = rds_loop_xmit, .xmit = rds_loop_xmit,
.xmit_cong_map = rds_loop_xmit_cong_map,
.recv = rds_loop_recv, .recv = rds_loop_recv,
.conn_alloc = rds_loop_conn_alloc, .conn_alloc = rds_loop_conn_alloc,
.conn_free = rds_loop_conn_free, .conn_free = rds_loop_conn_free,
......
...@@ -393,10 +393,6 @@ struct rds_notifier { ...@@ -393,10 +393,6 @@ struct rds_notifier {
* transport is responsible for other serialization, including * transport is responsible for other serialization, including
* rds_recv_incoming(). This is called in process context but * rds_recv_incoming(). This is called in process context but
* should try hard not to block. * should try hard not to block.
*
* @xmit_cong_map: This asks the transport to send the local bitmap down the
* given connection. XXX get a better story about the bitmap
* flag and header.
*/ */
#define RDS_TRANS_IB 0 #define RDS_TRANS_IB 0
...@@ -420,8 +416,6 @@ struct rds_transport { ...@@ -420,8 +416,6 @@ struct rds_transport {
void (*xmit_complete)(struct rds_connection *conn); void (*xmit_complete)(struct rds_connection *conn);
int (*xmit)(struct rds_connection *conn, struct rds_message *rm, int (*xmit)(struct rds_connection *conn, struct rds_message *rm,
unsigned int hdr_off, unsigned int sg, unsigned int off); unsigned int hdr_off, unsigned int sg, unsigned int off);
int (*xmit_cong_map)(struct rds_connection *conn,
struct rds_cong_map *map, unsigned long offset);
int (*xmit_rdma)(struct rds_connection *conn, struct rm_rdma_op *op); int (*xmit_rdma)(struct rds_connection *conn, struct rm_rdma_op *op);
int (*xmit_atomic)(struct rds_connection *conn, struct rm_atomic_op *op); int (*xmit_atomic)(struct rds_connection *conn, struct rm_atomic_op *op);
int (*recv)(struct rds_connection *conn); int (*recv)(struct rds_connection *conn);
......
...@@ -147,41 +147,16 @@ int rds_send_xmit(struct rds_connection *conn) ...@@ -147,41 +147,16 @@ int rds_send_xmit(struct rds_connection *conn)
/* /*
* If between sending messages, we can send a pending congestion * If between sending messages, we can send a pending congestion
* map update. * map update.
*
* Transports either define a special xmit_cong_map function,
* or we allocate a cong_map message and treat it just like any
* other send.
*/ */
if (!rm && test_and_clear_bit(0, &conn->c_map_queued)) { if (!rm && test_and_clear_bit(0, &conn->c_map_queued)) {
if (conn->c_trans->xmit_cong_map) { rm = rds_cong_update_alloc(conn);
unsigned long map_offset = 0; if (IS_ERR(rm)) {
unsigned long map_bytes = sizeof(struct rds_header) + ret = PTR_ERR(rm);
RDS_CONG_MAP_BYTES; break;
while (map_bytes) {
ret = conn->c_trans->xmit_cong_map(conn, conn->c_lcong,
map_offset);
if (ret <= 0) {
/* too far down the rabbithole! */
mutex_unlock(&conn->c_send_lock);
rds_conn_error(conn, "Cong map xmit failed\n");
goto out;
}
map_offset += ret;
map_bytes -= ret;
}
} else {
/* send cong update like a normal rm */
rm = rds_cong_update_alloc(conn);
if (IS_ERR(rm)) {
ret = PTR_ERR(rm);
break;
}
rm->data.op_active = 1;
conn->c_xmit_rm = rm;
} }
rm->data.op_active = 1;
conn->c_xmit_rm = rm;
} }
/* /*
......
...@@ -258,7 +258,6 @@ struct rds_transport rds_tcp_transport = { ...@@ -258,7 +258,6 @@ struct rds_transport rds_tcp_transport = {
.laddr_check = rds_tcp_laddr_check, .laddr_check = rds_tcp_laddr_check,
.xmit_prepare = rds_tcp_xmit_prepare, .xmit_prepare = rds_tcp_xmit_prepare,
.xmit_complete = rds_tcp_xmit_complete, .xmit_complete = rds_tcp_xmit_complete,
.xmit_cong_map = rds_tcp_xmit_cong_map,
.xmit = rds_tcp_xmit, .xmit = rds_tcp_xmit,
.recv = rds_tcp_recv, .recv = rds_tcp_recv,
.conn_alloc = rds_tcp_conn_alloc, .conn_alloc = rds_tcp_conn_alloc,
......
...@@ -80,8 +80,6 @@ void rds_tcp_xmit_complete(struct rds_connection *conn); ...@@ -80,8 +80,6 @@ void rds_tcp_xmit_complete(struct rds_connection *conn);
int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
unsigned int hdr_off, unsigned int sg, unsigned int off); unsigned int hdr_off, unsigned int sg, unsigned int off);
void rds_tcp_write_space(struct sock *sk); void rds_tcp_write_space(struct sock *sk);
int rds_tcp_xmit_cong_map(struct rds_connection *conn,
struct rds_cong_map *map, unsigned long offset);
/* tcp_stats.c */ /* tcp_stats.c */
DECLARE_PER_CPU(struct rds_tcp_statistics, rds_tcp_stats); DECLARE_PER_CPU(struct rds_tcp_statistics, rds_tcp_stats);
......
...@@ -76,56 +76,6 @@ int rds_tcp_sendmsg(struct socket *sock, void *data, unsigned int len) ...@@ -76,56 +76,6 @@ int rds_tcp_sendmsg(struct socket *sock, void *data, unsigned int len)
return kernel_sendmsg(sock, &msg, &vec, 1, vec.iov_len); return kernel_sendmsg(sock, &msg, &vec, 1, vec.iov_len);
} }
/* the core send_sem serializes this with other xmit and shutdown */
int rds_tcp_xmit_cong_map(struct rds_connection *conn,
struct rds_cong_map *map, unsigned long offset)
{
static struct rds_header rds_tcp_map_header = {
.h_flags = RDS_FLAG_CONG_BITMAP,
};
struct rds_tcp_connection *tc = conn->c_transport_data;
unsigned long i;
int ret;
int copied = 0;
/* Some problem claims cpu_to_be32(constant) isn't a constant. */
rds_tcp_map_header.h_len = cpu_to_be32(RDS_CONG_MAP_BYTES);
if (offset < sizeof(struct rds_header)) {
ret = rds_tcp_sendmsg(tc->t_sock,
(void *)&rds_tcp_map_header + offset,
sizeof(struct rds_header) - offset);
if (ret <= 0)
return ret;
offset += ret;
copied = ret;
if (offset < sizeof(struct rds_header))
return ret;
}
offset -= sizeof(struct rds_header);
i = offset / PAGE_SIZE;
offset = offset % PAGE_SIZE;
BUG_ON(i >= RDS_CONG_MAP_PAGES);
do {
ret = tc->t_sock->ops->sendpage(tc->t_sock,
virt_to_page(map->m_page_addrs[i]),
offset, PAGE_SIZE - offset,
MSG_DONTWAIT);
if (ret <= 0)
break;
copied += ret;
offset += ret;
if (offset == PAGE_SIZE) {
offset = 0;
i++;
}
} while (i < RDS_CONG_MAP_PAGES);
return copied ? copied : ret;
}
/* the core send_sem serializes this with other xmit and shutdown */ /* the core send_sem serializes this with other xmit and shutdown */
int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
unsigned int hdr_off, unsigned int sg, unsigned int off) unsigned int hdr_off, unsigned int sg, unsigned int off)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment