1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (C) 2017, Microsoft Corporation. 4 * Copyright (c) 2025, Stefan Metzmacher 5 */ 6 7 #include "internal.h" 8 9 bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs) 10 { 11 /* 12 * Test if FRWR (Fast Registration Work Requests) is supported on the 13 * device This implementation requires FRWR on RDMA read/write return 14 * value: true if it is supported 15 */ 16 17 if (!(attrs->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS)) 18 return false; 19 if (attrs->max_fast_reg_page_list_len == 0) 20 return false; 21 return true; 22 } 23 EXPORT_SYMBOL_GPL(smbdirect_frwr_is_supported); 24 25 static void smbdirect_socket_cleanup_work(struct work_struct *work); 26 27 static int smbdirect_socket_rdma_event_handler(struct rdma_cm_id *id, 28 struct rdma_cm_event *event) 29 { 30 struct smbdirect_socket *sc = id->context; 31 int ret = -ESTALE; 32 33 /* 34 * This should be replaced before any real work 35 * starts! So it should never be called! 36 */ 37 38 if (event->event == RDMA_CM_EVENT_DEVICE_REMOVAL) 39 ret = -ENETDOWN; 40 if (IS_ERR(SMBDIRECT_DEBUG_ERR_PTR(event->status))) 41 ret = event->status; 42 pr_err("%s (first_error=%1pe, expected=%s) => event=%s status=%d => ret=%1pe\n", 43 smbdirect_socket_status_string(sc->status), 44 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error), 45 rdma_event_msg(sc->rdma.expected_event), 46 rdma_event_msg(event->event), 47 event->status, 48 SMBDIRECT_DEBUG_ERR_PTR(ret)); 49 WARN_ONCE(1, "%s should not be called!\n", __func__); 50 sc->rdma.cm_id = NULL; 51 return -ESTALE; 52 } 53 54 int smbdirect_socket_init_new(struct net *net, struct smbdirect_socket *sc) 55 { 56 struct rdma_cm_id *id; 57 int ret; 58 59 smbdirect_socket_init(sc); 60 61 id = rdma_create_id(net, 62 smbdirect_socket_rdma_event_handler, 63 sc, 64 RDMA_PS_TCP, 65 IB_QPT_RC); 66 if (IS_ERR(id)) { 67 pr_err("%s: rdma_create_id() failed %1pe\n", __func__, id); 68 return PTR_ERR(id); 69 } 70 71 ret = rdma_set_afonly(id, 1); 72 if (ret) { 73 rdma_destroy_id(id); 74 pr_err("%s: rdma_set_afonly() failed %1pe\n", 75 __func__, SMBDIRECT_DEBUG_ERR_PTR(ret)); 76 return ret; 77 } 78 79 sc->rdma.cm_id = id; 80 81 INIT_WORK(&sc->disconnect_work, smbdirect_socket_cleanup_work); 82 83 return 0; 84 } 85 86 int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc) 87 { 88 struct smbdirect_socket *sc; 89 int ret; 90 91 ret = -ENOMEM; 92 sc = kzalloc_obj(*sc); 93 if (!sc) 94 goto alloc_failed; 95 96 ret = smbdirect_socket_init_new(net, sc); 97 if (ret) 98 goto init_failed; 99 100 kref_init(&sc->refs.destroy); 101 102 *_sc = sc; 103 return 0; 104 105 init_failed: 106 kfree(sc); 107 alloc_failed: 108 return ret; 109 } 110 EXPORT_SYMBOL_GPL(smbdirect_socket_create_kern); 111 112 int smbdirect_socket_init_accepting(struct rdma_cm_id *id, struct smbdirect_socket *sc) 113 { 114 smbdirect_socket_init(sc); 115 116 sc->rdma.cm_id = id; 117 sc->rdma.cm_id->context = sc; 118 sc->rdma.cm_id->event_handler = smbdirect_socket_rdma_event_handler; 119 120 sc->ib.dev = sc->rdma.cm_id->device; 121 122 INIT_WORK(&sc->disconnect_work, smbdirect_socket_cleanup_work); 123 124 return 0; 125 } 126 127 int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc) 128 { 129 struct smbdirect_socket *sc; 130 int ret; 131 132 ret = -ENOMEM; 133 sc = kzalloc_obj(*sc); 134 if (!sc) 135 goto alloc_failed; 136 137 ret = smbdirect_socket_init_accepting(id, sc); 138 if (ret) 139 goto init_failed; 140 141 kref_init(&sc->refs.destroy); 142 143 *_sc = sc; 144 return 0; 145 146 init_failed: 147 kfree(sc); 148 alloc_failed: 149 return ret; 150 } 151 EXPORT_SYMBOL_GPL(smbdirect_socket_create_accepting); 152 153 int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc, 154 const struct smbdirect_socket_parameters *sp) 155 { 156 /* 157 * This is only allowed before connect or accept 158 */ 159 WARN_ONCE(sc->status != SMBDIRECT_SOCKET_CREATED, 160 "status=%s first_error=%1pe", 161 smbdirect_socket_status_string(sc->status), 162 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error)); 163 if (sc->status != SMBDIRECT_SOCKET_CREATED) 164 return -EINVAL; 165 166 if (sp->flags & ~SMBDIRECT_FLAG_PORT_RANGE_MASK) 167 return -EINVAL; 168 169 if (sp->initiator_depth > U8_MAX) 170 return -EINVAL; 171 if (sp->responder_resources > U8_MAX) 172 return -EINVAL; 173 174 if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB && 175 sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW) 176 return -EINVAL; 177 else if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB) 178 rdma_restrict_node_type(sc->rdma.cm_id, RDMA_NODE_IB_CA); 179 else if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW) 180 rdma_restrict_node_type(sc->rdma.cm_id, RDMA_NODE_RNIC); 181 182 /* 183 * Make a copy of the callers parameters 184 * from here we only work on the copy 185 * 186 * TODO: do we want consistency checking? 187 */ 188 sc->parameters = *sp; 189 190 return 0; 191 } 192 EXPORT_SYMBOL_GPL(smbdirect_socket_set_initial_parameters); 193 194 const struct smbdirect_socket_parameters * 195 smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc) 196 { 197 return &sc->parameters; 198 } 199 EXPORT_SYMBOL_GPL(smbdirect_socket_get_current_parameters); 200 201 int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc, 202 enum ib_poll_context poll_ctx, 203 gfp_t gfp_mask) 204 { 205 /* 206 * This is only allowed before connect or accept 207 */ 208 WARN_ONCE(sc->status != SMBDIRECT_SOCKET_CREATED, 209 "status=%s first_error=%1pe", 210 smbdirect_socket_status_string(sc->status), 211 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error)); 212 if (sc->status != SMBDIRECT_SOCKET_CREATED) 213 return -EINVAL; 214 215 sc->ib.poll_ctx = poll_ctx; 216 217 sc->send_io.mem.gfp_mask = gfp_mask; 218 sc->recv_io.mem.gfp_mask = gfp_mask; 219 sc->rw_io.mem.gfp_mask = gfp_mask; 220 221 return 0; 222 } 223 EXPORT_SYMBOL_GPL(smbdirect_socket_set_kernel_settings); 224 225 void smbdirect_socket_set_logging(struct smbdirect_socket *sc, 226 void *private_ptr, 227 bool (*needed)(struct smbdirect_socket *sc, 228 void *private_ptr, 229 unsigned int lvl, 230 unsigned int cls), 231 void (*vaprintf)(struct smbdirect_socket *sc, 232 const char *func, 233 unsigned int line, 234 void *private_ptr, 235 unsigned int lvl, 236 unsigned int cls, 237 struct va_format *vaf)) 238 { 239 sc->logging.private_ptr = private_ptr; 240 sc->logging.needed = needed; 241 sc->logging.vaprintf = vaprintf; 242 } 243 EXPORT_SYMBOL_GPL(smbdirect_socket_set_logging); 244 245 static void smbdirect_socket_wake_up_all(struct smbdirect_socket *sc) 246 { 247 /* 248 * Wake up all waiters in all wait queues 249 * in order to notice the broken connection. 250 */ 251 wake_up_all(&sc->status_wait); 252 wake_up_all(&sc->listen.wait_queue); 253 wake_up_all(&sc->send_io.bcredits.wait_queue); 254 wake_up_all(&sc->send_io.lcredits.wait_queue); 255 wake_up_all(&sc->send_io.credits.wait_queue); 256 wake_up_all(&sc->send_io.pending.zero_wait_queue); 257 wake_up_all(&sc->recv_io.reassembly.wait_queue); 258 wake_up_all(&sc->rw_io.credits.wait_queue); 259 wake_up_all(&sc->mr_io.ready.wait_queue); 260 } 261 262 void __smbdirect_socket_schedule_cleanup(struct smbdirect_socket *sc, 263 const char *macro_name, 264 unsigned int lvl, 265 const char *func, 266 unsigned int line, 267 int error, 268 enum smbdirect_socket_status *force_status) 269 { 270 struct smbdirect_socket *psc, *tsc; 271 unsigned long flags; 272 bool was_first = false; 273 274 if (!sc->first_error) { 275 ___smbdirect_log_generic(sc, func, line, 276 lvl, 277 SMBDIRECT_LOG_RDMA_EVENT, 278 "%s(%1pe%s%s) called from %s in line=%u status=%s\n", 279 macro_name, 280 SMBDIRECT_DEBUG_ERR_PTR(error), 281 force_status ? ", " : "", 282 force_status ? smbdirect_socket_status_string(*force_status) : "", 283 func, line, 284 smbdirect_socket_status_string(sc->status)); 285 if (error) 286 sc->first_error = error; 287 else 288 sc->first_error = -ECONNABORTED; 289 was_first = true; 290 } 291 292 /* 293 * make sure other work (than disconnect_work) 294 * is not queued again but here we don't block and avoid 295 * disable[_delayed]_work_sync() 296 */ 297 disable_work(&sc->connect.work); 298 disable_work(&sc->recv_io.posted.refill_work); 299 disable_work(&sc->idle.immediate_work); 300 sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE; 301 disable_delayed_work(&sc->idle.timer_work); 302 303 /* 304 * In case we were a listener we need to 305 * disconnect all pending and ready sockets 306 * 307 * First we move ready sockets to pending again. 308 * 309 * Only a socket that was a listener (listen.backlog != -1) owns a 310 * populated listen.ready/pending list. Guarding on that also keeps 311 * lockdep quiet: without it, the listener holds sc->listen.lock while 312 * the loop recurses into each child psc, which takes psc->listen.lock. 313 * Those are always different instances of the same lock class -- a 314 * child never listens, so the nesting is strictly listener -> child 315 * and cannot really deadlock -- but lockdep only sees the class and 316 * reports "possible recursive locking". A child has empty listen 317 * lists and nothing to do here, so skipping it loses nothing, and a 318 * pending child stays on its listener's list for the free path 319 * (smbdirect_socket_destroy) to reap. 320 */ 321 if (sc->listen.backlog != -1) { /* was a listener */ 322 spin_lock_irqsave(&sc->listen.lock, flags); 323 list_splice_init(&sc->listen.ready, &sc->listen.pending); 324 list_for_each_entry_safe(psc, tsc, &sc->listen.pending, accept.list) 325 smbdirect_socket_schedule_cleanup(psc, sc->first_error); 326 spin_unlock_irqrestore(&sc->listen.lock, flags); 327 } 328 329 switch (sc->status) { 330 case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED: 331 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED: 332 case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED: 333 case SMBDIRECT_SOCKET_NEGOTIATE_FAILED: 334 case SMBDIRECT_SOCKET_ERROR: 335 case SMBDIRECT_SOCKET_DISCONNECTING: 336 case SMBDIRECT_SOCKET_DISCONNECTED: 337 case SMBDIRECT_SOCKET_DESTROYED: 338 /* 339 * Keep the current error status 340 */ 341 break; 342 343 case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED: 344 case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING: 345 sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED; 346 break; 347 348 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED: 349 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING: 350 sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED; 351 break; 352 353 case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED: 354 case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING: 355 sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED; 356 break; 357 358 case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED: 359 case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING: 360 sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED; 361 break; 362 363 case SMBDIRECT_SOCKET_CREATED: 364 case SMBDIRECT_SOCKET_LISTENING: 365 sc->status = SMBDIRECT_SOCKET_DISCONNECTED; 366 break; 367 368 case SMBDIRECT_SOCKET_CONNECTED: 369 sc->status = SMBDIRECT_SOCKET_ERROR; 370 break; 371 } 372 373 if (force_status && (was_first || *force_status > sc->status)) 374 sc->status = *force_status; 375 376 /* 377 * Wake up all waiters in all wait queues 378 * in order to notice the broken connection. 379 */ 380 smbdirect_socket_wake_up_all(sc); 381 382 queue_work(sc->workqueues.cleanup, &sc->disconnect_work); 383 } 384 385 static void smbdirect_socket_cleanup_work(struct work_struct *work) 386 { 387 struct smbdirect_socket *sc = 388 container_of(work, struct smbdirect_socket, disconnect_work); 389 struct smbdirect_socket *psc, *tsc; 390 unsigned long flags; 391 392 /* 393 * This should not never be called in an interrupt! 394 */ 395 WARN_ON_ONCE(in_interrupt()); 396 397 if (!sc->first_error) { 398 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_ERR, 399 "%s called with first_error==0\n", 400 smbdirect_socket_status_string(sc->status)); 401 402 sc->first_error = -ECONNABORTED; 403 } 404 405 /* 406 * make sure this and other work is not queued again 407 * but here we don't block and avoid 408 * disable[_delayed]_work_sync() 409 */ 410 disable_work(&sc->disconnect_work); 411 disable_work(&sc->connect.work); 412 disable_work(&sc->recv_io.posted.refill_work); 413 disable_work(&sc->idle.immediate_work); 414 sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE; 415 disable_delayed_work(&sc->idle.timer_work); 416 417 /* 418 * In case we were a listener we need to 419 * disconnect all pending and ready sockets 420 * 421 * First we move ready sockets to pending again. 422 * 423 * Guarded on listen.backlog != -1 for the same reason as in 424 * __smbdirect_socket_schedule_cleanup(): only a listener owns a 425 * populated listen list, and skipping the block for a child avoids 426 * nesting psc->listen.lock under a listener's listen.lock (different 427 * instances of one class -- harmless, but lockdep cannot tell). 428 */ 429 if (sc->listen.backlog != -1) { /* was a listener */ 430 spin_lock_irqsave(&sc->listen.lock, flags); 431 list_splice_init(&sc->listen.ready, &sc->listen.pending); 432 list_for_each_entry_safe(psc, tsc, &sc->listen.pending, accept.list) 433 smbdirect_socket_schedule_cleanup(psc, sc->first_error); 434 spin_unlock_irqrestore(&sc->listen.lock, flags); 435 } 436 437 switch (sc->status) { 438 case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED: 439 case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING: 440 case SMBDIRECT_SOCKET_NEGOTIATE_FAILED: 441 case SMBDIRECT_SOCKET_CONNECTED: 442 case SMBDIRECT_SOCKET_ERROR: 443 sc->status = SMBDIRECT_SOCKET_DISCONNECTING; 444 /* 445 * Make sure we hold the callback lock 446 * im order to coordinate with the 447 * rdma_event handlers, typically 448 * smbdirect_connection_rdma_event_handler(), 449 * and smbdirect_socket_destroy(). 450 * 451 * So that the order of ib_drain_qp() 452 * and rdma_disconnect() is controlled 453 * by the mutex. 454 */ 455 rdma_lock_handler(sc->rdma.cm_id); 456 rdma_disconnect(sc->rdma.cm_id); 457 rdma_unlock_handler(sc->rdma.cm_id); 458 break; 459 460 case SMBDIRECT_SOCKET_CREATED: 461 case SMBDIRECT_SOCKET_LISTENING: 462 case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED: 463 case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING: 464 case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED: 465 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED: 466 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING: 467 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED: 468 case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED: 469 case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING: 470 case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED: 471 /* 472 * rdma_{accept,connect}() never reached 473 * RDMA_CM_EVENT_ESTABLISHED 474 */ 475 sc->status = SMBDIRECT_SOCKET_DISCONNECTED; 476 break; 477 478 case SMBDIRECT_SOCKET_DISCONNECTING: 479 case SMBDIRECT_SOCKET_DISCONNECTED: 480 case SMBDIRECT_SOCKET_DESTROYED: 481 break; 482 } 483 484 /* 485 * Wake up all waiters in all wait queues 486 * in order to notice the broken connection. 487 */ 488 smbdirect_socket_wake_up_all(sc); 489 } 490 491 static void smbdirect_socket_destroy(struct smbdirect_socket *sc) 492 { 493 struct smbdirect_socket *psc, *tsc; 494 size_t psockets; 495 struct smbdirect_recv_io *recv_io; 496 struct smbdirect_recv_io *recv_tmp; 497 LIST_HEAD(all_list); 498 LIST_HEAD(pending_list); 499 unsigned long flags; 500 501 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 502 "status=%s first_error=%1pe", 503 smbdirect_socket_status_string(sc->status), 504 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error)); 505 506 /* 507 * This should not never be called in an interrupt! 508 */ 509 WARN_ON_ONCE(in_interrupt()); 510 511 if (sc->status == SMBDIRECT_SOCKET_DESTROYED) 512 return; 513 514 WARN_ONCE(sc->status != SMBDIRECT_SOCKET_DISCONNECTED, 515 "status=%s first_error=%1pe", 516 smbdirect_socket_status_string(sc->status), 517 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error)); 518 519 /* 520 * The listener should clear this before we reach this 521 */ 522 WARN_ONCE(sc->accept.listener, 523 "status=%s first_error=%1pe", 524 smbdirect_socket_status_string(sc->status), 525 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error)); 526 527 /* 528 * Wake up all waiters in all wait queues 529 * in order to notice the broken connection. 530 * 531 * Most likely this was already called via 532 * smbdirect_socket_cleanup_work(), but call it again... 533 */ 534 smbdirect_socket_wake_up_all(sc); 535 536 disable_work_sync(&sc->disconnect_work); 537 disable_work_sync(&sc->connect.work); 538 disable_work_sync(&sc->recv_io.posted.refill_work); 539 disable_work_sync(&sc->idle.immediate_work); 540 disable_delayed_work_sync(&sc->idle.timer_work); 541 542 if (sc->rdma.cm_id) 543 rdma_lock_handler(sc->rdma.cm_id); 544 545 if (sc->ib.qp) { 546 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 547 "drain qp\n"); 548 ib_drain_qp(sc->ib.qp); 549 } 550 551 /* 552 * In case we were a listener we need to 553 * disconnect all pending and ready sockets 554 * 555 * We move ready sockets to pending again. 556 * 557 * Capture them here -- rdma_lock_handler(sc->rdma.cm_id) is held above, 558 * so a concurrent CM CONNECT_REQUEST cannot add more; sc->listen.lock 559 * below only protects the list splice itself -- but DEFER releasing 560 * them until the listener's cm_id is destroyed: 561 * 562 * - smbdirect_socket_release() -> smbdirect_socket_destroy() takes the 563 * child's own rdma_lock_handler() lock (&id_priv->handler_mutex). 564 * The listener's and the child's cm_id are always different 565 * instances, so the nesting cannot really deadlock, but lockdep only 566 * sees one lock class and reports "possible recursive locking". 567 * 568 * - rdma_destroy_id() of a child before the listener's own 569 * rdma_destroy_id() below lets _cma_cancel_listens() walk the freed 570 * child id_priv (KASAN slab-use-after-free in __mutex_lock()). 571 * 572 * The children are independent sockets whose teardown does not need 573 * the listener's handler lock. 574 */ 575 spin_lock_irqsave(&sc->listen.lock, flags); 576 list_splice_tail_init(&sc->listen.ready, &pending_list); 577 list_splice_tail_init(&sc->listen.pending, &pending_list); 578 spin_unlock_irqrestore(&sc->listen.lock, flags); 579 580 /* It's not possible for upper layer to get to reassembly */ 581 if (sc->listen.backlog == -1) /* was not a listener */ 582 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 583 "drain the reassembly queue\n"); 584 spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags); 585 list_splice_tail_init(&sc->recv_io.reassembly.list, &all_list); 586 spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags); 587 list_for_each_entry_safe(recv_io, recv_tmp, &all_list, list) 588 smbdirect_connection_put_recv_io(recv_io); 589 sc->recv_io.reassembly.data_length = 0; 590 591 if (sc->listen.backlog == -1) /* was not a listener */ 592 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 593 "freeing mr list\n"); 594 smbdirect_connection_destroy_mr_list(sc); 595 596 if (sc->listen.backlog == -1) /* was not a listener */ 597 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 598 "destroying qp\n"); 599 smbdirect_connection_destroy_qp(sc); 600 if (sc->rdma.cm_id) { 601 rdma_unlock_handler(sc->rdma.cm_id); 602 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 603 "destroying cm_id\n"); 604 rdma_destroy_id(sc->rdma.cm_id); 605 sc->rdma.cm_id = NULL; 606 } 607 608 /* 609 * The listener's rdma_lock_handler() lock is dropped and its cm_id is 610 * destroyed, so it is safe to release the child sockets captured 611 * above: each release recurses into smbdirect_socket_destroy() and 612 * takes that child's own handler_mutex without nesting it under the 613 * listener's, and _cma_cancel_listens() can no longer reach them. 614 */ 615 psockets = list_count_nodes(&pending_list); 616 if (sc->listen.backlog != -1) /* was a listener */ 617 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 618 "release %zu pending sockets\n", psockets); 619 list_for_each_entry_safe(psc, tsc, &pending_list, accept.list) { 620 list_del_init(&psc->accept.list); 621 psc->accept.listener = NULL; 622 smbdirect_socket_release(psc); 623 } 624 if (sc->listen.backlog != -1) /* was a listener */ 625 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 626 "released %zu pending sockets\n", psockets); 627 628 if (sc->listen.backlog == -1) /* was not a listener */ 629 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 630 "destroying mem pools\n"); 631 smbdirect_connection_destroy_mem_pools(sc); 632 633 sc->status = SMBDIRECT_SOCKET_DESTROYED; 634 635 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 636 "rdma session destroyed\n"); 637 } 638 639 void smbdirect_socket_destroy_sync(struct smbdirect_socket *sc) 640 { 641 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 642 "status=%s first_error=%1pe", 643 smbdirect_socket_status_string(sc->status), 644 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error)); 645 646 /* 647 * This should not never be called in an interrupt! 648 */ 649 WARN_ON_ONCE(in_interrupt()); 650 651 /* 652 * First we try to disable the work 653 * without disable_work_sync() in a 654 * non blocking way, if it's already 655 * running it will be handles by 656 * disable_work_sync() below. 657 * 658 * Here we just want to make sure queue_work() in 659 * smbdirect_socket_schedule_cleanup_lvl() 660 * is a no-op. 661 */ 662 disable_work(&sc->disconnect_work); 663 664 if (!sc->first_error) 665 /* 666 * SMBDIRECT_LOG_INFO is enough here 667 * as this is the typical case where 668 * we terminate the connection ourself. 669 */ 670 smbdirect_socket_schedule_cleanup_lvl(sc, 671 SMBDIRECT_LOG_INFO, 672 -ESHUTDOWN); 673 674 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 675 "cancelling and disable disconnect_work\n"); 676 disable_work_sync(&sc->disconnect_work); 677 678 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 679 "destroying rdma session\n"); 680 if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING) 681 smbdirect_socket_cleanup_work(&sc->disconnect_work); 682 if (sc->status < SMBDIRECT_SOCKET_DISCONNECTED) { 683 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 684 "wait for transport being disconnected\n"); 685 wait_event(sc->status_wait, sc->status == SMBDIRECT_SOCKET_DISCONNECTED); 686 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 687 "waited for transport being disconnected\n"); 688 } 689 690 /* 691 * Once we reached SMBDIRECT_SOCKET_DISCONNECTED, 692 * we should call smbdirect_socket_destroy() 693 */ 694 smbdirect_socket_destroy(sc); 695 smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO, 696 "status=%s first_error=%1pe", 697 smbdirect_socket_status_string(sc->status), 698 SMBDIRECT_DEBUG_ERR_PTR(sc->first_error)); 699 } 700 701 int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr) 702 { 703 int ret; 704 705 if (sc->status != SMBDIRECT_SOCKET_CREATED) 706 return -EINVAL; 707 708 ret = rdma_bind_addr(sc->rdma.cm_id, addr); 709 if (ret) 710 return ret; 711 712 return 0; 713 } 714 EXPORT_SYMBOL_GPL(smbdirect_socket_bind); 715 716 void smbdirect_socket_shutdown(struct smbdirect_socket *sc) 717 { 718 smbdirect_socket_schedule_cleanup_lvl(sc, SMBDIRECT_LOG_INFO, -ESHUTDOWN); 719 } 720 EXPORT_SYMBOL_GPL(smbdirect_socket_shutdown); 721 722 static void smbdirect_socket_release_disconnect(struct kref *kref) 723 { 724 struct smbdirect_socket *sc = 725 container_of(kref, struct smbdirect_socket, refs.disconnect); 726 727 /* 728 * For now do a sync disconnect/destroy 729 */ 730 smbdirect_socket_destroy_sync(sc); 731 } 732 733 static void smbdirect_socket_release_destroy(struct kref *kref) 734 { 735 struct smbdirect_socket *sc = 736 container_of(kref, struct smbdirect_socket, refs.destroy); 737 738 /* 739 * Do a sync disconnect/destroy... 740 * hopefully a no-op, as it should be already 741 * in DESTROYED state, before we free the memory. 742 */ 743 smbdirect_socket_destroy_sync(sc); 744 kfree(sc); 745 } 746 747 void smbdirect_socket_release(struct smbdirect_socket *sc) 748 { 749 /* 750 * We expect only 1 disconnect reference 751 * and if it is already 0, it's a use after free! 752 */ 753 WARN_ON_ONCE(kref_read(&sc->refs.disconnect) != 1); 754 WARN_ON(!kref_put(&sc->refs.disconnect, smbdirect_socket_release_disconnect)); 755 756 /* 757 * This may not trigger smbdirect_socket_release_destroy(), 758 * if struct smbdirect_socket is embedded in another structure 759 * indicated by REFCOUNT_MAX. 760 */ 761 kref_put(&sc->refs.destroy, smbdirect_socket_release_destroy); 762 } 763 EXPORT_SYMBOL_GPL(smbdirect_socket_release); 764 765 int smbdirect_socket_wait_for_credits(struct smbdirect_socket *sc, 766 enum smbdirect_socket_status expected_status, 767 int unexpected_errno, 768 wait_queue_head_t *waitq, 769 atomic_t *total_credits, 770 int needed) 771 { 772 int ret; 773 774 if (WARN_ON_ONCE(needed < 0)) 775 return -EINVAL; 776 777 do { 778 if (atomic_sub_return(needed, total_credits) >= 0) 779 return 0; 780 781 atomic_add(needed, total_credits); 782 ret = wait_event_interruptible(*waitq, 783 atomic_read(total_credits) >= needed || 784 sc->status != expected_status); 785 786 if (sc->status != expected_status) 787 return unexpected_errno; 788 else if (ret < 0) 789 return ret; 790 } while (true); 791 } 792