smc_close.c 11 KB

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