diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2016-06-30 19:11:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-01 16:45:17 -0400 |
commit | ea3b1ea53930879c9847044f5cb9c97411cae797 (patch) | |
tree | 253e822f3d1bd081b791320683663dc4fcf3b9b0 /net/rds | |
parent | afb4164d91c7486a1d4ab098a1b88e27b5e25772 (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.c | 25 | ||||
-rw-r--r-- | net/rds/tcp.h | 4 | ||||
-rw-r--r-- | net/rds/tcp_connect.c | 16 | ||||
-rw-r--r-- | net/rds/tcp_listen.c | 12 | ||||
-rw-r--r-- | net/rds/tcp_recv.c | 12 | ||||
-rw-r--r-- | net/rds/tcp_send.c | 12 |
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 | */ |
138 | void rds_tcp_reset_callbacks(struct socket *sock, | 138 | void 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); |
188 | newsock: | 188 | newsock: |
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 | */ |
206 | void rds_tcp_set_callbacks(struct socket *sock, struct rds_connection *conn) | 207 | void 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 */ |
50 | void rds_tcp_tune(struct socket *sock); | 50 | void rds_tcp_tune(struct socket *sock); |
51 | void rds_tcp_nonagle(struct socket *sock); | 51 | void rds_tcp_nonagle(struct socket *sock); |
52 | void rds_tcp_set_callbacks(struct socket *sock, struct rds_connection *conn); | 52 | void rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp); |
53 | void rds_tcp_reset_callbacks(struct socket *sock, struct rds_connection *conn); | 53 | void rds_tcp_reset_callbacks(struct socket *sock, struct rds_conn_path *cp); |
54 | void rds_tcp_restore_callbacks(struct socket *sock, | 54 | void rds_tcp_restore_callbacks(struct socket *sock, |
55 | struct rds_tcp_connection *tc); | 55 | struct rds_tcp_connection *tc); |
56 | u32 rds_tcp_snd_nxt(struct rds_tcp_connection *tc); | 56 | u32 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 @@ | |||
41 | void rds_tcp_state_change(struct sock *sk) | 41 | void 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) | |||
297 | void rds_tcp_data_ready(struct sock *sk) | 297 | void 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); |
318 | out: | 318 | out: |
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) | |||
178 | void rds_tcp_write_space(struct sock *sk) | 178 | void 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 | ||
203 | out: | 203 | out: |
204 | read_unlock_bh(&sk->sk_callback_lock); | 204 | read_unlock_bh(&sk->sk_callback_lock); |