aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorSowmini Varadhan <sowmini.varadhan@oracle.com>2016-06-30 19:11:14 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-01 16:45:17 -0400
commitea3b1ea53930879c9847044f5cb9c97411cae797 (patch)
tree253e822f3d1bd081b791320683663dc4fcf3b9b0 /net/rds
parentafb4164d91c7486a1d4ab098a1b88e27b5e25772 (diff)
RDS: TCP: make ->sk_user_data point to a rds_conn_path
The socket callbacks should all operate on a struct rds_conn_path, in preparation for a MP capable RDS-TCP. Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com> Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds')
-rw-r--r--net/rds/tcp.c25
-rw-r--r--net/rds/tcp.h4
-rw-r--r--net/rds/tcp_connect.c16
-rw-r--r--net/rds/tcp_listen.c12
-rw-r--r--net/rds/tcp_recv.c12
-rw-r--r--net/rds/tcp_send.c12
6 files changed, 41 insertions, 40 deletions
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index b32772759c9d..5658f3e9f601 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -136,9 +136,9 @@ void rds_tcp_restore_callbacks(struct socket *sock,
136 * from being called while it isn't set. 136 * from being called while it isn't set.
137 */ 137 */
138void rds_tcp_reset_callbacks(struct socket *sock, 138void rds_tcp_reset_callbacks(struct socket *sock,
139 struct rds_connection *conn) 139 struct rds_conn_path *cp)
140{ 140{
141 struct rds_tcp_connection *tc = conn->c_transport_data; 141 struct rds_tcp_connection *tc = cp->cp_transport_data;
142 struct socket *osock = tc->t_sock; 142 struct socket *osock = tc->t_sock;
143 143
144 if (!osock) 144 if (!osock)
@@ -148,8 +148,8 @@ void rds_tcp_reset_callbacks(struct socket *sock,
148 * We have an outstanding SYN to this peer, which may 148 * We have an outstanding SYN to this peer, which may
149 * potentially have transitioned to the RDS_CONN_UP state, 149 * potentially have transitioned to the RDS_CONN_UP state,
150 * so we must quiesce any send threads before resetting 150 * so we must quiesce any send threads before resetting
151 * c_transport_data. We quiesce these threads by setting 151 * cp_transport_data. We quiesce these threads by setting
152 * c_state to something other than RDS_CONN_UP, and then 152 * cp_state to something other than RDS_CONN_UP, and then
153 * waiting for any existing threads in rds_send_xmit to 153 * waiting for any existing threads in rds_send_xmit to
154 * complete release_in_xmit(). (Subsequent threads entering 154 * complete release_in_xmit(). (Subsequent threads entering
155 * rds_send_xmit() will bail on !rds_conn_up(). 155 * rds_send_xmit() will bail on !rds_conn_up().
@@ -164,8 +164,8 @@ void rds_tcp_reset_callbacks(struct socket *sock,
164 * RDS_CONN_RESETTTING, to ensure that rds_tcp_state_change 164 * RDS_CONN_RESETTTING, to ensure that rds_tcp_state_change
165 * cannot mark rds_conn_path_up() in the window before lock_sock() 165 * cannot mark rds_conn_path_up() in the window before lock_sock()
166 */ 166 */
167 atomic_set(&conn->c_state, RDS_CONN_RESETTING); 167 atomic_set(&cp->cp_state, RDS_CONN_RESETTING);
168 wait_event(conn->c_waitq, !test_bit(RDS_IN_XMIT, &conn->c_flags)); 168 wait_event(cp->cp_waitq, !test_bit(RDS_IN_XMIT, &cp->cp_flags));
169 lock_sock(osock->sk); 169 lock_sock(osock->sk);
170 /* reset receive side state for rds_tcp_data_recv() for osock */ 170 /* reset receive side state for rds_tcp_data_recv() for osock */
171 if (tc->t_tinc) { 171 if (tc->t_tinc) {
@@ -186,11 +186,12 @@ void rds_tcp_reset_callbacks(struct socket *sock,
186 release_sock(osock->sk); 186 release_sock(osock->sk);
187 sock_release(osock); 187 sock_release(osock);
188newsock: 188newsock:
189 rds_send_path_reset(&conn->c_path[0]); 189 rds_send_path_reset(cp);
190 lock_sock(sock->sk); 190 lock_sock(sock->sk);
191 write_lock_bh(&sock->sk->sk_callback_lock); 191 write_lock_bh(&sock->sk->sk_callback_lock);
192 tc->t_sock = sock; 192 tc->t_sock = sock;
193 sock->sk->sk_user_data = conn; 193 tc->t_cpath = cp;
194 sock->sk->sk_user_data = cp;
194 sock->sk->sk_data_ready = rds_tcp_data_ready; 195 sock->sk->sk_data_ready = rds_tcp_data_ready;
195 sock->sk->sk_write_space = rds_tcp_write_space; 196 sock->sk->sk_write_space = rds_tcp_write_space;
196 sock->sk->sk_state_change = rds_tcp_state_change; 197 sock->sk->sk_state_change = rds_tcp_state_change;
@@ -203,9 +204,9 @@ newsock:
203 * above rds_tcp_reset_callbacks for notes about synchronization 204 * above rds_tcp_reset_callbacks for notes about synchronization
204 * with data path 205 * with data path
205 */ 206 */
206void rds_tcp_set_callbacks(struct socket *sock, struct rds_connection *conn) 207void rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp)
207{ 208{
208 struct rds_tcp_connection *tc = conn->c_transport_data; 209 struct rds_tcp_connection *tc = cp->cp_transport_data;
209 210
210 rdsdebug("setting sock %p callbacks to tc %p\n", sock, tc); 211 rdsdebug("setting sock %p callbacks to tc %p\n", sock, tc);
211 write_lock_bh(&sock->sk->sk_callback_lock); 212 write_lock_bh(&sock->sk->sk_callback_lock);
@@ -221,12 +222,12 @@ void rds_tcp_set_callbacks(struct socket *sock, struct rds_connection *conn)
221 sock->sk->sk_data_ready = sock->sk->sk_user_data; 222 sock->sk->sk_data_ready = sock->sk->sk_user_data;
222 223
223 tc->t_sock = sock; 224 tc->t_sock = sock;
224 tc->t_cpath = &conn->c_path[0]; 225 tc->t_cpath = cp;
225 tc->t_orig_data_ready = sock->sk->sk_data_ready; 226 tc->t_orig_data_ready = sock->sk->sk_data_ready;
226 tc->t_orig_write_space = sock->sk->sk_write_space; 227 tc->t_orig_write_space = sock->sk->sk_write_space;
227 tc->t_orig_state_change = sock->sk->sk_state_change; 228 tc->t_orig_state_change = sock->sk->sk_state_change;
228 229
229 sock->sk->sk_user_data = conn; 230 sock->sk->sk_user_data = cp;
230 sock->sk->sk_data_ready = rds_tcp_data_ready; 231 sock->sk->sk_data_ready = rds_tcp_data_ready;
231 sock->sk->sk_write_space = rds_tcp_write_space; 232 sock->sk->sk_write_space = rds_tcp_write_space;
232 sock->sk->sk_state_change = rds_tcp_state_change; 233 sock->sk->sk_state_change = rds_tcp_state_change;
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
index e1ff16908c5e..151b09d1af43 100644
--- a/net/rds/tcp.h
+++ b/net/rds/tcp.h
@@ -49,8 +49,8 @@ struct rds_tcp_statistics {
49/* tcp.c */ 49/* tcp.c */
50void rds_tcp_tune(struct socket *sock); 50void rds_tcp_tune(struct socket *sock);
51void rds_tcp_nonagle(struct socket *sock); 51void rds_tcp_nonagle(struct socket *sock);
52void rds_tcp_set_callbacks(struct socket *sock, struct rds_connection *conn); 52void rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp);
53void rds_tcp_reset_callbacks(struct socket *sock, struct rds_connection *conn); 53void rds_tcp_reset_callbacks(struct socket *sock, struct rds_conn_path *cp);
54void rds_tcp_restore_callbacks(struct socket *sock, 54void rds_tcp_restore_callbacks(struct socket *sock,
55 struct rds_tcp_connection *tc); 55 struct rds_tcp_connection *tc);
56u32 rds_tcp_snd_nxt(struct rds_tcp_connection *tc); 56u32 rds_tcp_snd_nxt(struct rds_tcp_connection *tc);
diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c
index 146692c8afac..7eddce50e7a3 100644
--- a/net/rds/tcp_connect.c
+++ b/net/rds/tcp_connect.c
@@ -41,16 +41,16 @@
41void rds_tcp_state_change(struct sock *sk) 41void rds_tcp_state_change(struct sock *sk)
42{ 42{
43 void (*state_change)(struct sock *sk); 43 void (*state_change)(struct sock *sk);
44 struct rds_connection *conn; 44 struct rds_conn_path *cp;
45 struct rds_tcp_connection *tc; 45 struct rds_tcp_connection *tc;
46 46
47 read_lock_bh(&sk->sk_callback_lock); 47 read_lock_bh(&sk->sk_callback_lock);
48 conn = sk->sk_user_data; 48 cp = sk->sk_user_data;
49 if (!conn) { 49 if (!cp) {
50 state_change = sk->sk_state_change; 50 state_change = sk->sk_state_change;
51 goto out; 51 goto out;
52 } 52 }
53 tc = conn->c_transport_data; 53 tc = cp->cp_transport_data;
54 state_change = tc->t_orig_state_change; 54 state_change = tc->t_orig_state_change;
55 55
56 rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state); 56 rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state);
@@ -61,12 +61,11 @@ void rds_tcp_state_change(struct sock *sk)
61 case TCP_SYN_RECV: 61 case TCP_SYN_RECV:
62 break; 62 break;
63 case TCP_ESTABLISHED: 63 case TCP_ESTABLISHED:
64 rds_connect_path_complete(&conn->c_path[0], 64 rds_connect_path_complete(cp, RDS_CONN_CONNECTING);
65 RDS_CONN_CONNECTING);
66 break; 65 break;
67 case TCP_CLOSE_WAIT: 66 case TCP_CLOSE_WAIT:
68 case TCP_CLOSE: 67 case TCP_CLOSE:
69 rds_conn_drop(conn); 68 rds_conn_path_drop(cp);
70 default: 69 default:
71 break; 70 break;
72 } 71 }
@@ -81,6 +80,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn)
81 struct sockaddr_in src, dest; 80 struct sockaddr_in src, dest;
82 int ret; 81 int ret;
83 struct rds_tcp_connection *tc = conn->c_transport_data; 82 struct rds_tcp_connection *tc = conn->c_transport_data;
83 struct rds_conn_path *cp = &conn->c_path[0];
84 84
85 mutex_lock(&tc->t_conn_path_lock); 85 mutex_lock(&tc->t_conn_path_lock);
86 86
@@ -114,7 +114,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn)
114 * once we call connect() we can start getting callbacks and they 114 * once we call connect() we can start getting callbacks and they
115 * own the socket 115 * own the socket
116 */ 116 */
117 rds_tcp_set_callbacks(sock, conn); 117 rds_tcp_set_callbacks(sock, cp);
118 ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), 118 ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest),
119 O_NONBLOCK); 119 O_NONBLOCK);
120 120
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
index d8933469ab13..ca975a217a49 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -79,6 +79,7 @@ int rds_tcp_accept_one(struct socket *sock)
79 struct inet_sock *inet; 79 struct inet_sock *inet;
80 struct rds_tcp_connection *rs_tcp = NULL; 80 struct rds_tcp_connection *rs_tcp = NULL;
81 int conn_state; 81 int conn_state;
82 struct rds_conn_path *cp;
82 83
83 if (!sock) /* module unload or netns delete in progress */ 84 if (!sock) /* module unload or netns delete in progress */
84 return -ENETUNREACH; 85 return -ENETUNREACH;
@@ -120,6 +121,7 @@ int rds_tcp_accept_one(struct socket *sock)
120 * rds_tcp_state_change() will do that cleanup 121 * rds_tcp_state_change() will do that cleanup
121 */ 122 */
122 rs_tcp = (struct rds_tcp_connection *)conn->c_transport_data; 123 rs_tcp = (struct rds_tcp_connection *)conn->c_transport_data;
124 cp = &conn->c_path[0];
123 rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_CONNECTING); 125 rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_CONNECTING);
124 mutex_lock(&rs_tcp->t_conn_path_lock); 126 mutex_lock(&rs_tcp->t_conn_path_lock);
125 conn_state = rds_conn_state(conn); 127 conn_state = rds_conn_state(conn);
@@ -136,16 +138,14 @@ int rds_tcp_accept_one(struct socket *sock)
136 !conn->c_path[0].cp_outgoing) { 138 !conn->c_path[0].cp_outgoing) {
137 goto rst_nsk; 139 goto rst_nsk;
138 } else { 140 } else {
139 rds_tcp_reset_callbacks(new_sock, conn); 141 rds_tcp_reset_callbacks(new_sock, cp);
140 conn->c_path[0].cp_outgoing = 0; 142 conn->c_path[0].cp_outgoing = 0;
141 /* rds_connect_path_complete() marks RDS_CONN_UP */ 143 /* rds_connect_path_complete() marks RDS_CONN_UP */
142 rds_connect_path_complete(&conn->c_path[0], 144 rds_connect_path_complete(cp, RDS_CONN_RESETTING);
143 RDS_CONN_RESETTING);
144 } 145 }
145 } else { 146 } else {
146 rds_tcp_set_callbacks(new_sock, conn); 147 rds_tcp_set_callbacks(new_sock, cp);
147 rds_connect_path_complete(&conn->c_path[0], 148 rds_connect_path_complete(cp, RDS_CONN_CONNECTING);
148 RDS_CONN_CONNECTING);
149 } 149 }
150 new_sock = NULL; 150 new_sock = NULL;
151 ret = 0; 151 ret = 0;
diff --git a/net/rds/tcp_recv.c b/net/rds/tcp_recv.c
index 4a87d9ef3084..aa7a79a00ef7 100644
--- a/net/rds/tcp_recv.c
+++ b/net/rds/tcp_recv.c
@@ -297,24 +297,24 @@ int rds_tcp_recv(struct rds_connection *conn)
297void rds_tcp_data_ready(struct sock *sk) 297void rds_tcp_data_ready(struct sock *sk)
298{ 298{
299 void (*ready)(struct sock *sk); 299 void (*ready)(struct sock *sk);
300 struct rds_connection *conn; 300 struct rds_conn_path *cp;
301 struct rds_tcp_connection *tc; 301 struct rds_tcp_connection *tc;
302 302
303 rdsdebug("data ready sk %p\n", sk); 303 rdsdebug("data ready sk %p\n", sk);
304 304
305 read_lock_bh(&sk->sk_callback_lock); 305 read_lock_bh(&sk->sk_callback_lock);
306 conn = sk->sk_user_data; 306 cp = sk->sk_user_data;
307 if (!conn) { /* check for teardown race */ 307 if (!cp) { /* check for teardown race */
308 ready = sk->sk_data_ready; 308 ready = sk->sk_data_ready;
309 goto out; 309 goto out;
310 } 310 }
311 311
312 tc = conn->c_transport_data; 312 tc = cp->cp_transport_data;
313 ready = tc->t_orig_data_ready; 313 ready = tc->t_orig_data_ready;
314 rds_tcp_stats_inc(s_tcp_data_ready_calls); 314 rds_tcp_stats_inc(s_tcp_data_ready_calls);
315 315
316 if (rds_tcp_read_sock(conn, GFP_ATOMIC) == -ENOMEM) 316 if (rds_tcp_read_sock(cp->cp_conn, GFP_ATOMIC) == -ENOMEM)
317 queue_delayed_work(rds_wq, &conn->c_recv_w, 0); 317 queue_delayed_work(rds_wq, &cp->cp_recv_w, 0);
318out: 318out:
319 read_unlock_bh(&sk->sk_callback_lock); 319 read_unlock_bh(&sk->sk_callback_lock);
320 ready(sk); 320 ready(sk);
diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c
index 52cda947457b..57e0f5826406 100644
--- a/net/rds/tcp_send.c
+++ b/net/rds/tcp_send.c
@@ -178,27 +178,27 @@ static int rds_tcp_is_acked(struct rds_message *rm, uint64_t ack)
178void rds_tcp_write_space(struct sock *sk) 178void rds_tcp_write_space(struct sock *sk)
179{ 179{
180 void (*write_space)(struct sock *sk); 180 void (*write_space)(struct sock *sk);
181 struct rds_connection *conn; 181 struct rds_conn_path *cp;
182 struct rds_tcp_connection *tc; 182 struct rds_tcp_connection *tc;
183 183
184 read_lock_bh(&sk->sk_callback_lock); 184 read_lock_bh(&sk->sk_callback_lock);
185 conn = sk->sk_user_data; 185 cp = sk->sk_user_data;
186 if (!conn) { 186 if (!cp) {
187 write_space = sk->sk_write_space; 187 write_space = sk->sk_write_space;
188 goto out; 188 goto out;
189 } 189 }
190 190
191 tc = conn->c_transport_data; 191 tc = cp->cp_transport_data;
192 rdsdebug("write_space for tc %p\n", tc); 192 rdsdebug("write_space for tc %p\n", tc);
193 write_space = tc->t_orig_write_space; 193 write_space = tc->t_orig_write_space;
194 rds_tcp_stats_inc(s_tcp_write_space_calls); 194 rds_tcp_stats_inc(s_tcp_write_space_calls);
195 195
196 rdsdebug("tcp una %u\n", rds_tcp_snd_una(tc)); 196 rdsdebug("tcp una %u\n", rds_tcp_snd_una(tc));
197 tc->t_last_seen_una = rds_tcp_snd_una(tc); 197 tc->t_last_seen_una = rds_tcp_snd_una(tc);
198 rds_send_drop_acked(conn, rds_tcp_snd_una(tc), rds_tcp_is_acked); 198 rds_send_path_drop_acked(cp, rds_tcp_snd_una(tc), rds_tcp_is_acked);
199 199
200 if ((atomic_read(&sk->sk_wmem_alloc) << 1) <= sk->sk_sndbuf) 200 if ((atomic_read(&sk->sk_wmem_alloc) << 1) <= sk->sk_sndbuf)
201 queue_delayed_work(rds_wq, &conn->c_send_w, 0); 201 queue_delayed_work(rds_wq, &cp->cp_send_w, 0);
202 202
203out: 203out:
204 read_unlock_bh(&sk->sk_callback_lock); 204 read_unlock_bh(&sk->sk_callback_lock);