Merge tag 'usercopy-v4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
[cascardo/linux.git] / net / rds / tcp_recv.c
index 6e6a711..ad4892e 100644 (file)
@@ -147,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;
 };
 
@@ -155,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;
@@ -178,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.
@@ -228,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
@@ -250,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;
@@ -278,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;
@@ -296,24 +300,24 @@ int rds_tcp_recv(struct rds_connection *conn)
 void rds_tcp_data_ready(struct sock *sk)
 {
        void (*ready)(struct sock *sk);
-       struct rds_connection *conn;
+       struct rds_conn_path *cp;
        struct rds_tcp_connection *tc;
 
        rdsdebug("data ready sk %p\n", sk);
 
        read_lock_bh(&sk->sk_callback_lock);
-       conn = sk->sk_user_data;
-       if (!conn) { /* check for teardown race */
+       cp = sk->sk_user_data;
+       if (!cp) { /* check for teardown race */
                ready = sk->sk_data_ready;
                goto out;
        }
 
-       tc = conn->c_transport_data;
+       tc = cp->cp_transport_data;
        ready = tc->t_orig_data_ready;
        rds_tcp_stats_inc(s_tcp_data_ready_calls);
 
-       if (rds_tcp_read_sock(conn, GFP_ATOMIC) == -ENOMEM)
-               queue_delayed_work(rds_wq, &conn->c_recv_w, 0);
+       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);
        ready(sk);