Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec...
[linux-2.6-microblaze.git] / net / smc / smc_close.c
1 /*
2  *  Shared Memory Communications over RDMA (SMC-R) and RoCE
3  *
4  *  Socket Closing - normal and abnormal
5  *
6  *  Copyright IBM Corp. 2016
7  *
8  *  Author(s):  Ursula Braun <ubraun@linux.vnet.ibm.com>
9  */
10
11 #include <linux/workqueue.h>
12 #include <linux/sched/signal.h>
13
14 #include <net/sock.h>
15
16 #include "smc.h"
17 #include "smc_tx.h"
18 #include "smc_cdc.h"
19 #include "smc_close.h"
20
21 #define SMC_CLOSE_WAIT_TX_PENDS_TIME            (5 * HZ)
22
23 static void smc_close_cleanup_listen(struct sock *parent)
24 {
25         struct sock *sk;
26
27         /* Close non-accepted connections */
28         while ((sk = smc_accept_dequeue(parent, NULL)))
29                 smc_close_non_accepted(sk);
30 }
31
32 static void smc_close_wait_tx_pends(struct smc_sock *smc)
33 {
34         DEFINE_WAIT_FUNC(wait, woken_wake_function);
35         struct sock *sk = &smc->sk;
36         signed long timeout;
37
38         timeout = SMC_CLOSE_WAIT_TX_PENDS_TIME;
39         add_wait_queue(sk_sleep(sk), &wait);
40         while (!signal_pending(current) && timeout) {
41                 int rc;
42
43                 rc = sk_wait_event(sk, &timeout,
44                                    !smc_cdc_tx_has_pending(&smc->conn),
45                                    &wait);
46                 if (rc)
47                         break;
48         }
49         remove_wait_queue(sk_sleep(sk), &wait);
50 }
51
52 /* wait for sndbuf data being transmitted */
53 static void smc_close_stream_wait(struct smc_sock *smc, long timeout)
54 {
55         DEFINE_WAIT_FUNC(wait, woken_wake_function);
56         struct sock *sk = &smc->sk;
57
58         if (!timeout)
59                 return;
60
61         if (!smc_tx_prepared_sends(&smc->conn))
62                 return;
63
64         smc->wait_close_tx_prepared = 1;
65         add_wait_queue(sk_sleep(sk), &wait);
66         while (!signal_pending(current) && timeout) {
67                 int rc;
68
69                 rc = sk_wait_event(sk, &timeout,
70                                    !smc_tx_prepared_sends(&smc->conn) ||
71                                    (sk->sk_err == ECONNABORTED) ||
72                                    (sk->sk_err == ECONNRESET),
73                                    &wait);
74                 if (rc)
75                         break;
76         }
77         remove_wait_queue(sk_sleep(sk), &wait);
78         smc->wait_close_tx_prepared = 0;
79 }
80
81 void smc_close_wake_tx_prepared(struct smc_sock *smc)
82 {
83         if (smc->wait_close_tx_prepared)
84                 /* wake up socket closing */
85                 smc->sk.sk_state_change(&smc->sk);
86 }
87
88 static int smc_close_wr(struct smc_connection *conn)
89 {
90         conn->local_tx_ctrl.conn_state_flags.peer_done_writing = 1;
91
92         return smc_cdc_get_slot_and_msg_send(conn);
93 }
94
95 static int smc_close_final(struct smc_connection *conn)
96 {
97         if (atomic_read(&conn->bytes_to_rcv))
98                 conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1;
99         else
100                 conn->local_tx_ctrl.conn_state_flags.peer_conn_closed = 1;
101
102         return smc_cdc_get_slot_and_msg_send(conn);
103 }
104
105 static int smc_close_abort(struct smc_connection *conn)
106 {
107         conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1;
108
109         return smc_cdc_get_slot_and_msg_send(conn);
110 }
111
112 /* terminate smc socket abnormally - active abort
113  * RDMA communication no longer possible
114  */
115 void smc_close_active_abort(struct smc_sock *smc)
116 {
117         struct smc_cdc_conn_state_flags *txflags =
118                 &smc->conn.local_tx_ctrl.conn_state_flags;
119
120         smc->sk.sk_err = ECONNABORTED;
121         if (smc->clcsock && smc->clcsock->sk) {
122                 smc->clcsock->sk->sk_err = ECONNABORTED;
123                 smc->clcsock->sk->sk_state_change(smc->clcsock->sk);
124         }
125         switch (smc->sk.sk_state) {
126         case SMC_INIT:
127         case SMC_ACTIVE:
128                 smc->sk.sk_state = SMC_PEERABORTWAIT;
129                 break;
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;
136                 else
137                         smc->sk.sk_state = SMC_CLOSED;
138                 break;
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);
145                 } else {
146                         smc->sk.sk_state = SMC_CLOSED;
147                 }
148                 break;
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);
154                 }
155                 smc->sk.sk_state = SMC_CLOSED;
156                 break;
157         case SMC_PEERFINCLOSEWAIT:
158         case SMC_PEERABORTWAIT:
159         case SMC_CLOSED:
160                 break;
161         }
162
163         sock_set_flag(&smc->sk, SOCK_DEAD);
164         smc->sk.sk_state_change(&smc->sk);
165 }
166
167 static inline bool smc_close_sent_any_close(struct smc_connection *conn)
168 {
169         return conn->local_tx_ctrl.conn_state_flags.peer_conn_abort ||
170                conn->local_tx_ctrl.conn_state_flags.peer_conn_closed;
171 }
172
173 int smc_close_active(struct smc_sock *smc)
174 {
175         struct smc_cdc_conn_state_flags *txflags =
176                 &smc->conn.local_tx_ctrl.conn_state_flags;
177         struct smc_connection *conn = &smc->conn;
178         struct sock *sk = &smc->sk;
179         int old_state;
180         long timeout;
181         int rc = 0;
182
183         timeout = current->flags & PF_EXITING ?
184                   0 : sock_flag(sk, SOCK_LINGER) ?
185                       sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT;
186
187 again:
188         old_state = sk->sk_state;
189         switch (old_state) {
190         case SMC_INIT:
191                 sk->sk_state = SMC_CLOSED;
192                 if (smc->smc_listen_work.func)
193                         cancel_work_sync(&smc->smc_listen_work);
194                 break;
195         case SMC_LISTEN:
196                 sk->sk_state = SMC_CLOSED;
197                 sk->sk_state_change(sk); /* wake up accept */
198                 if (smc->clcsock && smc->clcsock->sk) {
199                         rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR);
200                         /* wake up kernel_accept of smc_tcp_listen_worker */
201                         smc->clcsock->sk->sk_data_ready(smc->clcsock->sk);
202                 }
203                 release_sock(sk);
204                 smc_close_cleanup_listen(sk);
205                 cancel_work_sync(&smc->smc_listen_work);
206                 lock_sock(sk);
207                 break;
208         case SMC_ACTIVE:
209                 smc_close_stream_wait(smc, timeout);
210                 release_sock(sk);
211                 cancel_delayed_work_sync(&conn->tx_work);
212                 lock_sock(sk);
213                 if (sk->sk_state == SMC_ACTIVE) {
214                         /* send close request */
215                         rc = smc_close_final(conn);
216                         sk->sk_state = SMC_PEERCLOSEWAIT1;
217                 } else {
218                         /* peer event has changed the state */
219                         goto again;
220                 }
221                 break;
222         case SMC_APPFINCLOSEWAIT:
223                 /* socket already shutdown wr or both (active close) */
224                 if (txflags->peer_done_writing &&
225                     !smc_close_sent_any_close(conn)) {
226                         /* just shutdown wr done, send close request */
227                         rc = smc_close_final(conn);
228                 }
229                 sk->sk_state = SMC_CLOSED;
230                 smc_close_wait_tx_pends(smc);
231                 break;
232         case SMC_APPCLOSEWAIT1:
233         case SMC_APPCLOSEWAIT2:
234                 if (!smc_cdc_rxed_any_close(conn))
235                         smc_close_stream_wait(smc, timeout);
236                 release_sock(sk);
237                 cancel_delayed_work_sync(&conn->tx_work);
238                 lock_sock(sk);
239                 if (sk->sk_err != ECONNABORTED) {
240                         /* confirm close from peer */
241                         rc = smc_close_final(conn);
242                         if (rc)
243                                 break;
244                 }
245                 if (smc_cdc_rxed_any_close(conn))
246                         /* peer has closed the socket already */
247                         sk->sk_state = SMC_CLOSED;
248                 else
249                         /* peer has just issued a shutdown write */
250                         sk->sk_state = SMC_PEERFINCLOSEWAIT;
251                 smc_close_wait_tx_pends(smc);
252                 break;
253         case SMC_PEERCLOSEWAIT1:
254         case SMC_PEERCLOSEWAIT2:
255                 if (txflags->peer_done_writing &&
256                     !smc_close_sent_any_close(conn)) {
257                         /* just shutdown wr done, send close request */
258                         rc = smc_close_final(conn);
259                 }
260                 /* peer sending PeerConnectionClosed will cause transition */
261                 break;
262         case SMC_PEERFINCLOSEWAIT:
263                 /* peer sending PeerConnectionClosed will cause transition */
264                 break;
265         case SMC_PROCESSABORT:
266                 release_sock(sk);
267                 cancel_delayed_work_sync(&conn->tx_work);
268                 lock_sock(sk);
269                 smc_close_abort(conn);
270                 sk->sk_state = SMC_CLOSED;
271                 smc_close_wait_tx_pends(smc);
272                 break;
273         case SMC_PEERABORTWAIT:
274         case SMC_CLOSED:
275                 /* nothing to do, add tracing in future patch */
276                 break;
277         }
278
279         if (old_state != sk->sk_state)
280                 sk->sk_state_change(&smc->sk);
281         return rc;
282 }
283
284 static void smc_close_passive_abort_received(struct smc_sock *smc)
285 {
286         struct smc_cdc_conn_state_flags *txflags =
287                 &smc->conn.local_tx_ctrl.conn_state_flags;
288         struct sock *sk = &smc->sk;
289
290         switch (sk->sk_state) {
291         case SMC_ACTIVE:
292         case SMC_APPFINCLOSEWAIT:
293         case SMC_APPCLOSEWAIT1:
294         case SMC_APPCLOSEWAIT2:
295                 smc_close_abort(&smc->conn);
296                 sk->sk_state = SMC_PROCESSABORT;
297                 break;
298         case SMC_PEERCLOSEWAIT1:
299         case SMC_PEERCLOSEWAIT2:
300                 if (txflags->peer_done_writing &&
301                     !smc_close_sent_any_close(&smc->conn)) {
302                         /* just shutdown, but not yet closed locally */
303                         smc_close_abort(&smc->conn);
304                         sk->sk_state = SMC_PROCESSABORT;
305                 } else {
306                         sk->sk_state = SMC_CLOSED;
307                 }
308                 break;
309         case SMC_PEERFINCLOSEWAIT:
310         case SMC_PEERABORTWAIT:
311                 sk->sk_state = SMC_CLOSED;
312                 break;
313         case SMC_INIT:
314         case SMC_PROCESSABORT:
315         /* nothing to do, add tracing in future patch */
316                 break;
317         }
318 }
319
320 /* Some kind of closing has been received: peer_conn_closed, peer_conn_abort,
321  * or peer_done_writing.
322  */
323 static void smc_close_passive_work(struct work_struct *work)
324 {
325         struct smc_connection *conn = container_of(work,
326                                                    struct smc_connection,
327                                                    close_work);
328         struct smc_sock *smc = container_of(conn, struct smc_sock, conn);
329         struct smc_cdc_conn_state_flags *rxflags;
330         struct sock *sk = &smc->sk;
331         int old_state;
332
333         lock_sock(&smc->sk);
334         old_state = sk->sk_state;
335
336         if (!conn->alert_token_local) {
337                 /* abnormal termination */
338                 smc_close_active_abort(smc);
339                 goto wakeup;
340         }
341
342         rxflags = &smc->conn.local_rx_ctrl.conn_state_flags;
343         if (rxflags->peer_conn_abort) {
344                 smc_close_passive_abort_received(smc);
345                 goto wakeup;
346         }
347
348         switch (sk->sk_state) {
349         case SMC_INIT:
350                 if (atomic_read(&smc->conn.bytes_to_rcv) ||
351                     (rxflags->peer_done_writing &&
352                      !smc_cdc_rxed_any_close(conn)))
353                         sk->sk_state = SMC_APPCLOSEWAIT1;
354                 else
355                         sk->sk_state = SMC_CLOSED;
356                 break;
357         case SMC_ACTIVE:
358                 sk->sk_state = SMC_APPCLOSEWAIT1;
359                 break;
360         case SMC_PEERCLOSEWAIT1:
361                 if (rxflags->peer_done_writing)
362                         sk->sk_state = SMC_PEERCLOSEWAIT2;
363                 /* fall through */
364                 /* to check for closing */
365         case SMC_PEERCLOSEWAIT2:
366         case SMC_PEERFINCLOSEWAIT:
367                 if (!smc_cdc_rxed_any_close(&smc->conn))
368                         break;
369                 if (sock_flag(sk, SOCK_DEAD) &&
370                     smc_close_sent_any_close(conn)) {
371                         /* smc_release has already been called locally */
372                         sk->sk_state = SMC_CLOSED;
373                 } else {
374                         /* just shutdown, but not yet closed locally */
375                         sk->sk_state = SMC_APPFINCLOSEWAIT;
376                 }
377                 break;
378         case SMC_APPCLOSEWAIT1:
379         case SMC_APPCLOSEWAIT2:
380         case SMC_APPFINCLOSEWAIT:
381         case SMC_PEERABORTWAIT:
382         case SMC_PROCESSABORT:
383         case SMC_CLOSED:
384                 /* nothing to do, add tracing in future patch */
385                 break;
386         }
387
388 wakeup:
389         sk->sk_data_ready(sk); /* wakeup blocked rcvbuf consumers */
390         sk->sk_write_space(sk); /* wakeup blocked sndbuf producers */
391
392         if (old_state != sk->sk_state) {
393                 sk->sk_state_change(sk);
394                 if ((sk->sk_state == SMC_CLOSED) &&
395                     (sock_flag(sk, SOCK_DEAD) || !sk->sk_socket)) {
396                         smc_conn_free(&smc->conn);
397                         schedule_delayed_work(&smc->sock_put_work,
398                                               SMC_CLOSE_SOCK_PUT_DELAY);
399                 }
400         }
401         release_sock(&smc->sk);
402 }
403
404 void smc_close_sock_put_work(struct work_struct *work)
405 {
406         struct smc_sock *smc = container_of(to_delayed_work(work),
407                                             struct smc_sock,
408                                             sock_put_work);
409
410         smc->sk.sk_prot->unhash(&smc->sk);
411         sock_put(&smc->sk);
412 }
413
414 int smc_close_shutdown_write(struct smc_sock *smc)
415 {
416         struct smc_connection *conn = &smc->conn;
417         struct sock *sk = &smc->sk;
418         int old_state;
419         long timeout;
420         int rc = 0;
421
422         timeout = current->flags & PF_EXITING ?
423                   0 : sock_flag(sk, SOCK_LINGER) ?
424                       sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT;
425
426 again:
427         old_state = sk->sk_state;
428         switch (old_state) {
429         case SMC_ACTIVE:
430                 smc_close_stream_wait(smc, timeout);
431                 release_sock(sk);
432                 cancel_delayed_work_sync(&conn->tx_work);
433                 lock_sock(sk);
434                 /* send close wr request */
435                 rc = smc_close_wr(conn);
436                 if (sk->sk_state == SMC_ACTIVE)
437                         sk->sk_state = SMC_PEERCLOSEWAIT1;
438                 else
439                         goto again;
440                 break;
441         case SMC_APPCLOSEWAIT1:
442                 /* passive close */
443                 if (!smc_cdc_rxed_any_close(conn))
444                         smc_close_stream_wait(smc, timeout);
445                 release_sock(sk);
446                 cancel_delayed_work_sync(&conn->tx_work);
447                 lock_sock(sk);
448                 /* confirm close from peer */
449                 rc = smc_close_wr(conn);
450                 sk->sk_state = SMC_APPCLOSEWAIT2;
451                 break;
452         case SMC_APPCLOSEWAIT2:
453         case SMC_PEERFINCLOSEWAIT:
454         case SMC_PEERCLOSEWAIT1:
455         case SMC_PEERCLOSEWAIT2:
456         case SMC_APPFINCLOSEWAIT:
457         case SMC_PROCESSABORT:
458         case SMC_PEERABORTWAIT:
459                 /* nothing to do, add tracing in future patch */
460                 break;
461         }
462
463         if (old_state != sk->sk_state)
464                 sk->sk_state_change(&smc->sk);
465         return rc;
466 }
467
468 /* Initialize close properties on connection establishment. */
469 void smc_close_init(struct smc_sock *smc)
470 {
471         INIT_WORK(&smc->conn.close_work, smc_close_passive_work);
472 }