|
@@ -34,7 +34,6 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include <net/tcp.h>
|
|
|
|
|
|
-#include "rds_single_path.h"
|
|
|
#include "rds.h"
|
|
|
#include "tcp.h"
|
|
|
|
|
@@ -148,7 +147,7 @@ static void rds_tcp_cong_recv(struct rds_connection *conn,
|
|
|
}
|
|
|
|
|
|
struct rds_tcp_desc_arg {
|
|
|
- struct rds_connection *conn;
|
|
|
+ struct rds_conn_path *conn_path;
|
|
|
gfp_t gfp;
|
|
|
};
|
|
|
|
|
@@ -156,8 +155,8 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb,
|
|
|
unsigned int offset, size_t len)
|
|
|
{
|
|
|
struct rds_tcp_desc_arg *arg = desc->arg.data;
|
|
|
- struct rds_connection *conn = arg->conn;
|
|
|
- struct rds_tcp_connection *tc = conn->c_transport_data;
|
|
|
+ struct rds_conn_path *cp = arg->conn_path;
|
|
|
+ struct rds_tcp_connection *tc = cp->cp_transport_data;
|
|
|
struct rds_tcp_incoming *tinc = tc->t_tinc;
|
|
|
struct sk_buff *clone;
|
|
|
size_t left = len, to_copy;
|
|
@@ -179,7 +178,8 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb,
|
|
|
}
|
|
|
tc->t_tinc = tinc;
|
|
|
rdsdebug("alloced tinc %p\n", tinc);
|
|
|
- rds_inc_init(&tinc->ti_inc, conn, conn->c_faddr);
|
|
|
+ rds_inc_path_init(&tinc->ti_inc, cp,
|
|
|
+ cp->cp_conn->c_faddr);
|
|
|
/*
|
|
|
* XXX * we might be able to use the __ variants when
|
|
|
* we've already serialized at a higher level.
|
|
@@ -229,6 +229,8 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb,
|
|
|
}
|
|
|
|
|
|
if (tc->t_tinc_hdr_rem == 0 && tc->t_tinc_data_rem == 0) {
|
|
|
+ struct rds_connection *conn = cp->cp_conn;
|
|
|
+
|
|
|
if (tinc->ti_inc.i_hdr.h_flags == RDS_FLAG_CONG_BITMAP)
|
|
|
rds_tcp_cong_recv(conn, tinc);
|
|
|
else
|
|
@@ -251,15 +253,15 @@ out:
|
|
|
}
|
|
|
|
|
|
/* the caller has to hold the sock lock */
|
|
|
-static int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp)
|
|
|
+static int rds_tcp_read_sock(struct rds_conn_path *cp, gfp_t gfp)
|
|
|
{
|
|
|
- struct rds_tcp_connection *tc = conn->c_transport_data;
|
|
|
+ struct rds_tcp_connection *tc = cp->cp_transport_data;
|
|
|
struct socket *sock = tc->t_sock;
|
|
|
read_descriptor_t desc;
|
|
|
struct rds_tcp_desc_arg arg;
|
|
|
|
|
|
/* It's like glib in the kernel! */
|
|
|
- arg.conn = conn;
|
|
|
+ arg.conn_path = cp;
|
|
|
arg.gfp = gfp;
|
|
|
desc.arg.data = &arg;
|
|
|
desc.error = 0;
|
|
@@ -279,16 +281,17 @@ static int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp)
|
|
|
* if we fail to allocate we're in trouble.. blindly wait some time before
|
|
|
* trying again to see if the VM can free up something for us.
|
|
|
*/
|
|
|
-int rds_tcp_recv(struct rds_connection *conn)
|
|
|
+int rds_tcp_recv_path(struct rds_conn_path *cp)
|
|
|
{
|
|
|
- struct rds_tcp_connection *tc = conn->c_transport_data;
|
|
|
+ struct rds_tcp_connection *tc = cp->cp_transport_data;
|
|
|
struct socket *sock = tc->t_sock;
|
|
|
int ret = 0;
|
|
|
|
|
|
- rdsdebug("recv worker conn %p tc %p sock %p\n", conn, tc, sock);
|
|
|
+ rdsdebug("recv worker path [%d] tc %p sock %p\n",
|
|
|
+ cp->cp_index, tc, sock);
|
|
|
|
|
|
lock_sock(sock->sk);
|
|
|
- ret = rds_tcp_read_sock(conn, GFP_KERNEL);
|
|
|
+ ret = rds_tcp_read_sock(cp, GFP_KERNEL);
|
|
|
release_sock(sock->sk);
|
|
|
|
|
|
return ret;
|
|
@@ -313,7 +316,7 @@ void rds_tcp_data_ready(struct sock *sk)
|
|
|
ready = tc->t_orig_data_ready;
|
|
|
rds_tcp_stats_inc(s_tcp_data_ready_calls);
|
|
|
|
|
|
- if (rds_tcp_read_sock(cp->cp_conn, GFP_ATOMIC) == -ENOMEM)
|
|
|
+ if (rds_tcp_read_sock(cp, GFP_ATOMIC) == -ENOMEM)
|
|
|
queue_delayed_work(rds_wq, &cp->cp_recv_w, 0);
|
|
|
out:
|
|
|
read_unlock_bh(&sk->sk_callback_lock);
|