2 * Shared Memory Communications over RDMA (SMC-R) and RoCE
4 * Socket Closing - normal and abnormal
6 * Copyright IBM Corp. 2016
8 * Author(s): Ursula Braun <ubraun@linux.vnet.ibm.com>
11 #include <linux/workqueue.h>
12 #include <linux/sched/signal.h>
19 #include "smc_close.h"
21 #define SMC_CLOSE_WAIT_TX_PENDS_TIME (5 * HZ)
23 static void smc_close_cleanup_listen(struct sock
*parent
)
27 /* Close non-accepted connections */
28 while ((sk
= smc_accept_dequeue(parent
, NULL
)))
29 smc_close_non_accepted(sk
);
32 static void smc_close_wait_tx_pends(struct smc_sock
*smc
)
34 DEFINE_WAIT_FUNC(wait
, woken_wake_function
);
35 struct sock
*sk
= &smc
->sk
;
38 timeout
= SMC_CLOSE_WAIT_TX_PENDS_TIME
;
39 add_wait_queue(sk_sleep(sk
), &wait
);
40 while (!signal_pending(current
) && timeout
) {
43 rc
= sk_wait_event(sk
, &timeout
,
44 !smc_cdc_tx_has_pending(&smc
->conn
),
49 remove_wait_queue(sk_sleep(sk
), &wait
);
52 /* wait for sndbuf data being transmitted */
53 static void smc_close_stream_wait(struct smc_sock
*smc
, long timeout
)
55 DEFINE_WAIT_FUNC(wait
, woken_wake_function
);
56 struct sock
*sk
= &smc
->sk
;
61 if (!smc_tx_prepared_sends(&smc
->conn
))
64 smc
->wait_close_tx_prepared
= 1;
65 add_wait_queue(sk_sleep(sk
), &wait
);
66 while (!signal_pending(current
) && timeout
) {
69 rc
= sk_wait_event(sk
, &timeout
,
70 !smc_tx_prepared_sends(&smc
->conn
) ||
71 (sk
->sk_err
== ECONNABORTED
) ||
72 (sk
->sk_err
== ECONNRESET
),
77 remove_wait_queue(sk_sleep(sk
), &wait
);
78 smc
->wait_close_tx_prepared
= 0;
81 void smc_close_wake_tx_prepared(struct smc_sock
*smc
)
83 if (smc
->wait_close_tx_prepared
)
84 /* wake up socket closing */
85 smc
->sk
.sk_state_change(&smc
->sk
);
88 static int smc_close_wr(struct smc_connection
*conn
)
90 conn
->local_tx_ctrl
.conn_state_flags
.peer_done_writing
= 1;
92 return smc_cdc_get_slot_and_msg_send(conn
);
95 static int smc_close_final(struct smc_connection
*conn
)
97 if (atomic_read(&conn
->bytes_to_rcv
))
98 conn
->local_tx_ctrl
.conn_state_flags
.peer_conn_abort
= 1;
100 conn
->local_tx_ctrl
.conn_state_flags
.peer_conn_closed
= 1;
102 return smc_cdc_get_slot_and_msg_send(conn
);
105 static int smc_close_abort(struct smc_connection
*conn
)
107 conn
->local_tx_ctrl
.conn_state_flags
.peer_conn_abort
= 1;
109 return smc_cdc_get_slot_and_msg_send(conn
);
112 /* terminate smc socket abnormally - active abort
113 * RDMA communication no longer possible
115 void smc_close_active_abort(struct smc_sock
*smc
)
117 struct smc_cdc_conn_state_flags
*txflags
=
118 &smc
->conn
.local_tx_ctrl
.conn_state_flags
;
120 bh_lock_sock(&smc
->sk
);
121 smc
->sk
.sk_err
= ECONNABORTED
;
122 if (smc
->clcsock
&& smc
->clcsock
->sk
) {
123 smc
->clcsock
->sk
->sk_err
= ECONNABORTED
;
124 smc
->clcsock
->sk
->sk_state_change(smc
->clcsock
->sk
);
126 switch (smc
->sk
.sk_state
) {
128 smc
->sk
.sk_state
= SMC_PEERABORTWAIT
;
130 case SMC_APPCLOSEWAIT1
:
131 case SMC_APPCLOSEWAIT2
:
132 txflags
->peer_conn_abort
= 1;
133 sock_release(smc
->clcsock
);
134 if (!smc_cdc_rxed_any_close(&smc
->conn
))
135 smc
->sk
.sk_state
= SMC_PEERABORTWAIT
;
137 smc
->sk
.sk_state
= SMC_CLOSED
;
139 case SMC_PEERCLOSEWAIT1
:
140 case SMC_PEERCLOSEWAIT2
:
141 if (!txflags
->peer_conn_closed
) {
142 smc
->sk
.sk_state
= SMC_PEERABORTWAIT
;
143 txflags
->peer_conn_abort
= 1;
144 sock_release(smc
->clcsock
);
146 smc
->sk
.sk_state
= SMC_CLOSED
;
149 case SMC_PROCESSABORT
:
150 case SMC_APPFINCLOSEWAIT
:
151 if (!txflags
->peer_conn_closed
) {
152 txflags
->peer_conn_abort
= 1;
153 sock_release(smc
->clcsock
);
155 smc
->sk
.sk_state
= SMC_CLOSED
;
157 case SMC_PEERFINCLOSEWAIT
:
158 case SMC_PEERABORTWAIT
:
163 sock_set_flag(&smc
->sk
, SOCK_DEAD
);
164 bh_unlock_sock(&smc
->sk
);
165 smc
->sk
.sk_state_change(&smc
->sk
);
168 int smc_close_active(struct smc_sock
*smc
)
170 struct smc_cdc_conn_state_flags
*txflags
=
171 &smc
->conn
.local_tx_ctrl
.conn_state_flags
;
172 long timeout
= SMC_MAX_STREAM_WAIT_TIMEOUT
;
173 struct smc_connection
*conn
= &smc
->conn
;
174 struct sock
*sk
= &smc
->sk
;
178 if (sock_flag(sk
, SOCK_LINGER
) &&
179 !(current
->flags
& PF_EXITING
))
180 timeout
= sk
->sk_lingertime
;
183 old_state
= sk
->sk_state
;
186 sk
->sk_state
= SMC_CLOSED
;
187 if (smc
->smc_listen_work
.func
)
188 flush_work(&smc
->smc_listen_work
);
192 sk
->sk_state
= SMC_CLOSED
;
193 sk
->sk_state_change(sk
); /* wake up accept */
194 if (smc
->clcsock
&& smc
->clcsock
->sk
) {
195 rc
= kernel_sock_shutdown(smc
->clcsock
, SHUT_RDWR
);
196 /* wake up kernel_accept of smc_tcp_listen_worker */
197 smc
->clcsock
->sk
->sk_data_ready(smc
->clcsock
->sk
);
200 smc_close_cleanup_listen(sk
);
201 flush_work(&smc
->tcp_listen_work
);
205 smc_close_stream_wait(smc
, timeout
);
207 cancel_work_sync(&conn
->tx_work
);
209 if (sk
->sk_state
== SMC_ACTIVE
) {
210 /* send close request */
211 rc
= smc_close_final(conn
);
212 sk
->sk_state
= SMC_PEERCLOSEWAIT1
;
214 /* peer event has changed the state */
218 case SMC_APPFINCLOSEWAIT
:
219 /* socket already shutdown wr or both (active close) */
220 if (txflags
->peer_done_writing
&&
221 !txflags
->peer_conn_closed
) {
222 /* just shutdown wr done, send close request */
223 rc
= smc_close_final(conn
);
225 sk
->sk_state
= SMC_CLOSED
;
226 smc_close_wait_tx_pends(smc
);
228 case SMC_APPCLOSEWAIT1
:
229 case SMC_APPCLOSEWAIT2
:
230 if (!smc_cdc_rxed_any_close(conn
))
231 smc_close_stream_wait(smc
, timeout
);
233 cancel_work_sync(&conn
->tx_work
);
235 if (sk
->sk_err
!= ECONNABORTED
) {
236 /* confirm close from peer */
237 rc
= smc_close_final(conn
);
241 if (smc_cdc_rxed_any_close(conn
))
242 /* peer has closed the socket already */
243 sk
->sk_state
= SMC_CLOSED
;
245 /* peer has just issued a shutdown write */
246 sk
->sk_state
= SMC_PEERFINCLOSEWAIT
;
247 smc_close_wait_tx_pends(smc
);
249 case SMC_PEERCLOSEWAIT1
:
250 case SMC_PEERCLOSEWAIT2
:
251 case SMC_PEERFINCLOSEWAIT
:
252 /* peer sending PeerConnectionClosed will cause transition */
254 case SMC_PROCESSABORT
:
255 cancel_work_sync(&conn
->tx_work
);
256 smc_close_abort(conn
);
257 sk
->sk_state
= SMC_CLOSED
;
258 smc_close_wait_tx_pends(smc
);
260 case SMC_PEERABORTWAIT
:
262 /* nothing to do, add tracing in future patch */
266 if (old_state
!= sk
->sk_state
)
267 sk
->sk_state_change(&smc
->sk
);
271 static void smc_close_passive_abort_received(struct smc_sock
*smc
)
273 struct smc_cdc_conn_state_flags
*txflags
=
274 &smc
->conn
.local_tx_ctrl
.conn_state_flags
;
275 struct sock
*sk
= &smc
->sk
;
277 switch (sk
->sk_state
) {
279 case SMC_APPFINCLOSEWAIT
:
280 case SMC_APPCLOSEWAIT1
:
281 case SMC_APPCLOSEWAIT2
:
282 smc_close_abort(&smc
->conn
);
283 sk
->sk_state
= SMC_PROCESSABORT
;
285 case SMC_PEERCLOSEWAIT1
:
286 case SMC_PEERCLOSEWAIT2
:
287 if (txflags
->peer_done_writing
&&
288 !txflags
->peer_conn_closed
) {
289 /* just shutdown, but not yet closed locally */
290 smc_close_abort(&smc
->conn
);
291 sk
->sk_state
= SMC_PROCESSABORT
;
293 sk
->sk_state
= SMC_CLOSED
;
296 case SMC_PEERFINCLOSEWAIT
:
297 case SMC_PEERABORTWAIT
:
298 sk
->sk_state
= SMC_CLOSED
;
301 case SMC_PROCESSABORT
:
302 /* nothing to do, add tracing in future patch */
307 /* Some kind of closing has been received: peer_conn_closed, peer_conn_abort,
308 * or peer_done_writing.
309 * Called under tasklet context.
311 void smc_close_passive_received(struct smc_sock
*smc
)
313 struct smc_cdc_conn_state_flags
*rxflags
=
314 &smc
->conn
.local_rx_ctrl
.conn_state_flags
;
315 struct sock
*sk
= &smc
->sk
;
318 sk
->sk_shutdown
|= RCV_SHUTDOWN
;
319 if (smc
->clcsock
&& smc
->clcsock
->sk
)
320 smc
->clcsock
->sk
->sk_shutdown
|= RCV_SHUTDOWN
;
321 sock_set_flag(&smc
->sk
, SOCK_DONE
);
323 old_state
= sk
->sk_state
;
325 if (rxflags
->peer_conn_abort
) {
326 smc_close_passive_abort_received(smc
);
330 switch (sk
->sk_state
) {
332 if (atomic_read(&smc
->conn
.bytes_to_rcv
) ||
333 (rxflags
->peer_done_writing
&&
334 !rxflags
->peer_conn_closed
))
335 sk
->sk_state
= SMC_APPCLOSEWAIT1
;
337 sk
->sk_state
= SMC_CLOSED
;
340 sk
->sk_state
= SMC_APPCLOSEWAIT1
;
342 case SMC_PEERCLOSEWAIT1
:
343 if (rxflags
->peer_done_writing
)
344 sk
->sk_state
= SMC_PEERCLOSEWAIT2
;
345 /* fall through to check for closing */
346 case SMC_PEERCLOSEWAIT2
:
347 case SMC_PEERFINCLOSEWAIT
:
348 if (!smc_cdc_rxed_any_close(&smc
->conn
))
350 if (sock_flag(sk
, SOCK_DEAD
) &&
351 (sk
->sk_shutdown
== SHUTDOWN_MASK
)) {
352 /* smc_release has already been called locally */
353 sk
->sk_state
= SMC_CLOSED
;
355 /* just shutdown, but not yet closed locally */
356 sk
->sk_state
= SMC_APPFINCLOSEWAIT
;
359 case SMC_APPCLOSEWAIT1
:
360 case SMC_APPCLOSEWAIT2
:
361 case SMC_APPFINCLOSEWAIT
:
362 case SMC_PEERABORTWAIT
:
363 case SMC_PROCESSABORT
:
365 /* nothing to do, add tracing in future patch */
370 if (old_state
!= sk
->sk_state
)
371 sk
->sk_state_change(sk
);
372 sk
->sk_data_ready(sk
); /* wakeup blocked rcvbuf consumers */
373 sk
->sk_write_space(sk
); /* wakeup blocked sndbuf producers */
375 if ((sk
->sk_state
== SMC_CLOSED
) &&
376 (sock_flag(sk
, SOCK_DEAD
) || (old_state
== SMC_INIT
))) {
377 smc_conn_free(&smc
->conn
);
378 schedule_delayed_work(&smc
->sock_put_work
,
379 SMC_CLOSE_SOCK_PUT_DELAY
);
383 void smc_close_sock_put_work(struct work_struct
*work
)
385 struct smc_sock
*smc
= container_of(to_delayed_work(work
),
389 smc
->sk
.sk_prot
->unhash(&smc
->sk
);
393 int smc_close_shutdown_write(struct smc_sock
*smc
)
395 struct smc_connection
*conn
= &smc
->conn
;
396 long timeout
= SMC_MAX_STREAM_WAIT_TIMEOUT
;
397 struct sock
*sk
= &smc
->sk
;
401 if (sock_flag(sk
, SOCK_LINGER
))
402 timeout
= sk
->sk_lingertime
;
405 old_state
= sk
->sk_state
;
408 smc_close_stream_wait(smc
, timeout
);
410 cancel_work_sync(&conn
->tx_work
);
412 /* send close wr request */
413 rc
= smc_close_wr(conn
);
414 if (sk
->sk_state
== SMC_ACTIVE
)
415 sk
->sk_state
= SMC_PEERCLOSEWAIT1
;
419 case SMC_APPCLOSEWAIT1
:
421 if (!smc_cdc_rxed_any_close(conn
))
422 smc_close_stream_wait(smc
, timeout
);
424 cancel_work_sync(&conn
->tx_work
);
426 /* confirm close from peer */
427 rc
= smc_close_wr(conn
);
428 sk
->sk_state
= SMC_APPCLOSEWAIT2
;
430 case SMC_APPCLOSEWAIT2
:
431 case SMC_PEERFINCLOSEWAIT
:
432 case SMC_PEERCLOSEWAIT1
:
433 case SMC_PEERCLOSEWAIT2
:
434 case SMC_APPFINCLOSEWAIT
:
435 case SMC_PROCESSABORT
:
436 case SMC_PEERABORTWAIT
:
437 /* nothing to do, add tracing in future patch */
441 if (old_state
!= sk
->sk_state
)
442 sk
->sk_state_change(&smc
->sk
);