1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Shared Memory Communications over RDMA (SMC-R) and RoCE 4 * 5 * Basic Transport Functions exploiting Infiniband API 6 * 7 * Copyright IBM Corp. 2016 8 * 9 * Author(s): Ursula Braun <ubraun@linux.vnet.ibm.com> 10 */ 11 12 #include <linux/socket.h> 13 #include <linux/if_vlan.h> 14 #include <linux/random.h> 15 #include <linux/workqueue.h> 16 #include <linux/wait.h> 17 #include <linux/reboot.h> 18 #include <net/tcp.h> 19 #include <net/sock.h> 20 #include <rdma/ib_verbs.h> 21 #include <rdma/ib_cache.h> 22 23 #include "smc.h" 24 #include "smc_clc.h" 25 #include "smc_core.h" 26 #include "smc_ib.h" 27 #include "smc_wr.h" 28 #include "smc_llc.h" 29 #include "smc_cdc.h" 30 #include "smc_close.h" 31 #include "smc_ism.h" 32 33 #define SMC_LGR_NUM_INCR 256 34 #define SMC_LGR_FREE_DELAY_SERV (600 * HZ) 35 #define SMC_LGR_FREE_DELAY_CLNT (SMC_LGR_FREE_DELAY_SERV + 10 * HZ) 36 #define SMC_LGR_FREE_DELAY_FAST (8 * HZ) 37 38 static struct smc_lgr_list smc_lgr_list = { /* established link groups */ 39 .lock = __SPIN_LOCK_UNLOCKED(smc_lgr_list.lock), 40 .list = LIST_HEAD_INIT(smc_lgr_list.list), 41 .num = 0, 42 }; 43 44 static atomic_t lgr_cnt = ATOMIC_INIT(0); /* number of existing link groups */ 45 static DECLARE_WAIT_QUEUE_HEAD(lgrs_deleted); 46 47 static void smc_buf_free(struct smc_link_group *lgr, bool is_rmb, 48 struct smc_buf_desc *buf_desc); 49 50 /* return head of link group list and its lock for a given link group */ 51 static inline struct list_head *smc_lgr_list_head(struct smc_link_group *lgr, 52 spinlock_t **lgr_lock) 53 { 54 if (lgr->is_smcd) { 55 *lgr_lock = &lgr->smcd->lgr_lock; 56 return &lgr->smcd->lgr_list; 57 } 58 59 *lgr_lock = &smc_lgr_list.lock; 60 return &smc_lgr_list.list; 61 } 62 63 static void smc_lgr_schedule_free_work(struct smc_link_group *lgr) 64 { 65 /* client link group creation always follows the server link group 66 * creation. For client use a somewhat higher removal delay time, 67 * otherwise there is a risk of out-of-sync link groups. 68 */ 69 if (!lgr->freeing && !lgr->freefast) { 70 mod_delayed_work(system_wq, &lgr->free_work, 71 (!lgr->is_smcd && lgr->role == SMC_CLNT) ? 72 SMC_LGR_FREE_DELAY_CLNT : 73 SMC_LGR_FREE_DELAY_SERV); 74 } 75 } 76 77 void smc_lgr_schedule_free_work_fast(struct smc_link_group *lgr) 78 { 79 if (!lgr->freeing && !lgr->freefast) { 80 lgr->freefast = 1; 81 mod_delayed_work(system_wq, &lgr->free_work, 82 SMC_LGR_FREE_DELAY_FAST); 83 } 84 } 85 86 /* Register connection's alert token in our lookup structure. 87 * To use rbtrees we have to implement our own insert core. 88 * Requires @conns_lock 89 * @smc connection to register 90 * Returns 0 on success, != otherwise. 91 */ 92 static void smc_lgr_add_alert_token(struct smc_connection *conn) 93 { 94 struct rb_node **link, *parent = NULL; 95 u32 token = conn->alert_token_local; 96 97 link = &conn->lgr->conns_all.rb_node; 98 while (*link) { 99 struct smc_connection *cur = rb_entry(*link, 100 struct smc_connection, alert_node); 101 102 parent = *link; 103 if (cur->alert_token_local > token) 104 link = &parent->rb_left; 105 else 106 link = &parent->rb_right; 107 } 108 /* Put the new node there */ 109 rb_link_node(&conn->alert_node, parent, link); 110 rb_insert_color(&conn->alert_node, &conn->lgr->conns_all); 111 } 112 113 /* Register connection in link group by assigning an alert token 114 * registered in a search tree. 115 * Requires @conns_lock 116 * Note that '0' is a reserved value and not assigned. 117 */ 118 static void smc_lgr_register_conn(struct smc_connection *conn) 119 { 120 struct smc_sock *smc = container_of(conn, struct smc_sock, conn); 121 static atomic_t nexttoken = ATOMIC_INIT(0); 122 123 /* find a new alert_token_local value not yet used by some connection 124 * in this link group 125 */ 126 sock_hold(&smc->sk); /* sock_put in smc_lgr_unregister_conn() */ 127 while (!conn->alert_token_local) { 128 conn->alert_token_local = atomic_inc_return(&nexttoken); 129 if (smc_lgr_find_conn(conn->alert_token_local, conn->lgr)) 130 conn->alert_token_local = 0; 131 } 132 smc_lgr_add_alert_token(conn); 133 conn->lgr->conns_num++; 134 } 135 136 /* Unregister connection and reset the alert token of the given connection< 137 */ 138 static void __smc_lgr_unregister_conn(struct smc_connection *conn) 139 { 140 struct smc_sock *smc = container_of(conn, struct smc_sock, conn); 141 struct smc_link_group *lgr = conn->lgr; 142 143 rb_erase(&conn->alert_node, &lgr->conns_all); 144 lgr->conns_num--; 145 conn->alert_token_local = 0; 146 sock_put(&smc->sk); /* sock_hold in smc_lgr_register_conn() */ 147 } 148 149 /* Unregister connection from lgr 150 */ 151 static void smc_lgr_unregister_conn(struct smc_connection *conn) 152 { 153 struct smc_link_group *lgr = conn->lgr; 154 155 if (!lgr) 156 return; 157 write_lock_bh(&lgr->conns_lock); 158 if (conn->alert_token_local) { 159 __smc_lgr_unregister_conn(conn); 160 } 161 write_unlock_bh(&lgr->conns_lock); 162 conn->lgr = NULL; 163 } 164 165 void smc_lgr_cleanup_early(struct smc_connection *conn) 166 { 167 struct smc_link_group *lgr = conn->lgr; 168 169 if (!lgr) 170 return; 171 172 smc_conn_free(conn); 173 smc_lgr_forget(lgr); 174 smc_lgr_schedule_free_work_fast(lgr); 175 } 176 177 /* Send delete link, either as client to request the initiation 178 * of the DELETE LINK sequence from server; or as server to 179 * initiate the delete processing. See smc_llc_rx_delete_link(). 180 */ 181 static int smc_link_send_delete(struct smc_link *lnk, bool orderly) 182 { 183 if (lnk->state == SMC_LNK_ACTIVE && 184 !smc_llc_send_delete_link(lnk, SMC_LLC_REQ, orderly)) { 185 smc_llc_link_deleting(lnk); 186 return 0; 187 } 188 return -ENOTCONN; 189 } 190 191 static void smc_lgr_free(struct smc_link_group *lgr); 192 193 static void smc_lgr_free_work(struct work_struct *work) 194 { 195 struct smc_link_group *lgr = container_of(to_delayed_work(work), 196 struct smc_link_group, 197 free_work); 198 spinlock_t *lgr_lock; 199 struct smc_link *lnk; 200 bool conns; 201 202 smc_lgr_list_head(lgr, &lgr_lock); 203 spin_lock_bh(lgr_lock); 204 if (lgr->freeing) { 205 spin_unlock_bh(lgr_lock); 206 return; 207 } 208 read_lock_bh(&lgr->conns_lock); 209 conns = RB_EMPTY_ROOT(&lgr->conns_all); 210 read_unlock_bh(&lgr->conns_lock); 211 if (!conns) { /* number of lgr connections is no longer zero */ 212 spin_unlock_bh(lgr_lock); 213 return; 214 } 215 list_del_init(&lgr->list); /* remove from smc_lgr_list */ 216 217 lnk = &lgr->lnk[SMC_SINGLE_LINK]; 218 if (!lgr->is_smcd && !lgr->terminating) { 219 /* try to send del link msg, on error free lgr immediately */ 220 if (lnk->state == SMC_LNK_ACTIVE && 221 !smc_link_send_delete(lnk, true)) { 222 /* reschedule in case we never receive a response */ 223 smc_lgr_schedule_free_work(lgr); 224 spin_unlock_bh(lgr_lock); 225 return; 226 } 227 } 228 lgr->freeing = 1; /* this instance does the freeing, no new schedule */ 229 spin_unlock_bh(lgr_lock); 230 cancel_delayed_work(&lgr->free_work); 231 232 if (!lgr->is_smcd && lnk->state != SMC_LNK_INACTIVE) 233 smc_llc_link_inactive(lnk); 234 if (lgr->is_smcd && !lgr->terminating) 235 smc_ism_signal_shutdown(lgr); 236 smc_lgr_free(lgr); 237 } 238 239 static void smc_lgr_terminate_work(struct work_struct *work) 240 { 241 struct smc_link_group *lgr = container_of(work, struct smc_link_group, 242 terminate_work); 243 244 smc_lgr_terminate(lgr, true); 245 } 246 247 /* create a new SMC link group */ 248 static int smc_lgr_create(struct smc_sock *smc, struct smc_init_info *ini) 249 { 250 struct smc_link_group *lgr; 251 struct list_head *lgr_list; 252 struct smc_link *lnk; 253 spinlock_t *lgr_lock; 254 u8 rndvec[3]; 255 int rc = 0; 256 int i; 257 258 if (ini->is_smcd && ini->vlan_id) { 259 if (smc_ism_get_vlan(ini->ism_dev, ini->vlan_id)) { 260 rc = SMC_CLC_DECL_ISMVLANERR; 261 goto out; 262 } 263 } 264 265 lgr = kzalloc(sizeof(*lgr), GFP_KERNEL); 266 if (!lgr) { 267 rc = SMC_CLC_DECL_MEM; 268 goto ism_put_vlan; 269 } 270 lgr->is_smcd = ini->is_smcd; 271 lgr->sync_err = 0; 272 lgr->terminating = 0; 273 lgr->freefast = 0; 274 lgr->freeing = 0; 275 lgr->vlan_id = ini->vlan_id; 276 rwlock_init(&lgr->sndbufs_lock); 277 rwlock_init(&lgr->rmbs_lock); 278 rwlock_init(&lgr->conns_lock); 279 for (i = 0; i < SMC_RMBE_SIZES; i++) { 280 INIT_LIST_HEAD(&lgr->sndbufs[i]); 281 INIT_LIST_HEAD(&lgr->rmbs[i]); 282 } 283 smc_lgr_list.num += SMC_LGR_NUM_INCR; 284 memcpy(&lgr->id, (u8 *)&smc_lgr_list.num, SMC_LGR_ID_SIZE); 285 INIT_DELAYED_WORK(&lgr->free_work, smc_lgr_free_work); 286 INIT_WORK(&lgr->terminate_work, smc_lgr_terminate_work); 287 lgr->conns_all = RB_ROOT; 288 if (ini->is_smcd) { 289 /* SMC-D specific settings */ 290 get_device(&ini->ism_dev->dev); 291 lgr->peer_gid = ini->ism_gid; 292 lgr->smcd = ini->ism_dev; 293 lgr_list = &ini->ism_dev->lgr_list; 294 lgr_lock = &lgr->smcd->lgr_lock; 295 lgr->peer_shutdown = 0; 296 atomic_inc(&ini->ism_dev->lgr_cnt); 297 } else { 298 /* SMC-R specific settings */ 299 get_device(&ini->ib_dev->ibdev->dev); 300 lgr->role = smc->listen_smc ? SMC_SERV : SMC_CLNT; 301 memcpy(lgr->peer_systemid, ini->ib_lcl->id_for_peer, 302 SMC_SYSTEMID_LEN); 303 304 lnk = &lgr->lnk[SMC_SINGLE_LINK]; 305 /* initialize link */ 306 lnk->state = SMC_LNK_ACTIVATING; 307 lnk->link_id = SMC_SINGLE_LINK; 308 lnk->smcibdev = ini->ib_dev; 309 lnk->ibport = ini->ib_port; 310 lgr_list = &smc_lgr_list.list; 311 lgr_lock = &smc_lgr_list.lock; 312 lnk->path_mtu = 313 ini->ib_dev->pattr[ini->ib_port - 1].active_mtu; 314 if (!ini->ib_dev->initialized) 315 smc_ib_setup_per_ibdev(ini->ib_dev); 316 get_random_bytes(rndvec, sizeof(rndvec)); 317 lnk->psn_initial = rndvec[0] + (rndvec[1] << 8) + 318 (rndvec[2] << 16); 319 rc = smc_ib_determine_gid(lnk->smcibdev, lnk->ibport, 320 ini->vlan_id, lnk->gid, 321 &lnk->sgid_index); 322 if (rc) 323 goto free_lgr; 324 rc = smc_llc_link_init(lnk); 325 if (rc) 326 goto free_lgr; 327 rc = smc_wr_alloc_link_mem(lnk); 328 if (rc) 329 goto clear_llc_lnk; 330 rc = smc_ib_create_protection_domain(lnk); 331 if (rc) 332 goto free_link_mem; 333 rc = smc_ib_create_queue_pair(lnk); 334 if (rc) 335 goto dealloc_pd; 336 rc = smc_wr_create_link(lnk); 337 if (rc) 338 goto destroy_qp; 339 atomic_inc(&lgr_cnt); 340 atomic_inc(&ini->ib_dev->lnk_cnt); 341 } 342 smc->conn.lgr = lgr; 343 spin_lock_bh(lgr_lock); 344 list_add(&lgr->list, lgr_list); 345 spin_unlock_bh(lgr_lock); 346 return 0; 347 348 destroy_qp: 349 smc_ib_destroy_queue_pair(lnk); 350 dealloc_pd: 351 smc_ib_dealloc_protection_domain(lnk); 352 free_link_mem: 353 smc_wr_free_link_mem(lnk); 354 clear_llc_lnk: 355 smc_llc_link_clear(lnk); 356 free_lgr: 357 kfree(lgr); 358 ism_put_vlan: 359 if (ini->is_smcd && ini->vlan_id) 360 smc_ism_put_vlan(ini->ism_dev, ini->vlan_id); 361 out: 362 if (rc < 0) { 363 if (rc == -ENOMEM) 364 rc = SMC_CLC_DECL_MEM; 365 else 366 rc = SMC_CLC_DECL_INTERR; 367 } 368 return rc; 369 } 370 371 static void smc_buf_unuse(struct smc_connection *conn, 372 struct smc_link_group *lgr) 373 { 374 if (conn->sndbuf_desc) 375 conn->sndbuf_desc->used = 0; 376 if (conn->rmb_desc) { 377 if (!conn->rmb_desc->regerr) { 378 if (!lgr->is_smcd && !list_empty(&lgr->list)) { 379 /* unregister rmb with peer */ 380 smc_llc_do_delete_rkey( 381 &lgr->lnk[SMC_SINGLE_LINK], 382 conn->rmb_desc); 383 } 384 conn->rmb_desc->used = 0; 385 } else { 386 /* buf registration failed, reuse not possible */ 387 write_lock_bh(&lgr->rmbs_lock); 388 list_del(&conn->rmb_desc->list); 389 write_unlock_bh(&lgr->rmbs_lock); 390 391 smc_buf_free(lgr, true, conn->rmb_desc); 392 } 393 } 394 } 395 396 /* remove a finished connection from its link group */ 397 void smc_conn_free(struct smc_connection *conn) 398 { 399 struct smc_link_group *lgr = conn->lgr; 400 401 if (!lgr) 402 return; 403 if (lgr->is_smcd) { 404 if (!list_empty(&lgr->list)) 405 smc_ism_unset_conn(conn); 406 tasklet_kill(&conn->rx_tsklet); 407 } else { 408 smc_cdc_tx_dismiss_slots(conn); 409 } 410 if (!list_empty(&lgr->list)) { 411 smc_lgr_unregister_conn(conn); 412 smc_buf_unuse(conn, lgr); /* allow buffer reuse */ 413 } 414 415 if (!lgr->conns_num) 416 smc_lgr_schedule_free_work(lgr); 417 } 418 419 static void smc_link_clear(struct smc_link *lnk) 420 { 421 lnk->peer_qpn = 0; 422 smc_llc_link_clear(lnk); 423 smc_ib_modify_qp_reset(lnk); 424 smc_wr_free_link(lnk); 425 smc_ib_destroy_queue_pair(lnk); 426 smc_ib_dealloc_protection_domain(lnk); 427 smc_wr_free_link_mem(lnk); 428 if (!atomic_dec_return(&lnk->smcibdev->lnk_cnt)) 429 wake_up(&lnk->smcibdev->lnks_deleted); 430 } 431 432 static void smcr_buf_free(struct smc_link_group *lgr, bool is_rmb, 433 struct smc_buf_desc *buf_desc) 434 { 435 struct smc_link *lnk = &lgr->lnk[SMC_SINGLE_LINK]; 436 437 if (is_rmb) { 438 if (buf_desc->mr_rx[SMC_SINGLE_LINK]) 439 smc_ib_put_memory_region( 440 buf_desc->mr_rx[SMC_SINGLE_LINK]); 441 smc_ib_buf_unmap_sg(lnk->smcibdev, buf_desc, 442 DMA_FROM_DEVICE); 443 } else { 444 smc_ib_buf_unmap_sg(lnk->smcibdev, buf_desc, 445 DMA_TO_DEVICE); 446 } 447 sg_free_table(&buf_desc->sgt[SMC_SINGLE_LINK]); 448 if (buf_desc->pages) 449 __free_pages(buf_desc->pages, buf_desc->order); 450 kfree(buf_desc); 451 } 452 453 static void smcd_buf_free(struct smc_link_group *lgr, bool is_dmb, 454 struct smc_buf_desc *buf_desc) 455 { 456 if (is_dmb) { 457 /* restore original buf len */ 458 buf_desc->len += sizeof(struct smcd_cdc_msg); 459 smc_ism_unregister_dmb(lgr->smcd, buf_desc); 460 } else { 461 kfree(buf_desc->cpu_addr); 462 } 463 kfree(buf_desc); 464 } 465 466 static void smc_buf_free(struct smc_link_group *lgr, bool is_rmb, 467 struct smc_buf_desc *buf_desc) 468 { 469 if (lgr->is_smcd) 470 smcd_buf_free(lgr, is_rmb, buf_desc); 471 else 472 smcr_buf_free(lgr, is_rmb, buf_desc); 473 } 474 475 static void __smc_lgr_free_bufs(struct smc_link_group *lgr, bool is_rmb) 476 { 477 struct smc_buf_desc *buf_desc, *bf_desc; 478 struct list_head *buf_list; 479 int i; 480 481 for (i = 0; i < SMC_RMBE_SIZES; i++) { 482 if (is_rmb) 483 buf_list = &lgr->rmbs[i]; 484 else 485 buf_list = &lgr->sndbufs[i]; 486 list_for_each_entry_safe(buf_desc, bf_desc, buf_list, 487 list) { 488 list_del(&buf_desc->list); 489 smc_buf_free(lgr, is_rmb, buf_desc); 490 } 491 } 492 } 493 494 static void smc_lgr_free_bufs(struct smc_link_group *lgr) 495 { 496 /* free send buffers */ 497 __smc_lgr_free_bufs(lgr, false); 498 /* free rmbs */ 499 __smc_lgr_free_bufs(lgr, true); 500 } 501 502 /* remove a link group */ 503 static void smc_lgr_free(struct smc_link_group *lgr) 504 { 505 smc_lgr_free_bufs(lgr); 506 if (lgr->is_smcd) { 507 if (!lgr->terminating) { 508 smc_ism_put_vlan(lgr->smcd, lgr->vlan_id); 509 put_device(&lgr->smcd->dev); 510 } 511 if (!atomic_dec_return(&lgr->smcd->lgr_cnt)) 512 wake_up(&lgr->smcd->lgrs_deleted); 513 } else { 514 smc_link_clear(&lgr->lnk[SMC_SINGLE_LINK]); 515 put_device(&lgr->lnk[SMC_SINGLE_LINK].smcibdev->ibdev->dev); 516 if (!atomic_dec_return(&lgr_cnt)) 517 wake_up(&lgrs_deleted); 518 } 519 kfree(lgr); 520 } 521 522 void smc_lgr_forget(struct smc_link_group *lgr) 523 { 524 struct list_head *lgr_list; 525 spinlock_t *lgr_lock; 526 527 lgr_list = smc_lgr_list_head(lgr, &lgr_lock); 528 spin_lock_bh(lgr_lock); 529 /* do not use this link group for new connections */ 530 if (!list_empty(lgr_list)) 531 list_del_init(lgr_list); 532 spin_unlock_bh(lgr_lock); 533 } 534 535 static void smcd_unregister_all_dmbs(struct smc_link_group *lgr) 536 { 537 int i; 538 539 for (i = 0; i < SMC_RMBE_SIZES; i++) { 540 struct smc_buf_desc *buf_desc; 541 542 list_for_each_entry(buf_desc, &lgr->rmbs[i], list) { 543 buf_desc->len += sizeof(struct smcd_cdc_msg); 544 smc_ism_unregister_dmb(lgr->smcd, buf_desc); 545 } 546 } 547 } 548 549 static void smc_sk_wake_ups(struct smc_sock *smc) 550 { 551 smc->sk.sk_write_space(&smc->sk); 552 smc->sk.sk_data_ready(&smc->sk); 553 smc->sk.sk_state_change(&smc->sk); 554 } 555 556 /* kill a connection */ 557 static void smc_conn_kill(struct smc_connection *conn, bool soft) 558 { 559 struct smc_sock *smc = container_of(conn, struct smc_sock, conn); 560 561 if (conn->lgr->is_smcd && conn->lgr->peer_shutdown) 562 conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1; 563 else 564 smc_close_abort(conn); 565 conn->killed = 1; 566 smc->sk.sk_err = ECONNABORTED; 567 smc_sk_wake_ups(smc); 568 if (conn->lgr->is_smcd) { 569 smc_ism_unset_conn(conn); 570 if (soft) 571 tasklet_kill(&conn->rx_tsklet); 572 else 573 tasklet_unlock_wait(&conn->rx_tsklet); 574 } else { 575 smc_cdc_tx_dismiss_slots(conn); 576 } 577 smc_lgr_unregister_conn(conn); 578 smc_close_active_abort(smc); 579 } 580 581 static void smc_lgr_cleanup(struct smc_link_group *lgr) 582 { 583 if (lgr->is_smcd) { 584 smc_ism_signal_shutdown(lgr); 585 smcd_unregister_all_dmbs(lgr); 586 smc_ism_put_vlan(lgr->smcd, lgr->vlan_id); 587 put_device(&lgr->smcd->dev); 588 } else { 589 struct smc_link *lnk = &lgr->lnk[SMC_SINGLE_LINK]; 590 591 wake_up(&lnk->wr_reg_wait); 592 if (lnk->state != SMC_LNK_INACTIVE) { 593 smc_link_send_delete(lnk, false); 594 smc_llc_link_inactive(lnk); 595 } 596 } 597 } 598 599 /* terminate link group */ 600 static void __smc_lgr_terminate(struct smc_link_group *lgr, bool soft) 601 { 602 struct smc_connection *conn; 603 struct smc_sock *smc; 604 struct rb_node *node; 605 606 if (lgr->terminating) 607 return; /* lgr already terminating */ 608 if (!soft) 609 cancel_delayed_work_sync(&lgr->free_work); 610 lgr->terminating = 1; 611 if (!lgr->is_smcd) 612 smc_llc_link_inactive(&lgr->lnk[SMC_SINGLE_LINK]); 613 614 /* kill remaining link group connections */ 615 read_lock_bh(&lgr->conns_lock); 616 node = rb_first(&lgr->conns_all); 617 while (node) { 618 read_unlock_bh(&lgr->conns_lock); 619 conn = rb_entry(node, struct smc_connection, alert_node); 620 smc = container_of(conn, struct smc_sock, conn); 621 sock_hold(&smc->sk); /* sock_put below */ 622 lock_sock(&smc->sk); 623 smc_conn_kill(conn, soft); 624 release_sock(&smc->sk); 625 sock_put(&smc->sk); /* sock_hold above */ 626 read_lock_bh(&lgr->conns_lock); 627 node = rb_first(&lgr->conns_all); 628 } 629 read_unlock_bh(&lgr->conns_lock); 630 smc_lgr_cleanup(lgr); 631 if (soft) 632 smc_lgr_schedule_free_work_fast(lgr); 633 else 634 smc_lgr_free(lgr); 635 } 636 637 /* unlink and terminate link group 638 * @soft: true if link group shutdown can take its time 639 * false if immediate link group shutdown is required 640 */ 641 void smc_lgr_terminate(struct smc_link_group *lgr, bool soft) 642 { 643 spinlock_t *lgr_lock; 644 645 smc_lgr_list_head(lgr, &lgr_lock); 646 spin_lock_bh(lgr_lock); 647 if (lgr->terminating) { 648 spin_unlock_bh(lgr_lock); 649 return; /* lgr already terminating */ 650 } 651 if (!soft) 652 lgr->freeing = 1; 653 list_del_init(&lgr->list); 654 spin_unlock_bh(lgr_lock); 655 __smc_lgr_terminate(lgr, soft); 656 } 657 658 /* Called when IB port is terminated */ 659 void smc_port_terminate(struct smc_ib_device *smcibdev, u8 ibport) 660 { 661 struct smc_link_group *lgr, *l; 662 LIST_HEAD(lgr_free_list); 663 664 spin_lock_bh(&smc_lgr_list.lock); 665 list_for_each_entry_safe(lgr, l, &smc_lgr_list.list, list) { 666 if (!lgr->is_smcd && 667 lgr->lnk[SMC_SINGLE_LINK].smcibdev == smcibdev && 668 lgr->lnk[SMC_SINGLE_LINK].ibport == ibport) { 669 list_move(&lgr->list, &lgr_free_list); 670 lgr->freeing = 1; 671 } 672 } 673 spin_unlock_bh(&smc_lgr_list.lock); 674 675 list_for_each_entry_safe(lgr, l, &lgr_free_list, list) { 676 list_del_init(&lgr->list); 677 __smc_lgr_terminate(lgr, false); 678 } 679 } 680 681 /* Called when peer lgr shutdown (regularly or abnormally) is received */ 682 void smc_smcd_terminate(struct smcd_dev *dev, u64 peer_gid, unsigned short vlan) 683 { 684 struct smc_link_group *lgr, *l; 685 LIST_HEAD(lgr_free_list); 686 687 /* run common cleanup function and build free list */ 688 spin_lock_bh(&dev->lgr_lock); 689 list_for_each_entry_safe(lgr, l, &dev->lgr_list, list) { 690 if ((!peer_gid || lgr->peer_gid == peer_gid) && 691 (vlan == VLAN_VID_MASK || lgr->vlan_id == vlan)) { 692 if (peer_gid) /* peer triggered termination */ 693 lgr->peer_shutdown = 1; 694 list_move(&lgr->list, &lgr_free_list); 695 } 696 } 697 spin_unlock_bh(&dev->lgr_lock); 698 699 /* cancel the regular free workers and actually free lgrs */ 700 list_for_each_entry_safe(lgr, l, &lgr_free_list, list) { 701 list_del_init(&lgr->list); 702 schedule_work(&lgr->terminate_work); 703 } 704 } 705 706 /* Called when an SMCD device is removed or the smc module is unloaded */ 707 void smc_smcd_terminate_all(struct smcd_dev *smcd) 708 { 709 struct smc_link_group *lgr, *lg; 710 LIST_HEAD(lgr_free_list); 711 712 spin_lock_bh(&smcd->lgr_lock); 713 list_splice_init(&smcd->lgr_list, &lgr_free_list); 714 list_for_each_entry(lgr, &lgr_free_list, list) 715 lgr->freeing = 1; 716 spin_unlock_bh(&smcd->lgr_lock); 717 718 list_for_each_entry_safe(lgr, lg, &lgr_free_list, list) { 719 list_del_init(&lgr->list); 720 __smc_lgr_terminate(lgr, false); 721 } 722 723 if (atomic_read(&smcd->lgr_cnt)) 724 wait_event(smcd->lgrs_deleted, !atomic_read(&smcd->lgr_cnt)); 725 } 726 727 /* Called when an SMCR device is removed or the smc module is unloaded. 728 * If smcibdev is given, all SMCR link groups using this device are terminated. 729 * If smcibdev is NULL, all SMCR link groups are terminated. 730 */ 731 void smc_smcr_terminate_all(struct smc_ib_device *smcibdev) 732 { 733 struct smc_link_group *lgr, *lg; 734 LIST_HEAD(lgr_free_list); 735 736 spin_lock_bh(&smc_lgr_list.lock); 737 if (!smcibdev) { 738 list_splice_init(&smc_lgr_list.list, &lgr_free_list); 739 list_for_each_entry(lgr, &lgr_free_list, list) 740 lgr->freeing = 1; 741 } else { 742 list_for_each_entry_safe(lgr, lg, &smc_lgr_list.list, list) { 743 if (lgr->lnk[SMC_SINGLE_LINK].smcibdev == smcibdev) { 744 list_move(&lgr->list, &lgr_free_list); 745 lgr->freeing = 1; 746 } 747 } 748 } 749 spin_unlock_bh(&smc_lgr_list.lock); 750 751 list_for_each_entry_safe(lgr, lg, &lgr_free_list, list) { 752 list_del_init(&lgr->list); 753 __smc_lgr_terminate(lgr, false); 754 } 755 756 if (smcibdev) { 757 if (atomic_read(&smcibdev->lnk_cnt)) 758 wait_event(smcibdev->lnks_deleted, 759 !atomic_read(&smcibdev->lnk_cnt)); 760 } else { 761 if (atomic_read(&lgr_cnt)) 762 wait_event(lgrs_deleted, !atomic_read(&lgr_cnt)); 763 } 764 } 765 766 /* Determine vlan of internal TCP socket. 767 * @vlan_id: address to store the determined vlan id into 768 */ 769 int smc_vlan_by_tcpsk(struct socket *clcsock, struct smc_init_info *ini) 770 { 771 struct dst_entry *dst = sk_dst_get(clcsock->sk); 772 struct net_device *ndev; 773 int i, nest_lvl, rc = 0; 774 775 ini->vlan_id = 0; 776 if (!dst) { 777 rc = -ENOTCONN; 778 goto out; 779 } 780 if (!dst->dev) { 781 rc = -ENODEV; 782 goto out_rel; 783 } 784 785 ndev = dst->dev; 786 if (is_vlan_dev(ndev)) { 787 ini->vlan_id = vlan_dev_vlan_id(ndev); 788 goto out_rel; 789 } 790 791 rtnl_lock(); 792 nest_lvl = ndev->lower_level; 793 for (i = 0; i < nest_lvl; i++) { 794 struct list_head *lower = &ndev->adj_list.lower; 795 796 if (list_empty(lower)) 797 break; 798 lower = lower->next; 799 ndev = (struct net_device *)netdev_lower_get_next(ndev, &lower); 800 if (is_vlan_dev(ndev)) { 801 ini->vlan_id = vlan_dev_vlan_id(ndev); 802 break; 803 } 804 } 805 rtnl_unlock(); 806 807 out_rel: 808 dst_release(dst); 809 out: 810 return rc; 811 } 812 813 static bool smcr_lgr_match(struct smc_link_group *lgr, 814 struct smc_clc_msg_local *lcl, 815 enum smc_lgr_role role, u32 clcqpn) 816 { 817 return !memcmp(lgr->peer_systemid, lcl->id_for_peer, 818 SMC_SYSTEMID_LEN) && 819 !memcmp(lgr->lnk[SMC_SINGLE_LINK].peer_gid, &lcl->gid, 820 SMC_GID_SIZE) && 821 !memcmp(lgr->lnk[SMC_SINGLE_LINK].peer_mac, lcl->mac, 822 sizeof(lcl->mac)) && 823 lgr->role == role && 824 (lgr->role == SMC_SERV || 825 lgr->lnk[SMC_SINGLE_LINK].peer_qpn == clcqpn); 826 } 827 828 static bool smcd_lgr_match(struct smc_link_group *lgr, 829 struct smcd_dev *smcismdev, u64 peer_gid) 830 { 831 return lgr->peer_gid == peer_gid && lgr->smcd == smcismdev; 832 } 833 834 /* create a new SMC connection (and a new link group if necessary) */ 835 int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini) 836 { 837 struct smc_connection *conn = &smc->conn; 838 struct list_head *lgr_list; 839 struct smc_link_group *lgr; 840 enum smc_lgr_role role; 841 spinlock_t *lgr_lock; 842 int rc = 0; 843 844 lgr_list = ini->is_smcd ? &ini->ism_dev->lgr_list : &smc_lgr_list.list; 845 lgr_lock = ini->is_smcd ? &ini->ism_dev->lgr_lock : &smc_lgr_list.lock; 846 ini->cln_first_contact = SMC_FIRST_CONTACT; 847 role = smc->listen_smc ? SMC_SERV : SMC_CLNT; 848 if (role == SMC_CLNT && ini->srv_first_contact) 849 /* create new link group as well */ 850 goto create; 851 852 /* determine if an existing link group can be reused */ 853 spin_lock_bh(lgr_lock); 854 list_for_each_entry(lgr, lgr_list, list) { 855 write_lock_bh(&lgr->conns_lock); 856 if ((ini->is_smcd ? 857 smcd_lgr_match(lgr, ini->ism_dev, ini->ism_gid) : 858 smcr_lgr_match(lgr, ini->ib_lcl, role, ini->ib_clcqpn)) && 859 !lgr->sync_err && 860 lgr->vlan_id == ini->vlan_id && 861 (role == SMC_CLNT || 862 lgr->conns_num < SMC_RMBS_PER_LGR_MAX)) { 863 /* link group found */ 864 ini->cln_first_contact = SMC_REUSE_CONTACT; 865 conn->lgr = lgr; 866 smc_lgr_register_conn(conn); /* add smc conn to lgr */ 867 if (delayed_work_pending(&lgr->free_work)) 868 cancel_delayed_work(&lgr->free_work); 869 write_unlock_bh(&lgr->conns_lock); 870 break; 871 } 872 write_unlock_bh(&lgr->conns_lock); 873 } 874 spin_unlock_bh(lgr_lock); 875 876 if (role == SMC_CLNT && !ini->srv_first_contact && 877 ini->cln_first_contact == SMC_FIRST_CONTACT) { 878 /* Server reuses a link group, but Client wants to start 879 * a new one 880 * send out_of_sync decline, reason synchr. error 881 */ 882 return SMC_CLC_DECL_SYNCERR; 883 } 884 885 create: 886 if (ini->cln_first_contact == SMC_FIRST_CONTACT) { 887 rc = smc_lgr_create(smc, ini); 888 if (rc) 889 goto out; 890 lgr = conn->lgr; 891 write_lock_bh(&lgr->conns_lock); 892 smc_lgr_register_conn(conn); /* add smc conn to lgr */ 893 write_unlock_bh(&lgr->conns_lock); 894 } 895 conn->local_tx_ctrl.common.type = SMC_CDC_MSG_TYPE; 896 conn->local_tx_ctrl.len = SMC_WR_TX_SIZE; 897 conn->urg_state = SMC_URG_READ; 898 if (ini->is_smcd) { 899 conn->rx_off = sizeof(struct smcd_cdc_msg); 900 smcd_cdc_rx_init(conn); /* init tasklet for this conn */ 901 } 902 #ifndef KERNEL_HAS_ATOMIC64 903 spin_lock_init(&conn->acurs_lock); 904 #endif 905 906 out: 907 return rc; 908 } 909 910 /* convert the RMB size into the compressed notation - minimum 16K. 911 * In contrast to plain ilog2, this rounds towards the next power of 2, 912 * so the socket application gets at least its desired sndbuf / rcvbuf size. 913 */ 914 static u8 smc_compress_bufsize(int size) 915 { 916 u8 compressed; 917 918 if (size <= SMC_BUF_MIN_SIZE) 919 return 0; 920 921 size = (size - 1) >> 14; 922 compressed = ilog2(size) + 1; 923 if (compressed >= SMC_RMBE_SIZES) 924 compressed = SMC_RMBE_SIZES - 1; 925 return compressed; 926 } 927 928 /* convert the RMB size from compressed notation into integer */ 929 int smc_uncompress_bufsize(u8 compressed) 930 { 931 u32 size; 932 933 size = 0x00000001 << (((int)compressed) + 14); 934 return (int)size; 935 } 936 937 /* try to reuse a sndbuf or rmb description slot for a certain 938 * buffer size; if not available, return NULL 939 */ 940 static struct smc_buf_desc *smc_buf_get_slot(int compressed_bufsize, 941 rwlock_t *lock, 942 struct list_head *buf_list) 943 { 944 struct smc_buf_desc *buf_slot; 945 946 read_lock_bh(lock); 947 list_for_each_entry(buf_slot, buf_list, list) { 948 if (cmpxchg(&buf_slot->used, 0, 1) == 0) { 949 read_unlock_bh(lock); 950 return buf_slot; 951 } 952 } 953 read_unlock_bh(lock); 954 return NULL; 955 } 956 957 /* one of the conditions for announcing a receiver's current window size is 958 * that it "results in a minimum increase in the window size of 10% of the 959 * receive buffer space" [RFC7609] 960 */ 961 static inline int smc_rmb_wnd_update_limit(int rmbe_size) 962 { 963 return min_t(int, rmbe_size / 10, SOCK_MIN_SNDBUF / 2); 964 } 965 966 static struct smc_buf_desc *smcr_new_buf_create(struct smc_link_group *lgr, 967 bool is_rmb, int bufsize) 968 { 969 struct smc_buf_desc *buf_desc; 970 struct smc_link *lnk; 971 int rc; 972 973 /* try to alloc a new buffer */ 974 buf_desc = kzalloc(sizeof(*buf_desc), GFP_KERNEL); 975 if (!buf_desc) 976 return ERR_PTR(-ENOMEM); 977 978 buf_desc->order = get_order(bufsize); 979 buf_desc->pages = alloc_pages(GFP_KERNEL | __GFP_NOWARN | 980 __GFP_NOMEMALLOC | __GFP_COMP | 981 __GFP_NORETRY | __GFP_ZERO, 982 buf_desc->order); 983 if (!buf_desc->pages) { 984 kfree(buf_desc); 985 return ERR_PTR(-EAGAIN); 986 } 987 buf_desc->cpu_addr = (void *)page_address(buf_desc->pages); 988 989 /* build the sg table from the pages */ 990 lnk = &lgr->lnk[SMC_SINGLE_LINK]; 991 rc = sg_alloc_table(&buf_desc->sgt[SMC_SINGLE_LINK], 1, 992 GFP_KERNEL); 993 if (rc) { 994 smc_buf_free(lgr, is_rmb, buf_desc); 995 return ERR_PTR(rc); 996 } 997 sg_set_buf(buf_desc->sgt[SMC_SINGLE_LINK].sgl, 998 buf_desc->cpu_addr, bufsize); 999 1000 /* map sg table to DMA address */ 1001 rc = smc_ib_buf_map_sg(lnk->smcibdev, buf_desc, 1002 is_rmb ? DMA_FROM_DEVICE : DMA_TO_DEVICE); 1003 /* SMC protocol depends on mapping to one DMA address only */ 1004 if (rc != 1) { 1005 smc_buf_free(lgr, is_rmb, buf_desc); 1006 return ERR_PTR(-EAGAIN); 1007 } 1008 1009 /* create a new memory region for the RMB */ 1010 if (is_rmb) { 1011 rc = smc_ib_get_memory_region(lnk->roce_pd, 1012 IB_ACCESS_REMOTE_WRITE | 1013 IB_ACCESS_LOCAL_WRITE, 1014 buf_desc); 1015 if (rc) { 1016 smc_buf_free(lgr, is_rmb, buf_desc); 1017 return ERR_PTR(rc); 1018 } 1019 } 1020 1021 buf_desc->len = bufsize; 1022 return buf_desc; 1023 } 1024 1025 #define SMCD_DMBE_SIZES 7 /* 0 -> 16KB, 1 -> 32KB, .. 6 -> 1MB */ 1026 1027 static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr, 1028 bool is_dmb, int bufsize) 1029 { 1030 struct smc_buf_desc *buf_desc; 1031 int rc; 1032 1033 if (smc_compress_bufsize(bufsize) > SMCD_DMBE_SIZES) 1034 return ERR_PTR(-EAGAIN); 1035 1036 /* try to alloc a new DMB */ 1037 buf_desc = kzalloc(sizeof(*buf_desc), GFP_KERNEL); 1038 if (!buf_desc) 1039 return ERR_PTR(-ENOMEM); 1040 if (is_dmb) { 1041 rc = smc_ism_register_dmb(lgr, bufsize, buf_desc); 1042 if (rc) { 1043 kfree(buf_desc); 1044 return ERR_PTR(-EAGAIN); 1045 } 1046 buf_desc->pages = virt_to_page(buf_desc->cpu_addr); 1047 /* CDC header stored in buf. So, pretend it was smaller */ 1048 buf_desc->len = bufsize - sizeof(struct smcd_cdc_msg); 1049 } else { 1050 buf_desc->cpu_addr = kzalloc(bufsize, GFP_KERNEL | 1051 __GFP_NOWARN | __GFP_NORETRY | 1052 __GFP_NOMEMALLOC); 1053 if (!buf_desc->cpu_addr) { 1054 kfree(buf_desc); 1055 return ERR_PTR(-EAGAIN); 1056 } 1057 buf_desc->len = bufsize; 1058 } 1059 return buf_desc; 1060 } 1061 1062 static int __smc_buf_create(struct smc_sock *smc, bool is_smcd, bool is_rmb) 1063 { 1064 struct smc_buf_desc *buf_desc = ERR_PTR(-ENOMEM); 1065 struct smc_connection *conn = &smc->conn; 1066 struct smc_link_group *lgr = conn->lgr; 1067 struct list_head *buf_list; 1068 int bufsize, bufsize_short; 1069 int sk_buf_size; 1070 rwlock_t *lock; 1071 1072 if (is_rmb) 1073 /* use socket recv buffer size (w/o overhead) as start value */ 1074 sk_buf_size = smc->sk.sk_rcvbuf / 2; 1075 else 1076 /* use socket send buffer size (w/o overhead) as start value */ 1077 sk_buf_size = smc->sk.sk_sndbuf / 2; 1078 1079 for (bufsize_short = smc_compress_bufsize(sk_buf_size); 1080 bufsize_short >= 0; bufsize_short--) { 1081 1082 if (is_rmb) { 1083 lock = &lgr->rmbs_lock; 1084 buf_list = &lgr->rmbs[bufsize_short]; 1085 } else { 1086 lock = &lgr->sndbufs_lock; 1087 buf_list = &lgr->sndbufs[bufsize_short]; 1088 } 1089 bufsize = smc_uncompress_bufsize(bufsize_short); 1090 if ((1 << get_order(bufsize)) > SG_MAX_SINGLE_ALLOC) 1091 continue; 1092 1093 /* check for reusable slot in the link group */ 1094 buf_desc = smc_buf_get_slot(bufsize_short, lock, buf_list); 1095 if (buf_desc) { 1096 memset(buf_desc->cpu_addr, 0, bufsize); 1097 break; /* found reusable slot */ 1098 } 1099 1100 if (is_smcd) 1101 buf_desc = smcd_new_buf_create(lgr, is_rmb, bufsize); 1102 else 1103 buf_desc = smcr_new_buf_create(lgr, is_rmb, bufsize); 1104 1105 if (PTR_ERR(buf_desc) == -ENOMEM) 1106 break; 1107 if (IS_ERR(buf_desc)) 1108 continue; 1109 1110 buf_desc->used = 1; 1111 write_lock_bh(lock); 1112 list_add(&buf_desc->list, buf_list); 1113 write_unlock_bh(lock); 1114 break; /* found */ 1115 } 1116 1117 if (IS_ERR(buf_desc)) 1118 return -ENOMEM; 1119 1120 if (is_rmb) { 1121 conn->rmb_desc = buf_desc; 1122 conn->rmbe_size_short = bufsize_short; 1123 smc->sk.sk_rcvbuf = bufsize * 2; 1124 atomic_set(&conn->bytes_to_rcv, 0); 1125 conn->rmbe_update_limit = 1126 smc_rmb_wnd_update_limit(buf_desc->len); 1127 if (is_smcd) 1128 smc_ism_set_conn(conn); /* map RMB/smcd_dev to conn */ 1129 } else { 1130 conn->sndbuf_desc = buf_desc; 1131 smc->sk.sk_sndbuf = bufsize * 2; 1132 atomic_set(&conn->sndbuf_space, bufsize); 1133 } 1134 return 0; 1135 } 1136 1137 void smc_sndbuf_sync_sg_for_cpu(struct smc_connection *conn) 1138 { 1139 struct smc_link_group *lgr = conn->lgr; 1140 1141 if (!conn->lgr || conn->lgr->is_smcd) 1142 return; 1143 smc_ib_sync_sg_for_cpu(lgr->lnk[SMC_SINGLE_LINK].smcibdev, 1144 conn->sndbuf_desc, DMA_TO_DEVICE); 1145 } 1146 1147 void smc_sndbuf_sync_sg_for_device(struct smc_connection *conn) 1148 { 1149 struct smc_link_group *lgr = conn->lgr; 1150 1151 if (!conn->lgr || conn->lgr->is_smcd) 1152 return; 1153 smc_ib_sync_sg_for_device(lgr->lnk[SMC_SINGLE_LINK].smcibdev, 1154 conn->sndbuf_desc, DMA_TO_DEVICE); 1155 } 1156 1157 void smc_rmb_sync_sg_for_cpu(struct smc_connection *conn) 1158 { 1159 struct smc_link_group *lgr = conn->lgr; 1160 1161 if (!conn->lgr || conn->lgr->is_smcd) 1162 return; 1163 smc_ib_sync_sg_for_cpu(lgr->lnk[SMC_SINGLE_LINK].smcibdev, 1164 conn->rmb_desc, DMA_FROM_DEVICE); 1165 } 1166 1167 void smc_rmb_sync_sg_for_device(struct smc_connection *conn) 1168 { 1169 struct smc_link_group *lgr = conn->lgr; 1170 1171 if (!conn->lgr || conn->lgr->is_smcd) 1172 return; 1173 smc_ib_sync_sg_for_device(lgr->lnk[SMC_SINGLE_LINK].smcibdev, 1174 conn->rmb_desc, DMA_FROM_DEVICE); 1175 } 1176 1177 /* create the send and receive buffer for an SMC socket; 1178 * receive buffers are called RMBs; 1179 * (even though the SMC protocol allows more than one RMB-element per RMB, 1180 * the Linux implementation uses just one RMB-element per RMB, i.e. uses an 1181 * extra RMB for every connection in a link group 1182 */ 1183 int smc_buf_create(struct smc_sock *smc, bool is_smcd) 1184 { 1185 int rc; 1186 1187 /* create send buffer */ 1188 rc = __smc_buf_create(smc, is_smcd, false); 1189 if (rc) 1190 return rc; 1191 /* create rmb */ 1192 rc = __smc_buf_create(smc, is_smcd, true); 1193 if (rc) 1194 smc_buf_free(smc->conn.lgr, false, smc->conn.sndbuf_desc); 1195 return rc; 1196 } 1197 1198 static inline int smc_rmb_reserve_rtoken_idx(struct smc_link_group *lgr) 1199 { 1200 int i; 1201 1202 for_each_clear_bit(i, lgr->rtokens_used_mask, SMC_RMBS_PER_LGR_MAX) { 1203 if (!test_and_set_bit(i, lgr->rtokens_used_mask)) 1204 return i; 1205 } 1206 return -ENOSPC; 1207 } 1208 1209 /* add a new rtoken from peer */ 1210 int smc_rtoken_add(struct smc_link_group *lgr, __be64 nw_vaddr, __be32 nw_rkey) 1211 { 1212 u64 dma_addr = be64_to_cpu(nw_vaddr); 1213 u32 rkey = ntohl(nw_rkey); 1214 int i; 1215 1216 for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) { 1217 if ((lgr->rtokens[i][SMC_SINGLE_LINK].rkey == rkey) && 1218 (lgr->rtokens[i][SMC_SINGLE_LINK].dma_addr == dma_addr) && 1219 test_bit(i, lgr->rtokens_used_mask)) { 1220 /* already in list */ 1221 return i; 1222 } 1223 } 1224 i = smc_rmb_reserve_rtoken_idx(lgr); 1225 if (i < 0) 1226 return i; 1227 lgr->rtokens[i][SMC_SINGLE_LINK].rkey = rkey; 1228 lgr->rtokens[i][SMC_SINGLE_LINK].dma_addr = dma_addr; 1229 return i; 1230 } 1231 1232 /* delete an rtoken */ 1233 int smc_rtoken_delete(struct smc_link_group *lgr, __be32 nw_rkey) 1234 { 1235 u32 rkey = ntohl(nw_rkey); 1236 int i; 1237 1238 for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) { 1239 if (lgr->rtokens[i][SMC_SINGLE_LINK].rkey == rkey && 1240 test_bit(i, lgr->rtokens_used_mask)) { 1241 lgr->rtokens[i][SMC_SINGLE_LINK].rkey = 0; 1242 lgr->rtokens[i][SMC_SINGLE_LINK].dma_addr = 0; 1243 1244 clear_bit(i, lgr->rtokens_used_mask); 1245 return 0; 1246 } 1247 } 1248 return -ENOENT; 1249 } 1250 1251 /* save rkey and dma_addr received from peer during clc handshake */ 1252 int smc_rmb_rtoken_handling(struct smc_connection *conn, 1253 struct smc_clc_msg_accept_confirm *clc) 1254 { 1255 conn->rtoken_idx = smc_rtoken_add(conn->lgr, clc->rmb_dma_addr, 1256 clc->rmb_rkey); 1257 if (conn->rtoken_idx < 0) 1258 return conn->rtoken_idx; 1259 return 0; 1260 } 1261 1262 static void smc_core_going_away(void) 1263 { 1264 struct smc_ib_device *smcibdev; 1265 struct smcd_dev *smcd; 1266 1267 spin_lock(&smc_ib_devices.lock); 1268 list_for_each_entry(smcibdev, &smc_ib_devices.list, list) { 1269 int i; 1270 1271 for (i = 0; i < SMC_MAX_PORTS; i++) 1272 set_bit(i, smcibdev->ports_going_away); 1273 } 1274 spin_unlock(&smc_ib_devices.lock); 1275 1276 spin_lock(&smcd_dev_list.lock); 1277 list_for_each_entry(smcd, &smcd_dev_list.list, list) { 1278 smcd->going_away = 1; 1279 } 1280 spin_unlock(&smcd_dev_list.lock); 1281 } 1282 1283 /* Clean up all SMC link groups */ 1284 static void smc_lgrs_shutdown(void) 1285 { 1286 struct smcd_dev *smcd; 1287 1288 smc_core_going_away(); 1289 1290 smc_smcr_terminate_all(NULL); 1291 1292 spin_lock(&smcd_dev_list.lock); 1293 list_for_each_entry(smcd, &smcd_dev_list.list, list) 1294 smc_smcd_terminate_all(smcd); 1295 spin_unlock(&smcd_dev_list.lock); 1296 } 1297 1298 static int smc_core_reboot_event(struct notifier_block *this, 1299 unsigned long event, void *ptr) 1300 { 1301 smc_lgrs_shutdown(); 1302 smc_ib_unregister_client(); 1303 return 0; 1304 } 1305 1306 static struct notifier_block smc_reboot_notifier = { 1307 .notifier_call = smc_core_reboot_event, 1308 }; 1309 1310 int __init smc_core_init(void) 1311 { 1312 return register_reboot_notifier(&smc_reboot_notifier); 1313 } 1314 1315 /* Called (from smc_exit) when module is removed */ 1316 void smc_core_exit(void) 1317 { 1318 unregister_reboot_notifier(&smc_reboot_notifier); 1319 smc_lgrs_shutdown(); 1320 } 1321