FILE
smbdirect.c
File preview with syntax highlighting.
linux-6.19.14/fs/smb/client/smbdirect.c
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (C) 2017, Microsoft Corporation. 4 * 5 * Author(s): Long Li <longli@microsoft.com> 6 */ 7#include <linux/module.h> 8#include <linux/highmem.h> 9#include <linux/folio_queue.h> 10#define __SMBDIRECT_SOCKET_DISCONNECT(__sc) smbd_disconnect_rdma_connection(__sc) 11#include "../common/smbdirect/smbdirect_pdu.h" 12#include "smbdirect.h" 13#include "cifs_debug.h" 14#include "cifsproto.h" 15#include "smb2proto.h" 16 17const struct smbdirect_socket_parameters *smbd_get_parameters(struct smbd_connection *conn) 18{ 19 struct smbdirect_socket *sc = &conn->socket; 20 21 return &sc->parameters; 22} 23 24static struct smbdirect_recv_io *get_receive_buffer( 25 struct smbdirect_socket *sc); 26static void put_receive_buffer( 27 struct smbdirect_socket *sc, 28 struct smbdirect_recv_io *response); 29static int allocate_receive_buffers(struct smbdirect_socket *sc, int num_buf); 30static void destroy_receive_buffers(struct smbdirect_socket *sc); 31 32static void enqueue_reassembly( 33 struct smbdirect_socket *sc, 34 struct smbdirect_recv_io *response, int data_length); 35static struct smbdirect_recv_io *_get_first_reassembly( 36 struct smbdirect_socket *sc); 37 38static int smbd_post_send(struct smbdirect_socket *sc, 39 struct smbdirect_send_batch *batch, 40 struct smbdirect_send_io *request); 41 42static int smbd_post_recv( 43 struct smbdirect_socket *sc, 44 struct smbdirect_recv_io *response); 45 46static int smbd_post_send_empty(struct smbdirect_socket *sc); 47 48static void destroy_mr_list(struct smbdirect_socket *sc); 49static int allocate_mr_list(struct smbdirect_socket *sc); 50 51struct smb_extract_to_rdma { 52 struct ib_sge *sge; 53 unsigned int nr_sge; 54 unsigned int max_sge; 55 struct ib_device *device; 56 u32 local_dma_lkey; 57 enum dma_data_direction direction; 58}; 59static ssize_t smb_extract_iter_to_rdma(struct iov_iter *iter, size_t len, 60 struct smb_extract_to_rdma *rdma); 61 62/* Port numbers for SMBD transport */ 63#define SMB_PORT 445 64#define SMBD_PORT 5445 65 66/* Address lookup and resolve timeout in ms */ 67#define RDMA_RESOLVE_TIMEOUT 5000 68 69/* SMBD negotiation timeout in seconds */ 70#define SMBD_NEGOTIATE_TIMEOUT 120 71 72/* The timeout to wait for a keepalive message from peer in seconds */ 73#define KEEPALIVE_RECV_TIMEOUT 5 74 75/* SMBD minimum receive size and fragmented sized defined in [MS-SMBD] */ 76#define SMBD_MIN_RECEIVE_SIZE 128 77#define SMBD_MIN_FRAGMENTED_SIZE 131072 78 79/* 80 * Default maximum number of RDMA read/write outstanding on this connection 81 * This value is possibly decreased during QP creation on hardware limit 82 */ 83#define SMBD_CM_RESPONDER_RESOURCES 32 84 85/* Maximum number of retries on data transfer operations */ 86#define SMBD_CM_RETRY 6 87/* No need to retry on Receiver Not Ready since SMBD manages credits */ 88#define SMBD_CM_RNR_RETRY 0 89 90/* 91 * User configurable initial values per SMBD transport connection 92 * as defined in [MS-SMBD] 3.1.1.1 93 * Those may change after a SMBD negotiation 94 */ 95/* The local peer's maximum number of credits to grant to the peer */ 96int smbd_receive_credit_max = 255; 97 98/* The remote peer's credit request of local peer */ 99int smbd_send_credit_target = 255; 100 101/* The maximum single message size can be sent to remote peer */ 102int smbd_max_send_size = 1364; 103 104/* 105 * The maximum fragmented upper-layer payload receive size supported 106 * 107 * Assume max_payload_per_credit is 108 * smbd_max_receive_size - 24 = 1340 109 * 110 * The maximum number would be 111 * smbd_receive_credit_max * max_payload_per_credit 112 * 113 * 1340 * 255 = 341700 (0x536C4) 114 * 115 * The minimum value from the spec is 131072 (0x20000) 116 * 117 * For now we use the logic we used in ksmbd before: 118 * (1364 * 255) / 2 = 173910 (0x2A756) 119 */ 120int smbd_max_fragmented_recv_size = (1364 * 255) / 2; 121 122/* The maximum single-message size which can be received */ 123int smbd_max_receive_size = 1364; 124 125/* The timeout to initiate send of a keepalive message on idle */ 126int smbd_keep_alive_interval = 120; 127 128/* 129 * User configurable initial values for RDMA transport 130 * The actual values used may be lower and are limited to hardware capabilities 131 */ 132/* Default maximum number of pages in a single RDMA write/read */ 133int smbd_max_frmr_depth = 2048; 134 135/* If payload is less than this byte, use RDMA send/recv not read/write */ 136int rdma_readwrite_threshold = 4096; 137 138/* Transport logging functions 139 * Logging are defined as classes. They can be OR'ed to define the actual 140 * logging level via module parameter smbd_logging_class 141 * e.g. cifs.smbd_logging_class=0xa0 will log all log_rdma_recv() and 142 * log_rdma_event() 143 */ 144#define LOG_OUTGOING 0x1 145#define LOG_INCOMING 0x2 146#define LOG_READ 0x4 147#define LOG_WRITE 0x8 148#define LOG_RDMA_SEND 0x10 149#define LOG_RDMA_RECV 0x20 150#define LOG_KEEP_ALIVE 0x40 151#define LOG_RDMA_EVENT 0x80 152#define LOG_RDMA_MR 0x100 153static unsigned int smbd_logging_class; 154module_param(smbd_logging_class, uint, 0644); 155MODULE_PARM_DESC(smbd_logging_class, 156 "Logging class for SMBD transport 0x0 to 0x100"); 157 158#define ERR 0x0 159#define INFO 0x1 160static unsigned int smbd_logging_level = ERR; 161module_param(smbd_logging_level, uint, 0644); 162MODULE_PARM_DESC(smbd_logging_level, 163 "Logging level for SMBD transport, 0 (default): error, 1: info"); 164 165#define log_rdma(level, class, fmt, args...) \ 166do { \ 167 if (level <= smbd_logging_level || class & smbd_logging_class) \ 168 cifs_dbg(VFS, "%s:%d " fmt, __func__, __LINE__, ##args);\ 169} while (0) 170 171#define log_outgoing(level, fmt, args...) \ 172 log_rdma(level, LOG_OUTGOING, fmt, ##args) 173#define log_incoming(level, fmt, args...) \ 174 log_rdma(level, LOG_INCOMING, fmt, ##args) 175#define log_read(level, fmt, args...) log_rdma(level, LOG_READ, fmt, ##args) 176#define log_write(level, fmt, args...) log_rdma(level, LOG_WRITE, fmt, ##args) 177#define log_rdma_send(level, fmt, args...) \ 178 log_rdma(level, LOG_RDMA_SEND, fmt, ##args) 179#define log_rdma_recv(level, fmt, args...) \ 180 log_rdma(level, LOG_RDMA_RECV, fmt, ##args) 181#define log_keep_alive(level, fmt, args...) \ 182 log_rdma(level, LOG_KEEP_ALIVE, fmt, ##args) 183#define log_rdma_event(level, fmt, args...) \ 184 log_rdma(level, LOG_RDMA_EVENT, fmt, ##args) 185#define log_rdma_mr(level, fmt, args...) \ 186 log_rdma(level, LOG_RDMA_MR, fmt, ##args) 187 188static void smbd_disconnect_wake_up_all(struct smbdirect_socket *sc) 189{ 190 /* 191 * Wake up all waiters in all wait queues 192 * in order to notice the broken connection. 193 */ 194 wake_up_all(&sc->status_wait); 195 wake_up_all(&sc->send_io.lcredits.wait_queue); 196 wake_up_all(&sc->send_io.credits.wait_queue); 197 wake_up_all(&sc->send_io.pending.dec_wait_queue); 198 wake_up_all(&sc->send_io.pending.zero_wait_queue); 199 wake_up_all(&sc->recv_io.reassembly.wait_queue); 200 wake_up_all(&sc->mr_io.ready.wait_queue); 201 wake_up_all(&sc->mr_io.cleanup.wait_queue); 202} 203 204static void smbd_disconnect_rdma_work(struct work_struct *work) 205{ 206 struct smbdirect_socket *sc = 207 container_of(work, struct smbdirect_socket, disconnect_work); 208 209 if (sc->first_error == 0) 210 sc->first_error = -ECONNABORTED; 211 212 /* 213 * make sure this and other work is not queued again 214 * but here we don't block and avoid 215 * disable[_delayed]_work_sync() 216 */ 217 disable_work(&sc->disconnect_work); 218 disable_work(&sc->recv_io.posted.refill_work); 219 disable_work(&sc->mr_io.recovery_work); 220 disable_work(&sc->idle.immediate_work); 221 disable_delayed_work(&sc->idle.timer_work); 222 223 switch (sc->status) { 224 case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED: 225 case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING: 226 case SMBDIRECT_SOCKET_NEGOTIATE_FAILED: 227 case SMBDIRECT_SOCKET_CONNECTED: 228 case SMBDIRECT_SOCKET_ERROR: 229 sc->status = SMBDIRECT_SOCKET_DISCONNECTING; 230 rdma_disconnect(sc->rdma.cm_id); 231 break; 232 233 case SMBDIRECT_SOCKET_CREATED: 234 case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED: 235 case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING: 236 case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED: 237 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED: 238 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING: 239 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED: 240 case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED: 241 case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING: 242 case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED: 243 /* 244 * rdma_connect() never reached 245 * RDMA_CM_EVENT_ESTABLISHED 246 */ 247 sc->status = SMBDIRECT_SOCKET_DISCONNECTED; 248 break; 249 250 case SMBDIRECT_SOCKET_DISCONNECTING: 251 case SMBDIRECT_SOCKET_DISCONNECTED: 252 case SMBDIRECT_SOCKET_DESTROYED: 253 break; 254 } 255 256 /* 257 * Wake up all waiters in all wait queues 258 * in order to notice the broken connection. 259 */ 260 smbd_disconnect_wake_up_all(sc); 261} 262 263static void smbd_disconnect_rdma_connection(struct smbdirect_socket *sc) 264{ 265 if (sc->first_error == 0) 266 sc->first_error = -ECONNABORTED; 267 268 /* 269 * make sure other work (than disconnect_work) is 270 * not queued again but here we don't block and avoid 271 * disable[_delayed]_work_sync() 272 */ 273 disable_work(&sc->recv_io.posted.refill_work); 274 disable_work(&sc->mr_io.recovery_work); 275 disable_work(&sc->idle.immediate_work); 276 disable_delayed_work(&sc->idle.timer_work); 277 278 switch (sc->status) { 279 case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED: 280 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED: 281 case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED: 282 case SMBDIRECT_SOCKET_NEGOTIATE_FAILED: 283 case SMBDIRECT_SOCKET_ERROR: 284 case SMBDIRECT_SOCKET_DISCONNECTING: 285 case SMBDIRECT_SOCKET_DISCONNECTED: 286 case SMBDIRECT_SOCKET_DESTROYED: 287 /* 288 * Keep the current error status 289 */ 290 break; 291 292 case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED: 293 case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING: 294 sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED; 295 break; 296 297 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED: 298 case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING: 299 sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED; 300 break; 301 302 case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED: 303 case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING: 304 sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED; 305 break; 306 307 case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED: 308 case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING: 309 sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED; 310 break; 311 312 case SMBDIRECT_SOCKET_CREATED: 313 sc->status = SMBDIRECT_SOCKET_DISCONNECTED; 314 break; 315 316 case SMBDIRECT_SOCKET_CONNECTED: 317 sc->status = SMBDIRECT_SOCKET_ERROR; 318 break; 319 } 320 321 /* 322 * Wake up all waiters in all wait queues 323 * in order to notice the broken connection. 324 */ 325 smbd_disconnect_wake_up_all(sc); 326 327 queue_work(sc->workqueue, &sc->disconnect_work); 328} 329 330/* Upcall from RDMA CM */ 331static int smbd_conn_upcall( 332 struct rdma_cm_id *id, struct rdma_cm_event *event) 333{ 334 struct smbdirect_socket *sc = id->context; 335 struct smbdirect_socket_parameters *sp = &sc->parameters; 336 const char *event_name = rdma_event_msg(event->event); 337 u8 peer_initiator_depth; 338 u8 peer_responder_resources; 339 340 log_rdma_event(INFO, "event=%s status=%d\n", 341 event_name, event->status); 342 343 switch (event->event) { 344 case RDMA_CM_EVENT_ADDR_RESOLVED: 345 if (SMBDIRECT_CHECK_STATUS_DISCONNECT(sc, SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING)) 346 break; 347 sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED; 348 wake_up(&sc->status_wait); 349 break; 350 351 case RDMA_CM_EVENT_ROUTE_RESOLVED: 352 if (SMBDIRECT_CHECK_STATUS_DISCONNECT(sc, SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING)) 353 break; 354 sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED; 355 wake_up(&sc->status_wait); 356 break; 357 358 case RDMA_CM_EVENT_ADDR_ERROR: 359 log_rdma_event(ERR, "connecting failed event=%s\n", event_name); 360 sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED; 361 smbd_disconnect_rdma_work(&sc->disconnect_work); 362 break; 363 364 case RDMA_CM_EVENT_ROUTE_ERROR: 365 log_rdma_event(ERR, "connecting failed event=%s\n", event_name); 366 sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED; 367 smbd_disconnect_rdma_work(&sc->disconnect_work); 368 break; 369 370 case RDMA_CM_EVENT_ESTABLISHED: 371 log_rdma_event(INFO, "connected event=%s\n", event_name); 372 373 /* 374 * Here we work around an inconsistency between 375 * iWarp and other devices (at least rxe and irdma using RoCEv2) 376 */ 377 if (rdma_protocol_iwarp(id->device, id->port_num)) { 378 /* 379 * iWarp devices report the peer's values 380 * with the perspective of the peer here. 381 * Tested with siw and irdma (in iwarp mode) 382 * We need to change to our perspective here, 383 * so we need to switch the values. 384 */ 385 peer_initiator_depth = event->param.conn.responder_resources; 386 peer_responder_resources = event->param.conn.initiator_depth; 387 } else { 388 /* 389 * Non iWarp devices report the peer's values 390 * already changed to our perspective here. 391 * Tested with rxe and irdma (in roce mode). 392 */ 393 peer_initiator_depth = event->param.conn.initiator_depth; 394 peer_responder_resources = event->param.conn.responder_resources; 395 } 396 if (rdma_protocol_iwarp(id->device, id->port_num) && 397 event->param.conn.private_data_len == 8) { 398 /* 399 * Legacy clients with only iWarp MPA v1 support 400 * need a private blob in order to negotiate 401 * the IRD/ORD values. 402 */ 403 const __be32 *ird_ord_hdr = event->param.conn.private_data; 404 u32 ird32 = be32_to_cpu(ird_ord_hdr[0]); 405 u32 ord32 = be32_to_cpu(ird_ord_hdr[1]); 406 407 /* 408 * cifs.ko sends the legacy IRD/ORD negotiation 409 * event if iWarp MPA v2 was used. 410 * 411 * Here we check that the values match and only 412 * mark the client as legacy if they don't match. 413 */ 414 if ((u32)event->param.conn.initiator_depth != ird32 || 415 (u32)event->param.conn.responder_resources != ord32) { 416 /* 417 * There are broken clients (old cifs.ko) 418 * using little endian and also 419 * struct rdma_conn_param only uses u8 420 * for initiator_depth and responder_resources, 421 * so we truncate the value to U8_MAX. 422 * 423 * smb_direct_accept_client() will then 424 * do the real negotiation in order to 425 * select the minimum between client and 426 * server. 427 */ 428 ird32 = min_t(u32, ird32, U8_MAX); 429 ord32 = min_t(u32, ord32, U8_MAX); 430 431 sc->rdma.legacy_iwarp = true; 432 peer_initiator_depth = (u8)ird32; 433 peer_responder_resources = (u8)ord32; 434 } 435 } 436 437 /* 438 * negotiate the value by using the minimum 439 * between client and server if the client provided 440 * non 0 values. 441 */ 442 if (peer_initiator_depth != 0) 443 sp->initiator_depth = 444 min_t(u8, sp->initiator_depth, 445 peer_initiator_depth); 446 if (peer_responder_resources != 0) 447 sp->responder_resources = 448 min_t(u8, sp->responder_resources, 449 peer_responder_resources); 450 451 if (SMBDIRECT_CHECK_STATUS_DISCONNECT(sc, SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING)) 452 break; 453 sc->status = SMBDIRECT_SOCKET_NEGOTIATE_NEEDED; 454 wake_up(&sc->status_wait); 455 break; 456 457 case RDMA_CM_EVENT_CONNECT_ERROR: 458 case RDMA_CM_EVENT_UNREACHABLE: 459 case RDMA_CM_EVENT_REJECTED: 460 log_rdma_event(ERR, "connecting failed event=%s\n", event_name); 461 sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED; 462 smbd_disconnect_rdma_work(&sc->disconnect_work); 463 break; 464 465 case RDMA_CM_EVENT_DEVICE_REMOVAL: 466 case RDMA_CM_EVENT_DISCONNECTED: 467 /* This happens when we fail the negotiation */ 468 if (sc->status == SMBDIRECT_SOCKET_NEGOTIATE_FAILED) { 469 log_rdma_event(ERR, "event=%s during negotiation\n", event_name); 470 } 471 472 sc->status = SMBDIRECT_SOCKET_DISCONNECTED; 473 smbd_disconnect_rdma_work(&sc->disconnect_work); 474 break; 475 476 default: 477 log_rdma_event(ERR, "unexpected event=%s status=%d\n", 478 event_name, event->status); 479 break; 480 } 481 482 return 0; 483} 484 485/* Upcall from RDMA QP */ 486static void 487smbd_qp_async_error_upcall(struct ib_event *event, void *context) 488{ 489 struct smbdirect_socket *sc = context; 490 491 log_rdma_event(ERR, "%s on device %s socket %p\n", 492 ib_event_msg(event->event), event->device->name, sc); 493 494 switch (event->event) { 495 case IB_EVENT_CQ_ERR: 496 case IB_EVENT_QP_FATAL: 497 smbd_disconnect_rdma_connection(sc); 498 break; 499 500 default: 501 break; 502 } 503} 504 505static inline void *smbdirect_send_io_payload(struct smbdirect_send_io *request) 506{ 507 return (void *)request->packet; 508} 509 510static inline void *smbdirect_recv_io_payload(struct smbdirect_recv_io *response) 511{ 512 return (void *)response->packet; 513} 514 515static struct smbdirect_send_io *smbd_alloc_send_io(struct smbdirect_socket *sc) 516{ 517 struct smbdirect_send_io *msg; 518 519 msg = mempool_alloc(sc->send_io.mem.pool, GFP_KERNEL); 520 if (!msg) 521 return ERR_PTR(-ENOMEM); 522 msg->socket = sc; 523 INIT_LIST_HEAD(&msg->sibling_list); 524 msg->num_sge = 0; 525 526 return msg; 527} 528 529static void smbd_free_send_io(struct smbdirect_send_io *msg) 530{ 531 struct smbdirect_socket *sc = msg->socket; 532 size_t i; 533 534 /* 535 * The list needs to be empty! 536 * The caller should take care of it. 537 */ 538 WARN_ON_ONCE(!list_empty(&msg->sibling_list)); 539 540 /* 541 * Note we call ib_dma_unmap_page(), even if some sges are mapped using 542 * ib_dma_map_single(). 543 * 544 * The difference between _single() and _page() only matters for the 545 * ib_dma_map_*() case. 546 * 547 * For the ib_dma_unmap_*() case it does not matter as both take the 548 * dma_addr_t and dma_unmap_single_attrs() is just an alias to 549 * dma_unmap_page_attrs(). 550 */ 551 for (i = 0; i < msg->num_sge; i++) 552 ib_dma_unmap_page(sc->ib.dev, 553 msg->sge[i].addr, 554 msg->sge[i].length, 555 DMA_TO_DEVICE); 556 557 mempool_free(msg, sc->send_io.mem.pool); 558} 559 560/* Called when a RDMA send is done */ 561static void send_done(struct ib_cq *cq, struct ib_wc *wc) 562{ 563 struct smbdirect_send_io *request = 564 container_of(wc->wr_cqe, struct smbdirect_send_io, cqe); 565 struct smbdirect_socket *sc = request->socket; 566 struct smbdirect_send_io *sibling, *next; 567 int lcredits = 0; 568 569 log_rdma_send(INFO, "smbdirect_send_io 0x%p completed wc->status=%s\n", 570 request, ib_wc_status_msg(wc->status)); 571 572 if (unlikely(!(request->wr.send_flags & IB_SEND_SIGNALED))) { 573 /* 574 * This happens when smbdirect_send_io is a sibling 575 * before the final message, it is signaled on 576 * error anyway, so we need to skip 577 * smbdirect_connection_free_send_io here, 578 * otherwise is will destroy the memory 579 * of the siblings too, which will cause 580 * use after free problems for the others 581 * triggered from ib_drain_qp(). 582 */ 583 if (wc->status != IB_WC_SUCCESS) 584 goto skip_free; 585 586 /* 587 * This should not happen! 588 * But we better just close the 589 * connection... 590 */ 591 log_rdma_send(ERR, 592 "unexpected send completion wc->status=%s (%d) wc->opcode=%d\n", 593 ib_wc_status_msg(wc->status), wc->status, wc->opcode); 594 smbd_disconnect_rdma_connection(sc); 595 return; 596 } 597 598 /* 599 * Free possible siblings and then the main send_io 600 */ 601 list_for_each_entry_safe(sibling, next, &request->sibling_list, sibling_list) { 602 list_del_init(&sibling->sibling_list); 603 smbd_free_send_io(sibling); 604 lcredits += 1; 605 } 606 /* Note this frees wc->wr_cqe, but not wc */ 607 smbd_free_send_io(request); 608 lcredits += 1; 609 610 if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_SEND) { 611skip_free: 612 if (wc->status != IB_WC_WR_FLUSH_ERR) 613 log_rdma_send(ERR, "wc->status=%s wc->opcode=%d\n", 614 ib_wc_status_msg(wc->status), wc->opcode); 615 smbd_disconnect_rdma_connection(sc); 616 return; 617 } 618 619 atomic_add(lcredits, &sc->send_io.lcredits.count); 620 wake_up(&sc->send_io.lcredits.wait_queue); 621 622 if (atomic_dec_and_test(&sc->send_io.pending.count)) 623 wake_up(&sc->send_io.pending.zero_wait_queue); 624 625 wake_up(&sc->send_io.pending.dec_wait_queue); 626} 627 628static void dump_smbdirect_negotiate_resp(struct smbdirect_negotiate_resp *resp) 629{ 630 log_rdma_event(INFO, "resp message min_version %u max_version %u negotiated_version %u credits_requested %u credits_granted %u status %u max_readwrite_size %u preferred_send_size %u max_receive_size %u max_fragmented_size %u\n", 631 resp->min_version, resp->max_version, 632 resp->negotiated_version, resp->credits_requested, 633 resp->credits_granted, resp->status, 634 resp->max_readwrite_size, resp->preferred_send_size, 635 resp->max_receive_size, resp->max_fragmented_size); 636} 637 638/* 639 * Process a negotiation response message, according to [MS-SMBD]3.1.5.7 640 * response, packet_length: the negotiation response message 641 * return value: true if negotiation is a success, false if failed 642 */ 643static bool process_negotiation_response( 644 struct smbdirect_recv_io *response, int packet_length) 645{ 646 struct smbdirect_socket *sc = response->socket; 647 struct smbdirect_socket_parameters *sp = &sc->parameters; 648 struct smbdirect_negotiate_resp *packet = smbdirect_recv_io_payload(response); 649 650 if (packet_length < sizeof(struct smbdirect_negotiate_resp)) { 651 log_rdma_event(ERR, 652 "error: packet_length=%d\n", packet_length); 653 return false; 654 } 655 656 if (le16_to_cpu(packet->negotiated_version) != SMBDIRECT_V1) { 657 log_rdma_event(ERR, "error: negotiated_version=%x\n", 658 le16_to_cpu(packet->negotiated_version)); 659 return false; 660 } 661 662 if (packet->credits_requested == 0) { 663 log_rdma_event(ERR, "error: credits_requested==0\n"); 664 return false; 665 } 666 sc->recv_io.credits.target = le16_to_cpu(packet->credits_requested); 667 sc->recv_io.credits.target = min_t(u16, sc->recv_io.credits.target, sp->recv_credit_max); 668 669 if (packet->credits_granted == 0) { 670 log_rdma_event(ERR, "error: credits_granted==0\n"); 671 return false; 672 } 673 atomic_set(&sc->send_io.lcredits.count, sp->send_credit_target); 674 atomic_set(&sc->send_io.credits.count, le16_to_cpu(packet->credits_granted)); 675 676 if (le32_to_cpu(packet->preferred_send_size) > sp->max_recv_size) { 677 log_rdma_event(ERR, "error: preferred_send_size=%d\n", 678 le32_to_cpu(packet->preferred_send_size)); 679 return false; 680 } 681 sp->max_recv_size = le32_to_cpu(packet->preferred_send_size); 682 683 if (le32_to_cpu(packet->max_receive_size) < SMBD_MIN_RECEIVE_SIZE) { 684 log_rdma_event(ERR, "error: max_receive_size=%d\n", 685 le32_to_cpu(packet->max_receive_size)); 686 return false; 687 } 688 sp->max_send_size = min_t(u32, sp->max_send_size, 689 le32_to_cpu(packet->max_receive_size)); 690 691 if (le32_to_cpu(packet->max_fragmented_size) < 692 SMBD_MIN_FRAGMENTED_SIZE) { 693 log_rdma_event(ERR, "error: max_fragmented_size=%d\n", 694 le32_to_cpu(packet->max_fragmented_size)); 695 return false; 696 } 697 sp->max_fragmented_send_size = 698 le32_to_cpu(packet->max_fragmented_size); 699 700 701 sp->max_read_write_size = min_t(u32, 702 le32_to_cpu(packet->max_readwrite_size), 703 sp->max_frmr_depth * PAGE_SIZE); 704 sp->max_frmr_depth = sp->max_read_write_size / PAGE_SIZE; 705 706 atomic_set(&sc->send_io.bcredits.count, 1); 707 sc->recv_io.expected = SMBDIRECT_EXPECT_DATA_TRANSFER; 708 return true; 709} 710 711static void smbd_post_send_credits(struct work_struct *work) 712{ 713 int rc; 714 struct smbdirect_recv_io *response; 715 struct smbdirect_socket *sc = 716 container_of(work, struct smbdirect_socket, recv_io.posted.refill_work); 717 int posted = 0; 718 719 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { 720 return; 721 } 722 723 if (sc->recv_io.credits.target > 724 atomic_read(&sc->recv_io.credits.count)) { 725 while (true) { 726 response = get_receive_buffer(sc); 727 if (!response) 728 break; 729 730 response->first_segment = false; 731 rc = smbd_post_recv(sc, response); 732 if (rc) { 733 log_rdma_recv(ERR, 734 "post_recv failed rc=%d\n", rc); 735 put_receive_buffer(sc, response); 736 break; 737 } 738 739 atomic_inc(&sc->recv_io.posted.count); 740 posted += 1; 741 } 742 } 743 744 atomic_add(posted, &sc->recv_io.credits.available); 745 746 /* 747 * If the last send credit is waiting for credits 748 * it can grant we need to wake it up 749 */ 750 if (posted && 751 atomic_read(&sc->send_io.bcredits.count) == 0 && 752 atomic_read(&sc->send_io.credits.count) == 0) 753 wake_up(&sc->send_io.credits.wait_queue); 754 755 /* Promptly send an immediate packet as defined in [MS-SMBD] 3.1.1.1 */ 756 if (atomic_read(&sc->recv_io.credits.count) < 757 sc->recv_io.credits.target - 1) { 758 log_keep_alive(INFO, "schedule send of an empty message\n"); 759 queue_work(sc->workqueue, &sc->idle.immediate_work); 760 } 761} 762 763/* Called from softirq, when recv is done */ 764static void recv_done(struct ib_cq *cq, struct ib_wc *wc) 765{ 766 struct smbdirect_data_transfer *data_transfer; 767 struct smbdirect_recv_io *response = 768 container_of(wc->wr_cqe, struct smbdirect_recv_io, cqe); 769 struct smbdirect_socket *sc = response->socket; 770 struct smbdirect_socket_parameters *sp = &sc->parameters; 771 int current_recv_credits; 772 u16 old_recv_credit_target; 773 u32 data_offset = 0; 774 u32 data_length = 0; 775 u32 remaining_data_length = 0; 776 bool negotiate_done = false; 777 778 log_rdma_recv(INFO, 779 "response=0x%p type=%d wc status=%s wc opcode %d byte_len=%d pkey_index=%u\n", 780 response, sc->recv_io.expected, 781 ib_wc_status_msg(wc->status), wc->opcode, 782 wc->byte_len, wc->pkey_index); 783 784 if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_RECV) { 785 if (wc->status != IB_WC_WR_FLUSH_ERR) 786 log_rdma_recv(ERR, "wc->status=%s opcode=%d\n", 787 ib_wc_status_msg(wc->status), wc->opcode); 788 goto error; 789 } 790 791 ib_dma_sync_single_for_cpu( 792 wc->qp->device, 793 response->sge.addr, 794 response->sge.length, 795 DMA_FROM_DEVICE); 796 797 /* 798 * Reset timer to the keepalive interval in 799 * order to trigger our next keepalive message. 800 */ 801 sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE; 802 mod_delayed_work(sc->workqueue, &sc->idle.timer_work, 803 msecs_to_jiffies(sp->keepalive_interval_msec)); 804 805 switch (sc->recv_io.expected) { 806 /* SMBD negotiation response */ 807 case SMBDIRECT_EXPECT_NEGOTIATE_REP: 808 dump_smbdirect_negotiate_resp(smbdirect_recv_io_payload(response)); 809 sc->recv_io.reassembly.full_packet_received = true; 810 negotiate_done = 811 process_negotiation_response(response, wc->byte_len); 812 put_receive_buffer(sc, response); 813 if (SMBDIRECT_CHECK_STATUS_WARN(sc, SMBDIRECT_SOCKET_NEGOTIATE_RUNNING)) 814 negotiate_done = false; 815 if (!negotiate_done) { 816 sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED; 817 smbd_disconnect_rdma_connection(sc); 818 } else { 819 sc->status = SMBDIRECT_SOCKET_CONNECTED; 820 wake_up(&sc->status_wait); 821 } 822 823 return; 824 825 /* SMBD data transfer packet */ 826 case SMBDIRECT_EXPECT_DATA_TRANSFER: 827 data_transfer = smbdirect_recv_io_payload(response); 828 829 if (wc->byte_len < 830 offsetof(struct smbdirect_data_transfer, padding)) 831 goto error; 832 833 remaining_data_length = le32_to_cpu(data_transfer->remaining_data_length); 834 data_offset = le32_to_cpu(data_transfer->data_offset); 835 data_length = le32_to_cpu(data_transfer->data_length); 836 if (wc->byte_len < data_offset || 837 (u64)wc->byte_len < (u64)data_offset + data_length) 838 goto error; 839 840 if (remaining_data_length > sp->max_fragmented_recv_size || 841 data_length > sp->max_fragmented_recv_size || 842 (u64)remaining_data_length + (u64)data_length > (u64)sp->max_fragmented_recv_size) 843 goto error; 844 845 if (data_length) { 846 if (sc->recv_io.reassembly.full_packet_received) 847 response->first_segment = true; 848 849 if (le32_to_cpu(data_transfer->remaining_data_length)) 850 sc->recv_io.reassembly.full_packet_received = false; 851 else 852 sc->recv_io.reassembly.full_packet_received = true; 853 } 854 855 atomic_dec(&sc->recv_io.posted.count); 856 current_recv_credits = atomic_dec_return(&sc->recv_io.credits.count); 857 858 old_recv_credit_target = sc->recv_io.credits.target; 859 sc->recv_io.credits.target = 860 le16_to_cpu(data_transfer->credits_requested); 861 sc->recv_io.credits.target = 862 min_t(u16, sc->recv_io.credits.target, sp->recv_credit_max); 863 sc->recv_io.credits.target = 864 max_t(u16, sc->recv_io.credits.target, 1); 865 if (le16_to_cpu(data_transfer->credits_granted)) { 866 atomic_add(le16_to_cpu(data_transfer->credits_granted), 867 &sc->send_io.credits.count); 868 /* 869 * We have new send credits granted from remote peer 870 * If any sender is waiting for credits, unblock it 871 */ 872 wake_up(&sc->send_io.credits.wait_queue); 873 } 874 875 log_incoming(INFO, "data flags %d data_offset %d data_length %d remaining_data_length %d\n", 876 le16_to_cpu(data_transfer->flags), 877 le32_to_cpu(data_transfer->data_offset), 878 le32_to_cpu(data_transfer->data_length), 879 le32_to_cpu(data_transfer->remaining_data_length)); 880 881 /* Send an immediate response right away if requested */ 882 if (le16_to_cpu(data_transfer->flags) & 883 SMBDIRECT_FLAG_RESPONSE_REQUESTED) { 884 log_keep_alive(INFO, "schedule send of immediate response\n"); 885 queue_work(sc->workqueue, &sc->idle.immediate_work); 886 } 887 888 /* 889 * If this is a packet with data playload place the data in 890 * reassembly queue and wake up the reading thread 891 */ 892 if (data_length) { 893 if (current_recv_credits <= (sc->recv_io.credits.target / 4) || 894 sc->recv_io.credits.target > old_recv_credit_target) 895 queue_work(sc->workqueue, &sc->recv_io.posted.refill_work); 896 897 enqueue_reassembly(sc, response, data_length); 898 wake_up(&sc->recv_io.reassembly.wait_queue); 899 } else 900 put_receive_buffer(sc, response); 901 902 return; 903 904 case SMBDIRECT_EXPECT_NEGOTIATE_REQ: 905 /* Only server... */ 906 break; 907 } 908 909 /* 910 * This is an internal error! 911 */ 912 log_rdma_recv(ERR, "unexpected response type=%d\n", sc->recv_io.expected); 913 WARN_ON_ONCE(sc->recv_io.expected != SMBDIRECT_EXPECT_DATA_TRANSFER); 914error: 915 put_receive_buffer(sc, response); 916 smbd_disconnect_rdma_connection(sc); 917} 918 919static struct rdma_cm_id *smbd_create_id( 920 struct smbdirect_socket *sc, 921 struct sockaddr *dstaddr, int port) 922{ 923 struct smbdirect_socket_parameters *sp = &sc->parameters; 924 struct rdma_cm_id *id; 925 int rc; 926 __be16 *sport; 927 928 id = rdma_create_id(&init_net, smbd_conn_upcall, sc, 929 RDMA_PS_TCP, IB_QPT_RC); 930 if (IS_ERR(id)) { 931 rc = PTR_ERR(id); 932 log_rdma_event(ERR, "rdma_create_id() failed %i\n", rc); 933 return id; 934 } 935 936 if (dstaddr->sa_family == AF_INET6) 937 sport = &((struct sockaddr_in6 *)dstaddr)->sin6_port; 938 else 939 sport = &((struct sockaddr_in *)dstaddr)->sin_port; 940 941 *sport = htons(port); 942 943 WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED); 944 sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING; 945 rc = rdma_resolve_addr(id, NULL, (struct sockaddr *)dstaddr, 946 sp->resolve_addr_timeout_msec); 947 if (rc) { 948 log_rdma_event(ERR, "rdma_resolve_addr() failed %i\n", rc); 949 goto out; 950 } 951 rc = wait_event_interruptible_timeout( 952 sc->status_wait, 953 sc->status != SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING, 954 msecs_to_jiffies(sp->resolve_addr_timeout_msec)); 955 /* e.g. if interrupted returns -ERESTARTSYS */ 956 if (rc < 0) { 957 log_rdma_event(ERR, "rdma_resolve_addr timeout rc: %i\n", rc); 958 goto out; 959 } 960 if (sc->status == SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING) { 961 rc = -ETIMEDOUT; 962 log_rdma_event(ERR, "rdma_resolve_addr() completed %i\n", rc); 963 goto out; 964 } 965 if (sc->status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED) { 966 rc = -EHOSTUNREACH; 967 log_rdma_event(ERR, "rdma_resolve_addr() completed %i\n", rc); 968 goto out; 969 } 970 971 WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED); 972 sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING; 973 rc = rdma_resolve_route(id, sp->resolve_route_timeout_msec); 974 if (rc) { 975 log_rdma_event(ERR, "rdma_resolve_route() failed %i\n", rc); 976 goto out; 977 } 978 rc = wait_event_interruptible_timeout( 979 sc->status_wait, 980 sc->status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING, 981 msecs_to_jiffies(sp->resolve_route_timeout_msec)); 982 /* e.g. if interrupted returns -ERESTARTSYS */ 983 if (rc < 0) { 984 log_rdma_event(ERR, "rdma_resolve_addr timeout rc: %i\n", rc); 985 goto out; 986 } 987 if (sc->status == SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING) { 988 rc = -ETIMEDOUT; 989 log_rdma_event(ERR, "rdma_resolve_route() completed %i\n", rc); 990 goto out; 991 } 992 if (sc->status != SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED) { 993 rc = -ENETUNREACH; 994 log_rdma_event(ERR, "rdma_resolve_route() completed %i\n", rc); 995 goto out; 996 } 997 998 return id; 999 1000out: 1001 rdma_destroy_id(id); 1002 return ERR_PTR(rc); 1003} 1004 1005/* 1006 * Test if FRWR (Fast Registration Work Requests) is supported on the device 1007 * This implementation requires FRWR on RDMA read/write 1008 * return value: true if it is supported 1009 */ 1010static bool frwr_is_supported(struct ib_device_attr *attrs) 1011{ 1012 if (!(attrs->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS)) 1013 return false; 1014 if (attrs->max_fast_reg_page_list_len == 0) 1015 return false; 1016 return true; 1017} 1018 1019static int smbd_ia_open( 1020 struct smbdirect_socket *sc, 1021 struct sockaddr *dstaddr, int port) 1022{ 1023 struct smbdirect_socket_parameters *sp = &sc->parameters; 1024 int rc; 1025 1026 WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_CREATED); 1027 sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED; 1028 1029 sc->rdma.cm_id = smbd_create_id(sc, dstaddr, port); 1030 if (IS_ERR(sc->rdma.cm_id)) { 1031 rc = PTR_ERR(sc->rdma.cm_id); 1032 goto out1; 1033 } 1034 sc->ib.dev = sc->rdma.cm_id->device; 1035 1036 if (!frwr_is_supported(&sc->ib.dev->attrs)) { 1037 log_rdma_event(ERR, "Fast Registration Work Requests (FRWR) is not supported\n"); 1038 log_rdma_event(ERR, "Device capability flags = %llx max_fast_reg_page_list_len = %u\n", 1039 sc->ib.dev->attrs.device_cap_flags, 1040 sc->ib.dev->attrs.max_fast_reg_page_list_len); 1041 rc = -EPROTONOSUPPORT; 1042 goto out2; 1043 } 1044 sp->max_frmr_depth = min_t(u32, 1045 sp->max_frmr_depth, 1046 sc->ib.dev->attrs.max_fast_reg_page_list_len); 1047 sc->mr_io.type = IB_MR_TYPE_MEM_REG; 1048 if (sc->ib.dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG) 1049 sc->mr_io.type = IB_MR_TYPE_SG_GAPS; 1050 1051 return 0; 1052 1053out2: 1054 rdma_destroy_id(sc->rdma.cm_id); 1055 sc->rdma.cm_id = NULL; 1056 1057out1: 1058 return rc; 1059} 1060 1061/* 1062 * Send a negotiation request message to the peer 1063 * The negotiation procedure is in [MS-SMBD] 3.1.5.2 and 3.1.5.3 1064 * After negotiation, the transport is connected and ready for 1065 * carrying upper layer SMB payload 1066 */ 1067static int smbd_post_send_negotiate_req(struct smbdirect_socket *sc) 1068{ 1069 struct smbdirect_socket_parameters *sp = &sc->parameters; 1070 int rc; 1071 struct smbdirect_send_io *request; 1072 struct smbdirect_negotiate_req *packet; 1073 1074 request = smbd_alloc_send_io(sc); 1075 if (IS_ERR(request)) 1076 return PTR_ERR(request); 1077 1078 packet = smbdirect_send_io_payload(request); 1079 packet->min_version = cpu_to_le16(SMBDIRECT_V1); 1080 packet->max_version = cpu_to_le16(SMBDIRECT_V1); 1081 packet->reserved = 0; 1082 packet->credits_requested = cpu_to_le16(sp->send_credit_target); 1083 packet->preferred_send_size = cpu_to_le32(sp->max_send_size); 1084 packet->max_receive_size = cpu_to_le32(sp->max_recv_size); 1085 packet->max_fragmented_size = 1086 cpu_to_le32(sp->max_fragmented_recv_size); 1087 1088 request->sge[0].addr = ib_dma_map_single( 1089 sc->ib.dev, (void *)packet, 1090 sizeof(*packet), DMA_TO_DEVICE); 1091 if (ib_dma_mapping_error(sc->ib.dev, request->sge[0].addr)) { 1092 rc = -EIO; 1093 goto dma_mapping_failed; 1094 } 1095 request->num_sge = 1; 1096 1097 request->sge[0].length = sizeof(*packet); 1098 request->sge[0].lkey = sc->ib.pd->local_dma_lkey; 1099 1100 rc = smbd_post_send(sc, NULL, request); 1101 if (!rc) 1102 return 0; 1103 1104 if (rc == -EAGAIN) 1105 rc = -EIO; 1106 1107dma_mapping_failed: 1108 smbd_free_send_io(request); 1109 return rc; 1110} 1111 1112/* 1113 * Extend the credits to remote peer 1114 * This implements [MS-SMBD] 3.1.5.9 1115 * The idea is that we should extend credits to remote peer as quickly as 1116 * it's allowed, to maintain data flow. We allocate as much receive 1117 * buffer as possible, and extend the receive credits to remote peer 1118 * return value: the new credtis being granted. 1119 */ 1120static int manage_credits_prior_sending(struct smbdirect_socket *sc) 1121{ 1122 int missing; 1123 int available; 1124 int new_credits; 1125 1126 if (atomic_read(&sc->recv_io.credits.count) >= sc->recv_io.credits.target) 1127 return 0; 1128 1129 missing = (int)sc->recv_io.credits.target - atomic_read(&sc->recv_io.credits.count); 1130 available = atomic_xchg(&sc->recv_io.credits.available, 0); 1131 new_credits = (u16)min3(U16_MAX, missing, available); 1132 if (new_credits <= 0) { 1133 /* 1134 * If credits are available, but not granted 1135 * we need to re-add them again. 1136 */ 1137 if (available) 1138 atomic_add(available, &sc->recv_io.credits.available); 1139 return 0; 1140 } 1141 1142 if (new_credits < available) { 1143 /* 1144 * Readd the remaining available again. 1145 */ 1146 available -= new_credits; 1147 atomic_add(available, &sc->recv_io.credits.available); 1148 } 1149 1150 /* 1151 * Remember we granted the credits 1152 */ 1153 atomic_add(new_credits, &sc->recv_io.credits.count); 1154 return new_credits; 1155} 1156 1157/* 1158 * Check if we need to send a KEEP_ALIVE message 1159 * The idle connection timer triggers a KEEP_ALIVE message when expires 1160 * SMBDIRECT_FLAG_RESPONSE_REQUESTED is set in the message flag to have peer send 1161 * back a response. 1162 * return value: 1163 * 1 if SMBDIRECT_FLAG_RESPONSE_REQUESTED needs to be set 1164 * 0: otherwise 1165 */ 1166static int manage_keep_alive_before_sending(struct smbdirect_socket *sc) 1167{ 1168 struct smbdirect_socket_parameters *sp = &sc->parameters; 1169 1170 if (sc->idle.keepalive == SMBDIRECT_KEEPALIVE_PENDING) { 1171 sc->idle.keepalive = SMBDIRECT_KEEPALIVE_SENT; 1172 /* 1173 * Now use the keepalive timeout (instead of keepalive interval) 1174 * in order to wait for a response 1175 */ 1176 mod_delayed_work(sc->workqueue, &sc->idle.timer_work, 1177 msecs_to_jiffies(sp->keepalive_timeout_msec)); 1178 return 1; 1179 } 1180 return 0; 1181} 1182 1183static int smbd_ib_post_send(struct smbdirect_socket *sc, 1184 struct ib_send_wr *wr) 1185{ 1186 int ret; 1187 1188 atomic_inc(&sc->send_io.pending.count); 1189 ret = ib_post_send(sc->ib.qp, wr, NULL); 1190 if (ret) { 1191 pr_err("failed to post send: %d\n", ret); 1192 smbd_disconnect_rdma_connection(sc); 1193 ret = -EAGAIN; 1194 } 1195 return ret; 1196} 1197 1198/* Post the send request */ 1199static int smbd_post_send(struct smbdirect_socket *sc, 1200 struct smbdirect_send_batch *batch, 1201 struct smbdirect_send_io *request) 1202{ 1203 int i; 1204 1205 for (i = 0; i < request->num_sge; i++) { 1206 log_rdma_send(INFO, 1207 "rdma_request sge[%d] addr=0x%llx length=%u\n", 1208 i, request->sge[i].addr, request->sge[i].length); 1209 ib_dma_sync_single_for_device( 1210 sc->ib.dev, 1211 request->sge[i].addr, 1212 request->sge[i].length, 1213 DMA_TO_DEVICE); 1214 } 1215 1216 request->cqe.done = send_done; 1217 request->wr.next = NULL; 1218 request->wr.sg_list = request->sge; 1219 request->wr.num_sge = request->num_sge; 1220 request->wr.opcode = IB_WR_SEND; 1221 1222 if (batch) { 1223 request->wr.wr_cqe = NULL; 1224 request->wr.send_flags = 0; 1225 if (!list_empty(&batch->msg_list)) { 1226 struct smbdirect_send_io *last; 1227 1228 last = list_last_entry(&batch->msg_list, 1229 struct smbdirect_send_io, 1230 sibling_list); 1231 last->wr.next = &request->wr; 1232 } 1233 list_add_tail(&request->sibling_list, &batch->msg_list); 1234 batch->wr_cnt++; 1235 return 0; 1236 } 1237 1238 request->wr.wr_cqe = &request->cqe; 1239 request->wr.send_flags = IB_SEND_SIGNALED; 1240 return smbd_ib_post_send(sc, &request->wr); 1241} 1242 1243static void smbd_send_batch_init(struct smbdirect_send_batch *batch, 1244 bool need_invalidate_rkey, 1245 unsigned int remote_key) 1246{ 1247 INIT_LIST_HEAD(&batch->msg_list); 1248 batch->wr_cnt = 0; 1249 batch->need_invalidate_rkey = need_invalidate_rkey; 1250 batch->remote_key = remote_key; 1251 batch->credit = 0; 1252} 1253 1254static int smbd_send_batch_flush(struct smbdirect_socket *sc, 1255 struct smbdirect_send_batch *batch, 1256 bool is_last) 1257{ 1258 struct smbdirect_send_io *first, *last; 1259 int ret = 0; 1260 1261 if (list_empty(&batch->msg_list)) 1262 goto release_credit; 1263 1264 first = list_first_entry(&batch->msg_list, 1265 struct smbdirect_send_io, 1266 sibling_list); 1267 last = list_last_entry(&batch->msg_list, 1268 struct smbdirect_send_io, 1269 sibling_list); 1270 1271 if (batch->need_invalidate_rkey) { 1272 first->wr.opcode = IB_WR_SEND_WITH_INV; 1273 first->wr.ex.invalidate_rkey = batch->remote_key; 1274 batch->need_invalidate_rkey = false; 1275 batch->remote_key = 0; 1276 } 1277 1278 last->wr.send_flags = IB_SEND_SIGNALED; 1279 last->wr.wr_cqe = &last->cqe; 1280 1281 /* 1282 * Remove last from batch->msg_list 1283 * and splice the rest of batch->msg_list 1284 * to last->sibling_list. 1285 * 1286 * batch->msg_list is a valid empty list 1287 * at the end. 1288 */ 1289 list_del_init(&last->sibling_list); 1290 list_splice_tail_init(&batch->msg_list, &last->sibling_list); 1291 batch->wr_cnt = 0; 1292 1293 ret = smbd_ib_post_send(sc, &first->wr); 1294 if (ret) { 1295 struct smbdirect_send_io *sibling, *next; 1296 1297 list_for_each_entry_safe(sibling, next, &last->sibling_list, sibling_list) { 1298 list_del_init(&sibling->sibling_list); 1299 smbd_free_send_io(sibling); 1300 } 1301 smbd_free_send_io(last); 1302 } 1303 1304release_credit: 1305 if (is_last && !ret && batch->credit) { 1306 atomic_add(batch->credit, &sc->send_io.bcredits.count); 1307 batch->credit = 0; 1308 wake_up(&sc->send_io.bcredits.wait_queue); 1309 } 1310 1311 return ret; 1312} 1313 1314static int wait_for_credits(struct smbdirect_socket *sc, 1315 wait_queue_head_t *waitq, atomic_t *total_credits, 1316 int needed) 1317{ 1318 int ret; 1319 1320 do { 1321 if (atomic_sub_return(needed, total_credits) >= 0) 1322 return 0; 1323 1324 atomic_add(needed, total_credits); 1325 ret = wait_event_interruptible(*waitq, 1326 atomic_read(total_credits) >= needed || 1327 sc->status != SMBDIRECT_SOCKET_CONNECTED); 1328 1329 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) 1330 return -ENOTCONN; 1331 else if (ret < 0) 1332 return ret; 1333 } while (true); 1334} 1335 1336static int wait_for_send_bcredit(struct smbdirect_socket *sc, 1337 struct smbdirect_send_batch *batch) 1338{ 1339 int ret; 1340 1341 if (batch->credit) 1342 return 0; 1343 1344 ret = wait_for_credits(sc, 1345 &sc->send_io.bcredits.wait_queue, 1346 &sc->send_io.bcredits.count, 1347 1); 1348 if (ret) 1349 return ret; 1350 1351 batch->credit = 1; 1352 return 0; 1353} 1354 1355static int wait_for_send_lcredit(struct smbdirect_socket *sc, 1356 struct smbdirect_send_batch *batch) 1357{ 1358 if (batch && (atomic_read(&sc->send_io.lcredits.count) <= 1)) { 1359 int ret; 1360 1361 ret = smbd_send_batch_flush(sc, batch, false); 1362 if (ret) 1363 return ret; 1364 } 1365 1366 return wait_for_credits(sc, 1367 &sc->send_io.lcredits.wait_queue, 1368 &sc->send_io.lcredits.count, 1369 1); 1370} 1371 1372static int wait_for_send_credits(struct smbdirect_socket *sc, 1373 struct smbdirect_send_batch *batch) 1374{ 1375 if (batch && 1376 (batch->wr_cnt >= 16 || atomic_read(&sc->send_io.credits.count) <= 1)) { 1377 int ret; 1378 1379 ret = smbd_send_batch_flush(sc, batch, false); 1380 if (ret) 1381 return ret; 1382 } 1383 1384 return wait_for_credits(sc, 1385 &sc->send_io.credits.wait_queue, 1386 &sc->send_io.credits.count, 1387 1); 1388} 1389 1390static int smbd_post_send_iter(struct smbdirect_socket *sc, 1391 struct smbdirect_send_batch *batch, 1392 struct iov_iter *iter, 1393 int *_remaining_data_length) 1394{ 1395 struct smbdirect_socket_parameters *sp = &sc->parameters; 1396 int rc; 1397 int header_length; 1398 int data_length; 1399 struct smbdirect_send_io *request; 1400 struct smbdirect_data_transfer *packet; 1401 int new_credits = 0; 1402 struct smbdirect_send_batch _batch; 1403 1404 if (!batch) { 1405 smbd_send_batch_init(&_batch, false, 0); 1406 batch = &_batch; 1407 } 1408 1409 rc = wait_for_send_bcredit(sc, batch); 1410 if (rc) { 1411 log_outgoing(ERR, "disconnected not sending on wait_bcredit\n"); 1412 rc = -EAGAIN; 1413 goto err_wait_bcredit; 1414 } 1415 1416 rc = wait_for_send_lcredit(sc, batch); 1417 if (rc) { 1418 log_outgoing(ERR, "disconnected not sending on wait_lcredit\n"); 1419 rc = -EAGAIN; 1420 goto err_wait_lcredit; 1421 } 1422 1423 rc = wait_for_send_credits(sc, batch); 1424 if (rc) { 1425 log_outgoing(ERR, "disconnected not sending on wait_credit\n"); 1426 rc = -EAGAIN; 1427 goto err_wait_credit; 1428 } 1429 1430 new_credits = manage_credits_prior_sending(sc); 1431 if (new_credits == 0 && 1432 atomic_read(&sc->send_io.credits.count) == 0 && 1433 atomic_read(&sc->recv_io.credits.count) == 0) { 1434 queue_work(sc->workqueue, &sc->recv_io.posted.refill_work); 1435 rc = wait_event_interruptible(sc->send_io.credits.wait_queue, 1436 atomic_read(&sc->send_io.credits.count) >= 1 || 1437 atomic_read(&sc->recv_io.credits.available) >= 1 || 1438 sc->status != SMBDIRECT_SOCKET_CONNECTED); 1439 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) 1440 rc = -ENOTCONN; 1441 if (rc < 0) { 1442 log_outgoing(ERR, "disconnected not sending on last credit\n"); 1443 rc = -EAGAIN; 1444 goto err_wait_credit; 1445 } 1446 1447 new_credits = manage_credits_prior_sending(sc); 1448 } 1449 1450 request = smbd_alloc_send_io(sc); 1451 if (IS_ERR(request)) { 1452 rc = PTR_ERR(request); 1453 goto err_alloc; 1454 } 1455 1456 memset(request->sge, 0, sizeof(request->sge)); 1457 1458 /* Map the packet to DMA */ 1459 header_length = sizeof(struct smbdirect_data_transfer); 1460 /* If this is a packet without payload, don't send padding */ 1461 if (!iter) 1462 header_length = offsetof(struct smbdirect_data_transfer, padding); 1463 1464 packet = smbdirect_send_io_payload(request); 1465 request->sge[0].addr = ib_dma_map_single(sc->ib.dev, 1466 (void *)packet, 1467 header_length, 1468 DMA_TO_DEVICE); 1469 if (ib_dma_mapping_error(sc->ib.dev, request->sge[0].addr)) { 1470 rc = -EIO; 1471 goto err_dma; 1472 } 1473 1474 request->sge[0].length = header_length; 1475 request->sge[0].lkey = sc->ib.pd->local_dma_lkey; 1476 request->num_sge = 1; 1477 1478 /* Fill in the data payload to find out how much data we can add */ 1479 if (iter) { 1480 struct smb_extract_to_rdma extract = { 1481 .nr_sge = request->num_sge, 1482 .max_sge = SMBDIRECT_SEND_IO_MAX_SGE, 1483 .sge = request->sge, 1484 .device = sc->ib.dev, 1485 .local_dma_lkey = sc->ib.pd->local_dma_lkey, 1486 .direction = DMA_TO_DEVICE, 1487 }; 1488 size_t payload_len = umin(*_remaining_data_length, 1489 sp->max_send_size - sizeof(*packet)); 1490 1491 rc = smb_extract_iter_to_rdma(iter, payload_len, 1492 &extract); 1493 if (rc < 0) 1494 goto err_dma; 1495 data_length = rc; 1496 request->num_sge = extract.nr_sge; 1497 *_remaining_data_length -= data_length; 1498 } else { 1499 data_length = 0; 1500 } 1501 1502 /* Fill in the packet header */ 1503 packet->credits_requested = cpu_to_le16(sp->send_credit_target); 1504 packet->credits_granted = cpu_to_le16(new_credits); 1505 1506 packet->flags = 0; 1507 if (manage_keep_alive_before_sending(sc)) 1508 packet->flags |= cpu_to_le16(SMBDIRECT_FLAG_RESPONSE_REQUESTED); 1509 1510 packet->reserved = 0; 1511 if (!data_length) 1512 packet->data_offset = 0; 1513 else 1514 packet->data_offset = cpu_to_le32(24); 1515 packet->data_length = cpu_to_le32(data_length); 1516 packet->remaining_data_length = cpu_to_le32(*_remaining_data_length); 1517 packet->padding = 0; 1518 1519 log_outgoing(INFO, "credits_requested=%d credits_granted=%d data_offset=%d data_length=%d remaining_data_length=%d\n", 1520 le16_to_cpu(packet->credits_requested), 1521 le16_to_cpu(packet->credits_granted), 1522 le32_to_cpu(packet->data_offset), 1523 le32_to_cpu(packet->data_length), 1524 le32_to_cpu(packet->remaining_data_length)); 1525 1526 rc = smbd_post_send(sc, batch, request); 1527 if (!rc) { 1528 /* 1529 * From here request is moved to batch 1530 * and we should not free it explicitly. 1531 */ 1532 1533 if (batch != &_batch) 1534 return 0; 1535 1536 rc = smbd_send_batch_flush(sc, batch, true); 1537 if (!rc) 1538 return 0; 1539 1540 goto err_flush; 1541 } 1542 1543err_dma: 1544 smbd_free_send_io(request); 1545 1546err_flush: 1547err_alloc: 1548 atomic_inc(&sc->send_io.credits.count); 1549 wake_up(&sc->send_io.credits.wait_queue); 1550 1551err_wait_credit: 1552 atomic_inc(&sc->send_io.lcredits.count); 1553 wake_up(&sc->send_io.lcredits.wait_queue); 1554 1555err_wait_lcredit: 1556 atomic_add(batch->credit, &sc->send_io.bcredits.count); 1557 batch->credit = 0; 1558 wake_up(&sc->send_io.bcredits.wait_queue); 1559 1560err_wait_bcredit: 1561 return rc; 1562} 1563 1564/* 1565 * Send an empty message 1566 * Empty message is used to extend credits to peer to for keep live 1567 * while there is no upper layer payload to send at the time 1568 */ 1569static int smbd_post_send_empty(struct smbdirect_socket *sc) 1570{ 1571 int remaining_data_length = 0; 1572 1573 sc->statistics.send_empty++; 1574 return smbd_post_send_iter(sc, NULL, NULL, &remaining_data_length); 1575} 1576 1577static int smbd_post_send_full_iter(struct smbdirect_socket *sc, 1578 struct smbdirect_send_batch *batch, 1579 struct iov_iter *iter, 1580 int *_remaining_data_length) 1581{ 1582 int rc = 0; 1583 1584 /* 1585 * smbd_post_send_iter() respects the 1586 * negotiated max_send_size, so we need to 1587 * loop until the full iter is posted 1588 */ 1589 1590 while (iov_iter_count(iter) > 0) { 1591 rc = smbd_post_send_iter(sc, batch, iter, _remaining_data_length); 1592 if (rc < 0) 1593 break; 1594 } 1595 1596 return rc; 1597} 1598 1599/* 1600 * Post a receive request to the transport 1601 * The remote peer can only send data when a receive request is posted 1602 * The interaction is controlled by send/receive credit system 1603 */ 1604static int smbd_post_recv( 1605 struct smbdirect_socket *sc, struct smbdirect_recv_io *response) 1606{ 1607 struct smbdirect_socket_parameters *sp = &sc->parameters; 1608 struct ib_recv_wr recv_wr; 1609 int rc = -EIO; 1610 1611 response->sge.addr = ib_dma_map_single( 1612 sc->ib.dev, response->packet, 1613 sp->max_recv_size, DMA_FROM_DEVICE); 1614 if (ib_dma_mapping_error(sc->ib.dev, response->sge.addr)) 1615 return rc; 1616 1617 response->sge.length = sp->max_recv_size; 1618 response->sge.lkey = sc->ib.pd->local_dma_lkey; 1619 1620 response->cqe.done = recv_done; 1621 1622 recv_wr.wr_cqe = &response->cqe; 1623 recv_wr.next = NULL; 1624 recv_wr.sg_list = &response->sge; 1625 recv_wr.num_sge = 1; 1626 1627 rc = ib_post_recv(sc->ib.qp, &recv_wr, NULL); 1628 if (rc) { 1629 ib_dma_unmap_single(sc->ib.dev, response->sge.addr, 1630 response->sge.length, DMA_FROM_DEVICE); 1631 response->sge.length = 0; 1632 smbd_disconnect_rdma_connection(sc); 1633 log_rdma_recv(ERR, "ib_post_recv failed rc=%d\n", rc); 1634 } 1635 1636 return rc; 1637} 1638 1639/* Perform SMBD negotiate according to [MS-SMBD] 3.1.5.2 */ 1640static int smbd_negotiate(struct smbdirect_socket *sc) 1641{ 1642 struct smbdirect_socket_parameters *sp = &sc->parameters; 1643 int rc; 1644 struct smbdirect_recv_io *response = get_receive_buffer(sc); 1645 1646 WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_NEGOTIATE_NEEDED); 1647 sc->status = SMBDIRECT_SOCKET_NEGOTIATE_RUNNING; 1648 1649 sc->recv_io.expected = SMBDIRECT_EXPECT_NEGOTIATE_REP; 1650 rc = smbd_post_recv(sc, response); 1651 log_rdma_event(INFO, "smbd_post_recv rc=%d iov.addr=0x%llx iov.length=%u iov.lkey=0x%x\n", 1652 rc, response->sge.addr, 1653 response->sge.length, response->sge.lkey); 1654 if (rc) { 1655 put_receive_buffer(sc, response); 1656 return rc; 1657 } 1658 1659 rc = smbd_post_send_negotiate_req(sc); 1660 if (rc) 1661 return rc; 1662 1663 rc = wait_event_interruptible_timeout( 1664 sc->status_wait, 1665 sc->status != SMBDIRECT_SOCKET_NEGOTIATE_RUNNING, 1666 msecs_to_jiffies(sp->negotiate_timeout_msec)); 1667 log_rdma_event(INFO, "wait_event_interruptible_timeout rc=%d\n", rc); 1668 1669 if (sc->status == SMBDIRECT_SOCKET_CONNECTED) 1670 return 0; 1671 1672 if (rc == 0) 1673 rc = -ETIMEDOUT; 1674 else if (rc == -ERESTARTSYS) 1675 rc = -EINTR; 1676 else 1677 rc = -ENOTCONN; 1678 1679 return rc; 1680} 1681 1682/* 1683 * Implement Connection.FragmentReassemblyBuffer defined in [MS-SMBD] 3.1.1.1 1684 * This is a queue for reassembling upper layer payload and present to upper 1685 * layer. All the inncoming payload go to the reassembly queue, regardless of 1686 * if reassembly is required. The uuper layer code reads from the queue for all 1687 * incoming payloads. 1688 * Put a received packet to the reassembly queue 1689 * response: the packet received 1690 * data_length: the size of payload in this packet 1691 */ 1692static void enqueue_reassembly( 1693 struct smbdirect_socket *sc, 1694 struct smbdirect_recv_io *response, 1695 int data_length) 1696{ 1697 unsigned long flags; 1698 1699 spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags); 1700 list_add_tail(&response->list, &sc->recv_io.reassembly.list); 1701 sc->recv_io.reassembly.queue_length++; 1702 /* 1703 * Make sure reassembly_data_length is updated after list and 1704 * reassembly_queue_length are updated. On the dequeue side 1705 * reassembly_data_length is checked without a lock to determine 1706 * if reassembly_queue_length and list is up to date 1707 */ 1708 virt_wmb(); 1709 sc->recv_io.reassembly.data_length += data_length; 1710 spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags); 1711 sc->statistics.enqueue_reassembly_queue++; 1712} 1713 1714/* 1715 * Get the first entry at the front of reassembly queue 1716 * Caller is responsible for locking 1717 * return value: the first entry if any, NULL if queue is empty 1718 */ 1719static struct smbdirect_recv_io *_get_first_reassembly(struct smbdirect_socket *sc) 1720{ 1721 struct smbdirect_recv_io *ret = NULL; 1722 1723 if (!list_empty(&sc->recv_io.reassembly.list)) { 1724 ret = list_first_entry( 1725 &sc->recv_io.reassembly.list, 1726 struct smbdirect_recv_io, list); 1727 } 1728 return ret; 1729} 1730 1731/* 1732 * Get a receive buffer 1733 * For each remote send, we need to post a receive. The receive buffers are 1734 * pre-allocated in advance. 1735 * return value: the receive buffer, NULL if none is available 1736 */ 1737static struct smbdirect_recv_io *get_receive_buffer(struct smbdirect_socket *sc) 1738{ 1739 struct smbdirect_recv_io *ret = NULL; 1740 unsigned long flags; 1741 1742 spin_lock_irqsave(&sc->recv_io.free.lock, flags); 1743 if (!list_empty(&sc->recv_io.free.list)) { 1744 ret = list_first_entry( 1745 &sc->recv_io.free.list, 1746 struct smbdirect_recv_io, list); 1747 list_del(&ret->list); 1748 sc->statistics.get_receive_buffer++; 1749 } 1750 spin_unlock_irqrestore(&sc->recv_io.free.lock, flags); 1751 1752 return ret; 1753} 1754 1755/* 1756 * Return a receive buffer 1757 * Upon returning of a receive buffer, we can post new receive and extend 1758 * more receive credits to remote peer. This is done immediately after a 1759 * receive buffer is returned. 1760 */ 1761static void put_receive_buffer( 1762 struct smbdirect_socket *sc, struct smbdirect_recv_io *response) 1763{ 1764 unsigned long flags; 1765 1766 if (likely(response->sge.length != 0)) { 1767 ib_dma_unmap_single(sc->ib.dev, 1768 response->sge.addr, 1769 response->sge.length, 1770 DMA_FROM_DEVICE); 1771 response->sge.length = 0; 1772 } 1773 1774 spin_lock_irqsave(&sc->recv_io.free.lock, flags); 1775 list_add_tail(&response->list, &sc->recv_io.free.list); 1776 sc->statistics.put_receive_buffer++; 1777 spin_unlock_irqrestore(&sc->recv_io.free.lock, flags); 1778 1779 queue_work(sc->workqueue, &sc->recv_io.posted.refill_work); 1780} 1781 1782/* Preallocate all receive buffer on transport establishment */ 1783static int allocate_receive_buffers(struct smbdirect_socket *sc, int num_buf) 1784{ 1785 struct smbdirect_recv_io *response; 1786 int i; 1787 1788 for (i = 0; i < num_buf; i++) { 1789 response = mempool_alloc(sc->recv_io.mem.pool, GFP_KERNEL); 1790 if (!response) 1791 goto allocate_failed; 1792 1793 response->socket = sc; 1794 response->sge.length = 0; 1795 list_add_tail(&response->list, &sc->recv_io.free.list); 1796 } 1797 1798 return 0; 1799 1800allocate_failed: 1801 while (!list_empty(&sc->recv_io.free.list)) { 1802 response = list_first_entry( 1803 &sc->recv_io.free.list, 1804 struct smbdirect_recv_io, list); 1805 list_del(&response->list); 1806 1807 mempool_free(response, sc->recv_io.mem.pool); 1808 } 1809 return -ENOMEM; 1810} 1811 1812static void destroy_receive_buffers(struct smbdirect_socket *sc) 1813{ 1814 struct smbdirect_recv_io *response; 1815 1816 while ((response = get_receive_buffer(sc))) 1817 mempool_free(response, sc->recv_io.mem.pool); 1818} 1819 1820static void send_immediate_empty_message(struct work_struct *work) 1821{ 1822 struct smbdirect_socket *sc = 1823 container_of(work, struct smbdirect_socket, idle.immediate_work); 1824 1825 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) 1826 return; 1827 1828 log_keep_alive(INFO, "send an empty message\n"); 1829 smbd_post_send_empty(sc); 1830} 1831 1832/* Implement idle connection timer [MS-SMBD] 3.1.6.2 */ 1833static void idle_connection_timer(struct work_struct *work) 1834{ 1835 struct smbdirect_socket *sc = 1836 container_of(work, struct smbdirect_socket, idle.timer_work.work); 1837 struct smbdirect_socket_parameters *sp = &sc->parameters; 1838 1839 if (sc->idle.keepalive != SMBDIRECT_KEEPALIVE_NONE) { 1840 log_keep_alive(ERR, 1841 "error status sc->idle.keepalive=%d\n", 1842 sc->idle.keepalive); 1843 smbd_disconnect_rdma_connection(sc); 1844 return; 1845 } 1846 1847 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) 1848 return; 1849 1850 /* 1851 * Now use the keepalive timeout (instead of keepalive interval) 1852 * in order to wait for a response 1853 */ 1854 sc->idle.keepalive = SMBDIRECT_KEEPALIVE_PENDING; 1855 mod_delayed_work(sc->workqueue, &sc->idle.timer_work, 1856 msecs_to_jiffies(sp->keepalive_timeout_msec)); 1857 log_keep_alive(INFO, "schedule send of empty idle message\n"); 1858 queue_work(sc->workqueue, &sc->idle.immediate_work); 1859} 1860 1861/* 1862 * Destroy the transport and related RDMA and memory resources 1863 * Need to go through all the pending counters and make sure on one is using 1864 * the transport while it is destroyed 1865 */ 1866void smbd_destroy(struct TCP_Server_Info *server) 1867{ 1868 struct smbd_connection *info = server->smbd_conn; 1869 struct smbdirect_socket *sc; 1870 struct smbdirect_recv_io *response; 1871 unsigned long flags; 1872 1873 if (!info) { 1874 log_rdma_event(INFO, "rdma session already destroyed\n"); 1875 return; 1876 } 1877 sc = &info->socket; 1878 1879 log_rdma_event(INFO, "cancelling and disable disconnect_work\n"); 1880 disable_work_sync(&sc->disconnect_work); 1881 1882 log_rdma_event(INFO, "destroying rdma session\n"); 1883 if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING) 1884 smbd_disconnect_rdma_work(&sc->disconnect_work); 1885 if (sc->status < SMBDIRECT_SOCKET_DISCONNECTED) { 1886 log_rdma_event(INFO, "wait for transport being disconnected\n"); 1887 wait_event(sc->status_wait, sc->status == SMBDIRECT_SOCKET_DISCONNECTED); 1888 log_rdma_event(INFO, "waited for transport being disconnected\n"); 1889 } 1890 1891 /* 1892 * Wake up all waiters in all wait queues 1893 * in order to notice the broken connection. 1894 * 1895 * Most likely this was already called via 1896 * smbd_disconnect_rdma_work(), but call it again... 1897 */ 1898 smbd_disconnect_wake_up_all(sc); 1899 1900 log_rdma_event(INFO, "cancelling recv_io.posted.refill_work\n"); 1901 disable_work_sync(&sc->recv_io.posted.refill_work); 1902 1903 log_rdma_event(INFO, "destroying qp\n"); 1904 ib_drain_qp(sc->ib.qp); 1905 rdma_destroy_qp(sc->rdma.cm_id); 1906 sc->ib.qp = NULL; 1907 1908 log_rdma_event(INFO, "cancelling idle timer\n"); 1909 disable_delayed_work_sync(&sc->idle.timer_work); 1910 log_rdma_event(INFO, "cancelling send immediate work\n"); 1911 disable_work_sync(&sc->idle.immediate_work); 1912 1913 /* It's not possible for upper layer to get to reassembly */ 1914 log_rdma_event(INFO, "drain the reassembly queue\n"); 1915 do { 1916 spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags); 1917 response = _get_first_reassembly(sc); 1918 if (response) { 1919 list_del(&response->list); 1920 spin_unlock_irqrestore( 1921 &sc->recv_io.reassembly.lock, flags); 1922 put_receive_buffer(sc, response); 1923 } else 1924 spin_unlock_irqrestore( 1925 &sc->recv_io.reassembly.lock, flags); 1926 } while (response); 1927 sc->recv_io.reassembly.data_length = 0; 1928 1929 log_rdma_event(INFO, "free receive buffers\n"); 1930 destroy_receive_buffers(sc); 1931 1932 log_rdma_event(INFO, "freeing mr list\n"); 1933 destroy_mr_list(sc); 1934 1935 ib_free_cq(sc->ib.send_cq); 1936 ib_free_cq(sc->ib.recv_cq); 1937 ib_dealloc_pd(sc->ib.pd); 1938 rdma_destroy_id(sc->rdma.cm_id); 1939 1940 /* free mempools */ 1941 mempool_destroy(sc->send_io.mem.pool); 1942 kmem_cache_destroy(sc->send_io.mem.cache); 1943 1944 mempool_destroy(sc->recv_io.mem.pool); 1945 kmem_cache_destroy(sc->recv_io.mem.cache); 1946 1947 sc->status = SMBDIRECT_SOCKET_DESTROYED; 1948 1949 destroy_workqueue(sc->workqueue); 1950 log_rdma_event(INFO, "rdma session destroyed\n"); 1951 kfree(info); 1952 server->smbd_conn = NULL; 1953} 1954 1955/* 1956 * Reconnect this SMBD connection, called from upper layer 1957 * return value: 0 on success, or actual error code 1958 */ 1959int smbd_reconnect(struct TCP_Server_Info *server) 1960{ 1961 log_rdma_event(INFO, "reconnecting rdma session\n"); 1962 1963 if (!server->smbd_conn) { 1964 log_rdma_event(INFO, "rdma session already destroyed\n"); 1965 goto create_conn; 1966 } 1967 1968 /* 1969 * This is possible if transport is disconnected and we haven't received 1970 * notification from RDMA, but upper layer has detected timeout 1971 */ 1972 if (server->smbd_conn->socket.status == SMBDIRECT_SOCKET_CONNECTED) { 1973 log_rdma_event(INFO, "disconnecting transport\n"); 1974 smbd_destroy(server); 1975 } 1976 1977create_conn: 1978 log_rdma_event(INFO, "creating rdma session\n"); 1979 server->smbd_conn = smbd_get_connection( 1980 server, (struct sockaddr *) &server->dstaddr); 1981 1982 if (server->smbd_conn) { 1983 cifs_dbg(VFS, "RDMA transport re-established\n"); 1984 trace_smb3_smbd_connect_done(server->hostname, server->conn_id, &server->dstaddr); 1985 return 0; 1986 } 1987 trace_smb3_smbd_connect_err(server->hostname, server->conn_id, &server->dstaddr); 1988 return -ENOENT; 1989} 1990 1991static void destroy_caches(struct smbdirect_socket *sc) 1992{ 1993 destroy_receive_buffers(sc); 1994 mempool_destroy(sc->recv_io.mem.pool); 1995 kmem_cache_destroy(sc->recv_io.mem.cache); 1996 mempool_destroy(sc->send_io.mem.pool); 1997 kmem_cache_destroy(sc->send_io.mem.cache); 1998} 1999 2000#define MAX_NAME_LEN 80 2001static int allocate_caches(struct smbdirect_socket *sc) 2002{ 2003 struct smbdirect_socket_parameters *sp = &sc->parameters; 2004 char name[MAX_NAME_LEN]; 2005 int rc; 2006 2007 if (WARN_ON_ONCE(sp->max_recv_size < sizeof(struct smbdirect_data_transfer))) 2008 return -ENOMEM; 2009 2010 scnprintf(name, MAX_NAME_LEN, "smbdirect_send_io_%p", sc); 2011 sc->send_io.mem.cache = 2012 kmem_cache_create( 2013 name, 2014 sizeof(struct smbdirect_send_io) + 2015 sizeof(struct smbdirect_data_transfer), 2016 0, SLAB_HWCACHE_ALIGN, NULL); 2017 if (!sc->send_io.mem.cache) 2018 return -ENOMEM; 2019 2020 sc->send_io.mem.pool = 2021 mempool_create(sp->send_credit_target, mempool_alloc_slab, 2022 mempool_free_slab, sc->send_io.mem.cache); 2023 if (!sc->send_io.mem.pool) 2024 goto out1; 2025 2026 scnprintf(name, MAX_NAME_LEN, "smbdirect_recv_io_%p", sc); 2027 2028 struct kmem_cache_args response_args = { 2029 .align = __alignof__(struct smbdirect_recv_io), 2030 .useroffset = (offsetof(struct smbdirect_recv_io, packet) + 2031 sizeof(struct smbdirect_data_transfer)), 2032 .usersize = sp->max_recv_size - sizeof(struct smbdirect_data_transfer), 2033 }; 2034 sc->recv_io.mem.cache = 2035 kmem_cache_create(name, 2036 sizeof(struct smbdirect_recv_io) + sp->max_recv_size, 2037 &response_args, SLAB_HWCACHE_ALIGN); 2038 if (!sc->recv_io.mem.cache) 2039 goto out2; 2040 2041 sc->recv_io.mem.pool = 2042 mempool_create(sp->recv_credit_max, mempool_alloc_slab, 2043 mempool_free_slab, sc->recv_io.mem.cache); 2044 if (!sc->recv_io.mem.pool) 2045 goto out3; 2046 2047 rc = allocate_receive_buffers(sc, sp->recv_credit_max); 2048 if (rc) { 2049 log_rdma_event(ERR, "failed to allocate receive buffers\n"); 2050 goto out4; 2051 } 2052 2053 return 0; 2054 2055out4: 2056 mempool_destroy(sc->recv_io.mem.pool); 2057out3: 2058 kmem_cache_destroy(sc->recv_io.mem.cache); 2059out2: 2060 mempool_destroy(sc->send_io.mem.pool); 2061out1: 2062 kmem_cache_destroy(sc->send_io.mem.cache); 2063 return -ENOMEM; 2064} 2065 2066/* Create a SMBD connection, called by upper layer */ 2067static struct smbd_connection *_smbd_get_connection( 2068 struct TCP_Server_Info *server, struct sockaddr *dstaddr, int port) 2069{ 2070 int rc; 2071 struct smbd_connection *info; 2072 struct smbdirect_socket *sc; 2073 struct smbdirect_socket_parameters *sp; 2074 struct rdma_conn_param conn_param; 2075 struct ib_qp_cap qp_cap; 2076 struct ib_qp_init_attr qp_attr; 2077 struct sockaddr_in *addr_in = (struct sockaddr_in *) dstaddr; 2078 struct ib_port_immutable port_immutable; 2079 __be32 ird_ord_hdr[2]; 2080 char wq_name[80]; 2081 struct workqueue_struct *workqueue; 2082 2083 info = kzalloc(sizeof(struct smbd_connection), GFP_KERNEL); 2084 if (!info) 2085 return NULL; 2086 sc = &info->socket; 2087 scnprintf(wq_name, ARRAY_SIZE(wq_name), "smbd_%p", sc); 2088 workqueue = create_workqueue(wq_name); 2089 if (!workqueue) 2090 goto create_wq_failed; 2091 smbdirect_socket_init(sc); 2092 sc->workqueue = workqueue; 2093 sp = &sc->parameters; 2094 2095 INIT_WORK(&sc->disconnect_work, smbd_disconnect_rdma_work); 2096 2097 sp->resolve_addr_timeout_msec = RDMA_RESOLVE_TIMEOUT; 2098 sp->resolve_route_timeout_msec = RDMA_RESOLVE_TIMEOUT; 2099 sp->rdma_connect_timeout_msec = RDMA_RESOLVE_TIMEOUT; 2100 sp->negotiate_timeout_msec = SMBD_NEGOTIATE_TIMEOUT * 1000; 2101 sp->initiator_depth = 1; 2102 sp->responder_resources = SMBD_CM_RESPONDER_RESOURCES; 2103 sp->recv_credit_max = smbd_receive_credit_max; 2104 sp->send_credit_target = smbd_send_credit_target; 2105 sp->max_send_size = smbd_max_send_size; 2106 sp->max_fragmented_recv_size = smbd_max_fragmented_recv_size; 2107 sp->max_recv_size = smbd_max_receive_size; 2108 sp->max_frmr_depth = smbd_max_frmr_depth; 2109 sp->keepalive_interval_msec = smbd_keep_alive_interval * 1000; 2110 sp->keepalive_timeout_msec = KEEPALIVE_RECV_TIMEOUT * 1000; 2111 2112 rc = smbd_ia_open(sc, dstaddr, port); 2113 if (rc) { 2114 log_rdma_event(INFO, "smbd_ia_open rc=%d\n", rc); 2115 goto create_id_failed; 2116 } 2117 2118 if (sp->send_credit_target > sc->ib.dev->attrs.max_cqe || 2119 sp->send_credit_target > sc->ib.dev->attrs.max_qp_wr) { 2120 log_rdma_event(ERR, "consider lowering send_credit_target = %d. Possible CQE overrun, device reporting max_cqe %d max_qp_wr %d\n", 2121 sp->send_credit_target, 2122 sc->ib.dev->attrs.max_cqe, 2123 sc->ib.dev->attrs.max_qp_wr); 2124 goto config_failed; 2125 } 2126 2127 if (sp->recv_credit_max > sc->ib.dev->attrs.max_cqe || 2128 sp->recv_credit_max > sc->ib.dev->attrs.max_qp_wr) { 2129 log_rdma_event(ERR, "consider lowering receive_credit_max = %d. Possible CQE overrun, device reporting max_cqe %d max_qp_wr %d\n", 2130 sp->recv_credit_max, 2131 sc->ib.dev->attrs.max_cqe, 2132 sc->ib.dev->attrs.max_qp_wr); 2133 goto config_failed; 2134 } 2135 2136 if (sc->ib.dev->attrs.max_send_sge < SMBDIRECT_SEND_IO_MAX_SGE || 2137 sc->ib.dev->attrs.max_recv_sge < SMBDIRECT_RECV_IO_MAX_SGE) { 2138 log_rdma_event(ERR, 2139 "device %.*s max_send_sge/max_recv_sge = %d/%d too small\n", 2140 IB_DEVICE_NAME_MAX, 2141 sc->ib.dev->name, 2142 sc->ib.dev->attrs.max_send_sge, 2143 sc->ib.dev->attrs.max_recv_sge); 2144 goto config_failed; 2145 } 2146 2147 sp->responder_resources = 2148 min_t(u8, sp->responder_resources, 2149 sc->ib.dev->attrs.max_qp_rd_atom); 2150 log_rdma_mr(INFO, "responder_resources=%d\n", 2151 sp->responder_resources); 2152 2153 /* 2154 * We use allocate sp->responder_resources * 2 MRs 2155 * and each MR needs WRs for REG and INV, so 2156 * we use '* 4'. 2157 * 2158 * +1 for ib_drain_qp() 2159 */ 2160 memset(&qp_cap, 0, sizeof(qp_cap)); 2161 qp_cap.max_send_wr = sp->send_credit_target + sp->responder_resources * 4 + 1; 2162 qp_cap.max_recv_wr = sp->recv_credit_max + 1; 2163 qp_cap.max_send_sge = SMBDIRECT_SEND_IO_MAX_SGE; 2164 qp_cap.max_recv_sge = SMBDIRECT_RECV_IO_MAX_SGE; 2165 2166 sc->ib.pd = ib_alloc_pd(sc->ib.dev, 0); 2167 if (IS_ERR(sc->ib.pd)) { 2168 rc = PTR_ERR(sc->ib.pd); 2169 sc->ib.pd = NULL; 2170 log_rdma_event(ERR, "ib_alloc_pd() returned %d\n", rc); 2171 goto alloc_pd_failed; 2172 } 2173 2174 sc->ib.send_cq = 2175 ib_alloc_cq_any(sc->ib.dev, sc, 2176 qp_cap.max_send_wr, IB_POLL_SOFTIRQ); 2177 if (IS_ERR(sc->ib.send_cq)) { 2178 sc->ib.send_cq = NULL; 2179 goto alloc_cq_failed; 2180 } 2181 2182 sc->ib.recv_cq = 2183 ib_alloc_cq_any(sc->ib.dev, sc, 2184 qp_cap.max_recv_wr, IB_POLL_SOFTIRQ); 2185 if (IS_ERR(sc->ib.recv_cq)) { 2186 sc->ib.recv_cq = NULL; 2187 goto alloc_cq_failed; 2188 } 2189 2190 memset(&qp_attr, 0, sizeof(qp_attr)); 2191 qp_attr.event_handler = smbd_qp_async_error_upcall; 2192 qp_attr.qp_context = sc; 2193 qp_attr.cap = qp_cap; 2194 qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR; 2195 qp_attr.qp_type = IB_QPT_RC; 2196 qp_attr.send_cq = sc->ib.send_cq; 2197 qp_attr.recv_cq = sc->ib.recv_cq; 2198 qp_attr.port_num = ~0; 2199 2200 rc = rdma_create_qp(sc->rdma.cm_id, sc->ib.pd, &qp_attr); 2201 if (rc) { 2202 log_rdma_event(ERR, "rdma_create_qp failed %i\n", rc); 2203 goto create_qp_failed; 2204 } 2205 sc->ib.qp = sc->rdma.cm_id->qp; 2206 2207 memset(&conn_param, 0, sizeof(conn_param)); 2208 conn_param.initiator_depth = sp->initiator_depth; 2209 conn_param.responder_resources = sp->responder_resources; 2210 2211 /* Need to send IRD/ORD in private data for iWARP */ 2212 sc->ib.dev->ops.get_port_immutable( 2213 sc->ib.dev, sc->rdma.cm_id->port_num, &port_immutable); 2214 if (port_immutable.core_cap_flags & RDMA_CORE_PORT_IWARP) { 2215 ird_ord_hdr[0] = cpu_to_be32(conn_param.responder_resources); 2216 ird_ord_hdr[1] = cpu_to_be32(conn_param.initiator_depth); 2217 conn_param.private_data = ird_ord_hdr; 2218 conn_param.private_data_len = sizeof(ird_ord_hdr); 2219 } else { 2220 conn_param.private_data = NULL; 2221 conn_param.private_data_len = 0; 2222 } 2223 2224 conn_param.retry_count = SMBD_CM_RETRY; 2225 conn_param.rnr_retry_count = SMBD_CM_RNR_RETRY; 2226 conn_param.flow_control = 0; 2227 2228 log_rdma_event(INFO, "connecting to IP %pI4 port %d\n", 2229 &addr_in->sin_addr, port); 2230 2231 WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED); 2232 sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING; 2233 rc = rdma_connect(sc->rdma.cm_id, &conn_param); 2234 if (rc) { 2235 log_rdma_event(ERR, "rdma_connect() failed with %i\n", rc); 2236 goto rdma_connect_failed; 2237 } 2238 2239 wait_event_interruptible_timeout( 2240 sc->status_wait, 2241 sc->status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING, 2242 msecs_to_jiffies(sp->rdma_connect_timeout_msec)); 2243 2244 if (sc->status != SMBDIRECT_SOCKET_NEGOTIATE_NEEDED) { 2245 log_rdma_event(ERR, "rdma_connect failed port=%d\n", port); 2246 goto rdma_connect_failed; 2247 } 2248 2249 log_rdma_event(INFO, "rdma_connect connected\n"); 2250 2251 rc = allocate_caches(sc); 2252 if (rc) { 2253 log_rdma_event(ERR, "cache allocation failed\n"); 2254 goto allocate_cache_failed; 2255 } 2256 2257 INIT_WORK(&sc->idle.immediate_work, send_immediate_empty_message); 2258 INIT_DELAYED_WORK(&sc->idle.timer_work, idle_connection_timer); 2259 /* 2260 * start with the negotiate timeout and SMBDIRECT_KEEPALIVE_PENDING 2261 * so that the timer will cause a disconnect. 2262 */ 2263 sc->idle.keepalive = SMBDIRECT_KEEPALIVE_PENDING; 2264 mod_delayed_work(sc->workqueue, &sc->idle.timer_work, 2265 msecs_to_jiffies(sp->negotiate_timeout_msec)); 2266 2267 INIT_WORK(&sc->recv_io.posted.refill_work, smbd_post_send_credits); 2268 2269 rc = smbd_negotiate(sc); 2270 if (rc) { 2271 log_rdma_event(ERR, "smbd_negotiate rc=%d\n", rc); 2272 goto negotiation_failed; 2273 } 2274 2275 rc = allocate_mr_list(sc); 2276 if (rc) { 2277 log_rdma_mr(ERR, "memory registration allocation failed\n"); 2278 goto allocate_mr_failed; 2279 } 2280 2281 return info; 2282 2283allocate_mr_failed: 2284 /* At this point, need to a full transport shutdown */ 2285 server->smbd_conn = info; 2286 smbd_destroy(server); 2287 return NULL; 2288 2289negotiation_failed: 2290 disable_delayed_work_sync(&sc->idle.timer_work); 2291 destroy_caches(sc); 2292 sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED; 2293 rdma_disconnect(sc->rdma.cm_id); 2294 wait_event(sc->status_wait, 2295 sc->status == SMBDIRECT_SOCKET_DISCONNECTED); 2296 2297allocate_cache_failed: 2298rdma_connect_failed: 2299 rdma_destroy_qp(sc->rdma.cm_id); 2300 2301create_qp_failed: 2302alloc_cq_failed: 2303 if (sc->ib.send_cq) 2304 ib_free_cq(sc->ib.send_cq); 2305 if (sc->ib.recv_cq) 2306 ib_free_cq(sc->ib.recv_cq); 2307 2308 ib_dealloc_pd(sc->ib.pd); 2309 2310alloc_pd_failed: 2311config_failed: 2312 rdma_destroy_id(sc->rdma.cm_id); 2313 2314create_id_failed: 2315 destroy_workqueue(sc->workqueue); 2316create_wq_failed: 2317 kfree(info); 2318 return NULL; 2319} 2320 2321struct smbd_connection *smbd_get_connection( 2322 struct TCP_Server_Info *server, struct sockaddr *dstaddr) 2323{ 2324 struct smbd_connection *ret; 2325 const struct smbdirect_socket_parameters *sp; 2326 int port = SMBD_PORT; 2327 2328try_again: 2329 ret = _smbd_get_connection(server, dstaddr, port); 2330 2331 /* Try SMB_PORT if SMBD_PORT doesn't work */ 2332 if (!ret && port == SMBD_PORT) { 2333 port = SMB_PORT; 2334 goto try_again; 2335 } 2336 if (!ret) 2337 return NULL; 2338 2339 sp = &ret->socket.parameters; 2340 2341 server->rdma_readwrite_threshold = 2342 rdma_readwrite_threshold > sp->max_fragmented_send_size ? 2343 sp->max_fragmented_send_size : 2344 rdma_readwrite_threshold; 2345 2346 return ret; 2347} 2348 2349/* 2350 * Receive data from the transport's receive reassembly queue 2351 * All the incoming data packets are placed in reassembly queue 2352 * iter: the buffer to read data into 2353 * size: the length of data to read 2354 * return value: actual data read 2355 * 2356 * Note: this implementation copies the data from reassembly queue to receive 2357 * buffers used by upper layer. This is not the optimal code path. A better way 2358 * to do it is to not have upper layer allocate its receive buffers but rather 2359 * borrow the buffer from reassembly queue, and return it after data is 2360 * consumed. But this will require more changes to upper layer code, and also 2361 * need to consider packet boundaries while they still being reassembled. 2362 */ 2363int smbd_recv(struct smbd_connection *info, struct msghdr *msg) 2364{ 2365 struct smbdirect_socket *sc = &info->socket; 2366 struct smbdirect_recv_io *response; 2367 struct smbdirect_data_transfer *data_transfer; 2368 size_t size = iov_iter_count(&msg->msg_iter); 2369 int to_copy, to_read, data_read, offset; 2370 u32 data_length, remaining_data_length, data_offset; 2371 int rc; 2372 2373 if (WARN_ON_ONCE(iov_iter_rw(&msg->msg_iter) == WRITE)) 2374 return -EINVAL; /* It's a bug in upper layer to get there */ 2375 2376again: 2377 /* 2378 * No need to hold the reassembly queue lock all the time as we are 2379 * the only one reading from the front of the queue. The transport 2380 * may add more entries to the back of the queue at the same time 2381 */ 2382 log_read(INFO, "size=%zd sc->recv_io.reassembly.data_length=%d\n", size, 2383 sc->recv_io.reassembly.data_length); 2384 if (sc->recv_io.reassembly.data_length >= size) { 2385 int queue_length; 2386 int queue_removed = 0; 2387 unsigned long flags; 2388 2389 /* 2390 * Need to make sure reassembly_data_length is read before 2391 * reading reassembly_queue_length and calling 2392 * _get_first_reassembly. This call is lock free 2393 * as we never read at the end of the queue which are being 2394 * updated in SOFTIRQ as more data is received 2395 */ 2396 virt_rmb(); 2397 queue_length = sc->recv_io.reassembly.queue_length; 2398 data_read = 0; 2399 to_read = size; 2400 offset = sc->recv_io.reassembly.first_entry_offset; 2401 while (data_read < size) { 2402 response = _get_first_reassembly(sc); 2403 data_transfer = smbdirect_recv_io_payload(response); 2404 data_length = le32_to_cpu(data_transfer->data_length); 2405 remaining_data_length = 2406 le32_to_cpu( 2407 data_transfer->remaining_data_length); 2408 data_offset = le32_to_cpu(data_transfer->data_offset); 2409 2410 /* 2411 * The upper layer expects RFC1002 length at the 2412 * beginning of the payload. Return it to indicate 2413 * the total length of the packet. This minimize the 2414 * change to upper layer packet processing logic. This 2415 * will be eventually remove when an intermediate 2416 * transport layer is added 2417 */ 2418 if (response->first_segment && size == 4) { 2419 unsigned int rfc1002_len = 2420 data_length + remaining_data_length; 2421 __be32 rfc1002_hdr = cpu_to_be32(rfc1002_len); 2422 if (copy_to_iter(&rfc1002_hdr, sizeof(rfc1002_hdr), 2423 &msg->msg_iter) != sizeof(rfc1002_hdr)) 2424 return -EFAULT; 2425 data_read = 4; 2426 response->first_segment = false; 2427 log_read(INFO, "returning rfc1002 length %d\n", 2428 rfc1002_len); 2429 goto read_rfc1002_done; 2430 } 2431 2432 to_copy = min_t(int, data_length - offset, to_read); 2433 if (copy_to_iter((char *)data_transfer + data_offset + offset, 2434 to_copy, &msg->msg_iter) != to_copy) 2435 return -EFAULT; 2436 2437 /* move on to the next buffer? */ 2438 if (to_copy == data_length - offset) { 2439 queue_length--; 2440 /* 2441 * No need to lock if we are not at the 2442 * end of the queue 2443 */ 2444 if (queue_length) 2445 list_del(&response->list); 2446 else { 2447 spin_lock_irqsave( 2448 &sc->recv_io.reassembly.lock, flags); 2449 list_del(&response->list); 2450 spin_unlock_irqrestore( 2451 &sc->recv_io.reassembly.lock, flags); 2452 } 2453 queue_removed++; 2454 sc->statistics.dequeue_reassembly_queue++; 2455 put_receive_buffer(sc, response); 2456 offset = 0; 2457 log_read(INFO, "put_receive_buffer offset=0\n"); 2458 } else 2459 offset += to_copy; 2460 2461 to_read -= to_copy; 2462 data_read += to_copy; 2463 2464 log_read(INFO, "_get_first_reassembly memcpy %d bytes data_transfer_length-offset=%d after that to_read=%d data_read=%d offset=%d\n", 2465 to_copy, data_length - offset, 2466 to_read, data_read, offset); 2467 } 2468 2469 spin_lock_irqsave(&sc->recv_io.reassembly.lock, flags); 2470 sc->recv_io.reassembly.data_length -= data_read; 2471 sc->recv_io.reassembly.queue_length -= queue_removed; 2472 spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags); 2473 2474 sc->recv_io.reassembly.first_entry_offset = offset; 2475 log_read(INFO, "returning to thread data_read=%d reassembly_data_length=%d first_entry_offset=%d\n", 2476 data_read, sc->recv_io.reassembly.data_length, 2477 sc->recv_io.reassembly.first_entry_offset); 2478read_rfc1002_done: 2479 return data_read; 2480 } 2481 2482 log_read(INFO, "wait_event on more data\n"); 2483 rc = wait_event_interruptible( 2484 sc->recv_io.reassembly.wait_queue, 2485 sc->recv_io.reassembly.data_length >= size || 2486 sc->status != SMBDIRECT_SOCKET_CONNECTED); 2487 /* Don't return any data if interrupted */ 2488 if (rc) 2489 return rc; 2490 2491 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { 2492 log_read(ERR, "disconnected\n"); 2493 return -ECONNABORTED; 2494 } 2495 2496 goto again; 2497} 2498 2499/* 2500 * Send data to transport 2501 * Each rqst is transported as a SMBDirect payload 2502 * rqst: the data to write 2503 * return value: 0 if successfully write, otherwise error code 2504 */ 2505int smbd_send(struct TCP_Server_Info *server, 2506 int num_rqst, struct smb_rqst *rqst_array) 2507{ 2508 struct smbd_connection *info = server->smbd_conn; 2509 struct smbdirect_socket *sc = &info->socket; 2510 struct smbdirect_socket_parameters *sp = &sc->parameters; 2511 struct smb_rqst *rqst; 2512 struct iov_iter iter; 2513 struct smbdirect_send_batch batch; 2514 unsigned int remaining_data_length, klen; 2515 int rc, i, rqst_idx; 2516 int error = 0; 2517 2518 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) 2519 return -EAGAIN; 2520 2521 /* 2522 * Add in the page array if there is one. The caller needs to set 2523 * rq_tailsz to PAGE_SIZE when the buffer has multiple pages and 2524 * ends at page boundary 2525 */ 2526 remaining_data_length = 0; 2527 for (i = 0; i < num_rqst; i++) 2528 remaining_data_length += smb_rqst_len(server, &rqst_array[i]); 2529 2530 if (unlikely(remaining_data_length > sp->max_fragmented_send_size)) { 2531 /* assertion: payload never exceeds negotiated maximum */ 2532 log_write(ERR, "payload size %d > max size %d\n", 2533 remaining_data_length, sp->max_fragmented_send_size); 2534 return -EINVAL; 2535 } 2536 2537 log_write(INFO, "num_rqst=%d total length=%u\n", 2538 num_rqst, remaining_data_length); 2539 2540 rqst_idx = 0; 2541 smbd_send_batch_init(&batch, false, 0); 2542 do { 2543 rqst = &rqst_array[rqst_idx]; 2544 2545 cifs_dbg(FYI, "Sending smb (RDMA): idx=%d smb_len=%lu\n", 2546 rqst_idx, smb_rqst_len(server, rqst)); 2547 for (i = 0; i < rqst->rq_nvec; i++) 2548 dump_smb(rqst->rq_iov[i].iov_base, rqst->rq_iov[i].iov_len); 2549 2550 log_write(INFO, "RDMA-WR[%u] nvec=%d len=%u iter=%zu rqlen=%lu\n", 2551 rqst_idx, rqst->rq_nvec, remaining_data_length, 2552 iov_iter_count(&rqst->rq_iter), smb_rqst_len(server, rqst)); 2553 2554 /* Send the metadata pages. */ 2555 klen = 0; 2556 for (i = 0; i < rqst->rq_nvec; i++) 2557 klen += rqst->rq_iov[i].iov_len; 2558 iov_iter_kvec(&iter, ITER_SOURCE, rqst->rq_iov, rqst->rq_nvec, klen); 2559 2560 rc = smbd_post_send_full_iter(sc, &batch, &iter, &remaining_data_length); 2561 if (rc < 0) { 2562 error = rc; 2563 break; 2564 } 2565 2566 if (iov_iter_count(&rqst->rq_iter) > 0) { 2567 /* And then the data pages if there are any */ 2568 rc = smbd_post_send_full_iter(sc, &batch, &rqst->rq_iter, 2569 &remaining_data_length); 2570 if (rc < 0) { 2571 error = rc; 2572 break; 2573 } 2574 } 2575 2576 } while (++rqst_idx < num_rqst); 2577 2578 rc = smbd_send_batch_flush(sc, &batch, true); 2579 if (unlikely(!rc && error)) 2580 rc = error; 2581 2582 /* 2583 * As an optimization, we don't wait for individual I/O to finish 2584 * before sending the next one. 2585 * Send them all and wait for pending send count to get to 0 2586 * that means all the I/Os have been out and we are good to return 2587 */ 2588 2589 wait_event(sc->send_io.pending.zero_wait_queue, 2590 atomic_read(&sc->send_io.pending.count) == 0 || 2591 sc->status != SMBDIRECT_SOCKET_CONNECTED); 2592 2593 if (sc->status != SMBDIRECT_SOCKET_CONNECTED && rc == 0) 2594 rc = -EAGAIN; 2595 2596 return rc; 2597} 2598 2599static void register_mr_done(struct ib_cq *cq, struct ib_wc *wc) 2600{ 2601 struct smbdirect_mr_io *mr = 2602 container_of(wc->wr_cqe, struct smbdirect_mr_io, cqe); 2603 struct smbdirect_socket *sc = mr->socket; 2604 2605 if (wc->status) { 2606 log_rdma_mr(ERR, "status=%d\n", wc->status); 2607 smbd_disconnect_rdma_connection(sc); 2608 } 2609} 2610 2611/* 2612 * The work queue function that recovers MRs 2613 * We need to call ib_dereg_mr() and ib_alloc_mr() before this MR can be used 2614 * again. Both calls are slow, so finish them in a workqueue. This will not 2615 * block I/O path. 2616 * There is one workqueue that recovers MRs, there is no need to lock as the 2617 * I/O requests calling smbd_register_mr will never update the links in the 2618 * mr_list. 2619 */ 2620static void smbd_mr_recovery_work(struct work_struct *work) 2621{ 2622 struct smbdirect_socket *sc = 2623 container_of(work, struct smbdirect_socket, mr_io.recovery_work); 2624 struct smbdirect_socket_parameters *sp = &sc->parameters; 2625 struct smbdirect_mr_io *smbdirect_mr; 2626 int rc; 2627 2628 list_for_each_entry(smbdirect_mr, &sc->mr_io.all.list, list) { 2629 if (smbdirect_mr->state == SMBDIRECT_MR_ERROR) { 2630 2631 /* recover this MR entry */ 2632 rc = ib_dereg_mr(smbdirect_mr->mr); 2633 if (rc) { 2634 log_rdma_mr(ERR, 2635 "ib_dereg_mr failed rc=%x\n", 2636 rc); 2637 smbd_disconnect_rdma_connection(sc); 2638 continue; 2639 } 2640 2641 smbdirect_mr->mr = ib_alloc_mr( 2642 sc->ib.pd, sc->mr_io.type, 2643 sp->max_frmr_depth); 2644 if (IS_ERR(smbdirect_mr->mr)) { 2645 log_rdma_mr(ERR, "ib_alloc_mr failed mr_type=%x max_frmr_depth=%x\n", 2646 sc->mr_io.type, 2647 sp->max_frmr_depth); 2648 smbd_disconnect_rdma_connection(sc); 2649 continue; 2650 } 2651 } else 2652 /* This MR is being used, don't recover it */ 2653 continue; 2654 2655 smbdirect_mr->state = SMBDIRECT_MR_READY; 2656 2657 /* smbdirect_mr->state is updated by this function 2658 * and is read and updated by I/O issuing CPUs trying 2659 * to get a MR, the call to atomic_inc_return 2660 * implicates a memory barrier and guarantees this 2661 * value is updated before waking up any calls to 2662 * get_mr() from the I/O issuing CPUs 2663 */ 2664 if (atomic_inc_return(&sc->mr_io.ready.count) == 1) 2665 wake_up(&sc->mr_io.ready.wait_queue); 2666 } 2667} 2668 2669static void smbd_mr_disable_locked(struct smbdirect_mr_io *mr) 2670{ 2671 struct smbdirect_socket *sc = mr->socket; 2672 2673 lockdep_assert_held(&mr->mutex); 2674 2675 if (mr->state == SMBDIRECT_MR_DISABLED) 2676 return; 2677 2678 if (mr->mr) 2679 ib_dereg_mr(mr->mr); 2680 if (mr->sgt.nents) 2681 ib_dma_unmap_sg(sc->ib.dev, mr->sgt.sgl, mr->sgt.nents, mr->dir); 2682 kfree(mr->sgt.sgl); 2683 2684 mr->mr = NULL; 2685 mr->sgt.sgl = NULL; 2686 mr->sgt.nents = 0; 2687 2688 mr->state = SMBDIRECT_MR_DISABLED; 2689} 2690 2691static void smbd_mr_free_locked(struct kref *kref) 2692{ 2693 struct smbdirect_mr_io *mr = 2694 container_of(kref, struct smbdirect_mr_io, kref); 2695 2696 lockdep_assert_held(&mr->mutex); 2697 2698 /* 2699 * smbd_mr_disable_locked() should already be called! 2700 */ 2701 if (WARN_ON_ONCE(mr->state != SMBDIRECT_MR_DISABLED)) 2702 smbd_mr_disable_locked(mr); 2703 2704 mutex_unlock(&mr->mutex); 2705 mutex_destroy(&mr->mutex); 2706 kfree(mr); 2707} 2708 2709static void destroy_mr_list(struct smbdirect_socket *sc) 2710{ 2711 struct smbdirect_mr_io *mr, *tmp; 2712 LIST_HEAD(all_list); 2713 unsigned long flags; 2714 2715 disable_work_sync(&sc->mr_io.recovery_work); 2716 2717 spin_lock_irqsave(&sc->mr_io.all.lock, flags); 2718 list_splice_tail_init(&sc->mr_io.all.list, &all_list); 2719 spin_unlock_irqrestore(&sc->mr_io.all.lock, flags); 2720 2721 list_for_each_entry_safe(mr, tmp, &all_list, list) { 2722 mutex_lock(&mr->mutex); 2723 2724 smbd_mr_disable_locked(mr); 2725 list_del(&mr->list); 2726 mr->socket = NULL; 2727 2728 /* 2729 * No kref_put_mutex() as it's already locked. 2730 * 2731 * If smbd_mr_free_locked() is called 2732 * and the mutex is unlocked and mr is gone, 2733 * in that case kref_put() returned 1. 2734 * 2735 * If kref_put() returned 0 we know that 2736 * smbd_mr_free_locked() didn't 2737 * run. Not by us nor by anyone else, as we 2738 * still hold the mutex, so we need to unlock. 2739 * 2740 * If the mr is still registered it will 2741 * be dangling (detached from the connection 2742 * waiting for smbd_deregister_mr() to be 2743 * called in order to free the memory. 2744 */ 2745 if (!kref_put(&mr->kref, smbd_mr_free_locked)) 2746 mutex_unlock(&mr->mutex); 2747 } 2748} 2749 2750/* 2751 * Allocate MRs used for RDMA read/write 2752 * The number of MRs will not exceed hardware capability in responder_resources 2753 * All MRs are kept in mr_list. The MR can be recovered after it's used 2754 * Recovery is done in smbd_mr_recovery_work. The content of list entry changes 2755 * as MRs are used and recovered for I/O, but the list links will not change 2756 */ 2757static int allocate_mr_list(struct smbdirect_socket *sc) 2758{ 2759 struct smbdirect_socket_parameters *sp = &sc->parameters; 2760 struct smbdirect_mr_io *mr; 2761 int ret; 2762 u32 i; 2763 2764 if (sp->responder_resources == 0) { 2765 log_rdma_mr(ERR, "responder_resources negotiated as 0\n"); 2766 return -EINVAL; 2767 } 2768 2769 /* Allocate more MRs (2x) than hardware responder_resources */ 2770 for (i = 0; i < sp->responder_resources * 2; i++) { 2771 mr = kzalloc(sizeof(*mr), GFP_KERNEL); 2772 if (!mr) { 2773 ret = -ENOMEM; 2774 goto kzalloc_mr_failed; 2775 } 2776 2777 kref_init(&mr->kref); 2778 mutex_init(&mr->mutex); 2779 2780 mr->mr = ib_alloc_mr(sc->ib.pd, 2781 sc->mr_io.type, 2782 sp->max_frmr_depth); 2783 if (IS_ERR(mr->mr)) { 2784 ret = PTR_ERR(mr->mr); 2785 log_rdma_mr(ERR, "ib_alloc_mr failed mr_type=%x max_frmr_depth=%x\n", 2786 sc->mr_io.type, sp->max_frmr_depth); 2787 goto ib_alloc_mr_failed; 2788 } 2789 2790 mr->sgt.sgl = kcalloc(sp->max_frmr_depth, 2791 sizeof(struct scatterlist), 2792 GFP_KERNEL); 2793 if (!mr->sgt.sgl) { 2794 ret = -ENOMEM; 2795 log_rdma_mr(ERR, "failed to allocate sgl\n"); 2796 goto kcalloc_sgl_failed; 2797 } 2798 mr->state = SMBDIRECT_MR_READY; 2799 mr->socket = sc; 2800 2801 list_add_tail(&mr->list, &sc->mr_io.all.list); 2802 atomic_inc(&sc->mr_io.ready.count); 2803 } 2804 2805 INIT_WORK(&sc->mr_io.recovery_work, smbd_mr_recovery_work); 2806 2807 return 0; 2808 2809kcalloc_sgl_failed: 2810 ib_dereg_mr(mr->mr); 2811ib_alloc_mr_failed: 2812 mutex_destroy(&mr->mutex); 2813 kfree(mr); 2814kzalloc_mr_failed: 2815 destroy_mr_list(sc); 2816 return ret; 2817} 2818 2819/* 2820 * Get a MR from mr_list. This function waits until there is at least one 2821 * MR available in the list. It may access the list while the 2822 * smbd_mr_recovery_work is recovering the MR list. This doesn't need a lock 2823 * as they never modify the same places. However, there may be several CPUs 2824 * issuing I/O trying to get MR at the same time, mr_list_lock is used to 2825 * protect this situation. 2826 */ 2827static struct smbdirect_mr_io *get_mr(struct smbdirect_socket *sc) 2828{ 2829 struct smbdirect_mr_io *ret; 2830 unsigned long flags; 2831 int rc; 2832again: 2833 rc = wait_event_interruptible(sc->mr_io.ready.wait_queue, 2834 atomic_read(&sc->mr_io.ready.count) || 2835 sc->status != SMBDIRECT_SOCKET_CONNECTED); 2836 if (rc) { 2837 log_rdma_mr(ERR, "wait_event_interruptible rc=%x\n", rc); 2838 return NULL; 2839 } 2840 2841 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { 2842 log_rdma_mr(ERR, "sc->status=%x\n", sc->status); 2843 return NULL; 2844 } 2845 2846 spin_lock_irqsave(&sc->mr_io.all.lock, flags); 2847 list_for_each_entry(ret, &sc->mr_io.all.list, list) { 2848 if (ret->state == SMBDIRECT_MR_READY) { 2849 ret->state = SMBDIRECT_MR_REGISTERED; 2850 kref_get(&ret->kref); 2851 spin_unlock_irqrestore(&sc->mr_io.all.lock, flags); 2852 atomic_dec(&sc->mr_io.ready.count); 2853 atomic_inc(&sc->mr_io.used.count); 2854 return ret; 2855 } 2856 } 2857 2858 spin_unlock_irqrestore(&sc->mr_io.all.lock, flags); 2859 /* 2860 * It is possible that we could fail to get MR because other processes may 2861 * try to acquire a MR at the same time. If this is the case, retry it. 2862 */ 2863 goto again; 2864} 2865 2866/* 2867 * Transcribe the pages from an iterator into an MR scatterlist. 2868 */ 2869static int smbd_iter_to_mr(struct iov_iter *iter, 2870 struct sg_table *sgt, 2871 unsigned int max_sg) 2872{ 2873 int ret; 2874 2875 memset(sgt->sgl, 0, max_sg * sizeof(struct scatterlist)); 2876 2877 ret = extract_iter_to_sg(iter, iov_iter_count(iter), sgt, max_sg, 0); 2878 WARN_ON(ret < 0); 2879 if (sgt->nents > 0) 2880 sg_mark_end(&sgt->sgl[sgt->nents - 1]); 2881 return ret; 2882} 2883 2884/* 2885 * Register memory for RDMA read/write 2886 * iter: the buffer to register memory with 2887 * writing: true if this is a RDMA write (SMB read), false for RDMA read 2888 * need_invalidate: true if this MR needs to be locally invalidated after I/O 2889 * return value: the MR registered, NULL if failed. 2890 */ 2891struct smbdirect_mr_io *smbd_register_mr(struct smbd_connection *info, 2892 struct iov_iter *iter, 2893 bool writing, bool need_invalidate) 2894{ 2895 struct smbdirect_socket *sc = &info->socket; 2896 struct smbdirect_socket_parameters *sp = &sc->parameters; 2897 struct smbdirect_mr_io *mr; 2898 int rc, num_pages; 2899 struct ib_reg_wr *reg_wr; 2900 2901 num_pages = iov_iter_npages(iter, sp->max_frmr_depth + 1); 2902 if (num_pages > sp->max_frmr_depth) { 2903 log_rdma_mr(ERR, "num_pages=%d max_frmr_depth=%d\n", 2904 num_pages, sp->max_frmr_depth); 2905 WARN_ON_ONCE(1); 2906 return NULL; 2907 } 2908 2909 mr = get_mr(sc); 2910 if (!mr) { 2911 log_rdma_mr(ERR, "get_mr returning NULL\n"); 2912 return NULL; 2913 } 2914 2915 mutex_lock(&mr->mutex); 2916 2917 mr->dir = writing ? DMA_FROM_DEVICE : DMA_TO_DEVICE; 2918 mr->need_invalidate = need_invalidate; 2919 mr->sgt.nents = 0; 2920 mr->sgt.orig_nents = 0; 2921 2922 log_rdma_mr(INFO, "num_pages=0x%x count=0x%zx depth=%u\n", 2923 num_pages, iov_iter_count(iter), sp->max_frmr_depth); 2924 smbd_iter_to_mr(iter, &mr->sgt, sp->max_frmr_depth); 2925 2926 rc = ib_dma_map_sg(sc->ib.dev, mr->sgt.sgl, mr->sgt.nents, mr->dir); 2927 if (!rc) { 2928 log_rdma_mr(ERR, "ib_dma_map_sg num_pages=%x dir=%x rc=%x\n", 2929 num_pages, mr->dir, rc); 2930 goto dma_map_error; 2931 } 2932 2933 rc = ib_map_mr_sg(mr->mr, mr->sgt.sgl, mr->sgt.nents, NULL, PAGE_SIZE); 2934 if (rc != mr->sgt.nents) { 2935 log_rdma_mr(ERR, 2936 "ib_map_mr_sg failed rc = %d nents = %x\n", 2937 rc, mr->sgt.nents); 2938 goto map_mr_error; 2939 } 2940 2941 ib_update_fast_reg_key(mr->mr, ib_inc_rkey(mr->mr->rkey)); 2942 reg_wr = &mr->wr; 2943 reg_wr->wr.opcode = IB_WR_REG_MR; 2944 mr->cqe.done = register_mr_done; 2945 reg_wr->wr.wr_cqe = &mr->cqe; 2946 reg_wr->wr.num_sge = 0; 2947 reg_wr->wr.send_flags = IB_SEND_SIGNALED; 2948 reg_wr->mr = mr->mr; 2949 reg_wr->key = mr->mr->rkey; 2950 reg_wr->access = writing ? 2951 IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE : 2952 IB_ACCESS_REMOTE_READ; 2953 2954 /* 2955 * There is no need for waiting for complemtion on ib_post_send 2956 * on IB_WR_REG_MR. Hardware enforces a barrier and order of execution 2957 * on the next ib_post_send when we actually send I/O to remote peer 2958 */ 2959 rc = ib_post_send(sc->ib.qp, ®_wr->wr, NULL); 2960 if (!rc) { 2961 /* 2962 * get_mr() gave us a reference 2963 * via kref_get(&mr->kref), we keep that and let 2964 * the caller use smbd_deregister_mr() 2965 * to remove it again. 2966 */ 2967 mutex_unlock(&mr->mutex); 2968 return mr; 2969 } 2970 2971 log_rdma_mr(ERR, "ib_post_send failed rc=%x reg_wr->key=%x\n", 2972 rc, reg_wr->key); 2973 2974 /* If all failed, attempt to recover this MR by setting it SMBDIRECT_MR_ERROR*/ 2975map_mr_error: 2976 ib_dma_unmap_sg(sc->ib.dev, mr->sgt.sgl, mr->sgt.nents, mr->dir); 2977 2978dma_map_error: 2979 mr->sgt.nents = 0; 2980 mr->state = SMBDIRECT_MR_ERROR; 2981 if (atomic_dec_and_test(&sc->mr_io.used.count)) 2982 wake_up(&sc->mr_io.cleanup.wait_queue); 2983 2984 smbd_disconnect_rdma_connection(sc); 2985 2986 /* 2987 * get_mr() gave us a reference 2988 * via kref_get(&mr->kref), we need to remove it again 2989 * on error. 2990 * 2991 * No kref_put_mutex() as it's already locked. 2992 * 2993 * If smbd_mr_free_locked() is called 2994 * and the mutex is unlocked and mr is gone, 2995 * in that case kref_put() returned 1. 2996 * 2997 * If kref_put() returned 0 we know that 2998 * smbd_mr_free_locked() didn't 2999 * run. Not by us nor by anyone else, as we 3000 * still hold the mutex, so we need to unlock. 3001 */ 3002 if (!kref_put(&mr->kref, smbd_mr_free_locked)) 3003 mutex_unlock(&mr->mutex); 3004 3005 return NULL; 3006} 3007 3008static void local_inv_done(struct ib_cq *cq, struct ib_wc *wc) 3009{ 3010 struct smbdirect_mr_io *smbdirect_mr; 3011 struct ib_cqe *cqe; 3012 3013 cqe = wc->wr_cqe; 3014 smbdirect_mr = container_of(cqe, struct smbdirect_mr_io, cqe); 3015 smbdirect_mr->state = SMBDIRECT_MR_INVALIDATED; 3016 if (wc->status != IB_WC_SUCCESS) { 3017 log_rdma_mr(ERR, "invalidate failed status=%x\n", wc->status); 3018 smbdirect_mr->state = SMBDIRECT_MR_ERROR; 3019 } 3020 complete(&smbdirect_mr->invalidate_done); 3021} 3022 3023/* 3024 * Deregister a MR after I/O is done 3025 * This function may wait if remote invalidation is not used 3026 * and we have to locally invalidate the buffer to prevent data is being 3027 * modified by remote peer after upper layer consumes it 3028 */ 3029void smbd_deregister_mr(struct smbdirect_mr_io *mr) 3030{ 3031 struct smbdirect_socket *sc = mr->socket; 3032 3033 mutex_lock(&mr->mutex); 3034 if (mr->state == SMBDIRECT_MR_DISABLED) 3035 goto put_kref; 3036 3037 if (sc->status != SMBDIRECT_SOCKET_CONNECTED) { 3038 smbd_mr_disable_locked(mr); 3039 goto put_kref; 3040 } 3041 3042 if (mr->need_invalidate) { 3043 struct ib_send_wr *wr = &mr->inv_wr; 3044 int rc; 3045 3046 /* Need to finish local invalidation before returning */ 3047 wr->opcode = IB_WR_LOCAL_INV; 3048 mr->cqe.done = local_inv_done; 3049 wr->wr_cqe = &mr->cqe; 3050 wr->num_sge = 0; 3051 wr->ex.invalidate_rkey = mr->mr->rkey; 3052 wr->send_flags = IB_SEND_SIGNALED; 3053 3054 init_completion(&mr->invalidate_done); 3055 rc = ib_post_send(sc->ib.qp, wr, NULL); 3056 if (rc) { 3057 log_rdma_mr(ERR, "ib_post_send failed rc=%x\n", rc); 3058 smbd_mr_disable_locked(mr); 3059 smbd_disconnect_rdma_connection(sc); 3060 goto done; 3061 } 3062 wait_for_completion(&mr->invalidate_done); 3063 mr->need_invalidate = false; 3064 } else 3065 /* 3066 * For remote invalidation, just set it to SMBDIRECT_MR_INVALIDATED 3067 * and defer to mr_recovery_work to recover the MR for next use 3068 */ 3069 mr->state = SMBDIRECT_MR_INVALIDATED; 3070 3071 if (mr->sgt.nents) { 3072 ib_dma_unmap_sg(sc->ib.dev, mr->sgt.sgl, mr->sgt.nents, mr->dir); 3073 mr->sgt.nents = 0; 3074 } 3075 3076 if (mr->state == SMBDIRECT_MR_INVALIDATED) { 3077 mr->state = SMBDIRECT_MR_READY; 3078 if (atomic_inc_return(&sc->mr_io.ready.count) == 1) 3079 wake_up(&sc->mr_io.ready.wait_queue); 3080 } else 3081 /* 3082 * Schedule the work to do MR recovery for future I/Os MR 3083 * recovery is slow and don't want it to block current I/O 3084 */ 3085 queue_work(sc->workqueue, &sc->mr_io.recovery_work); 3086 3087done: 3088 if (atomic_dec_and_test(&sc->mr_io.used.count)) 3089 wake_up(&sc->mr_io.cleanup.wait_queue); 3090 3091put_kref: 3092 /* 3093 * No kref_put_mutex() as it's already locked. 3094 * 3095 * If smbd_mr_free_locked() is called 3096 * and the mutex is unlocked and mr is gone, 3097 * in that case kref_put() returned 1. 3098 * 3099 * If kref_put() returned 0 we know that 3100 * smbd_mr_free_locked() didn't 3101 * run. Not by us nor by anyone else, as we 3102 * still hold the mutex, so we need to unlock 3103 * and keep the mr in SMBDIRECT_MR_READY or 3104 * SMBDIRECT_MR_ERROR state. 3105 */ 3106 if (!kref_put(&mr->kref, smbd_mr_free_locked)) 3107 mutex_unlock(&mr->mutex); 3108} 3109 3110static bool smb_set_sge(struct smb_extract_to_rdma *rdma, 3111 struct page *lowest_page, size_t off, size_t len) 3112{ 3113 struct ib_sge *sge = &rdma->sge[rdma->nr_sge]; 3114 u64 addr; 3115 3116 addr = ib_dma_map_page(rdma->device, lowest_page, 3117 off, len, rdma->direction); 3118 if (ib_dma_mapping_error(rdma->device, addr)) 3119 return false; 3120 3121 sge->addr = addr; 3122 sge->length = len; 3123 sge->lkey = rdma->local_dma_lkey; 3124 rdma->nr_sge++; 3125 return true; 3126} 3127 3128/* 3129 * Extract page fragments from a BVEC-class iterator and add them to an RDMA 3130 * element list. The pages are not pinned. 3131 */ 3132static ssize_t smb_extract_bvec_to_rdma(struct iov_iter *iter, 3133 struct smb_extract_to_rdma *rdma, 3134 ssize_t maxsize) 3135{ 3136 const struct bio_vec *bv = iter->bvec; 3137 unsigned long start = iter->iov_offset; 3138 unsigned int i; 3139 ssize_t ret = 0; 3140 3141 for (i = 0; i < iter->nr_segs; i++) { 3142 size_t off, len; 3143 3144 len = bv[i].bv_len; 3145 if (start >= len) { 3146 start -= len; 3147 continue; 3148 } 3149 3150 len = min_t(size_t, maxsize, len - start); 3151 off = bv[i].bv_offset + start; 3152 3153 if (!smb_set_sge(rdma, bv[i].bv_page, off, len)) 3154 return -EIO; 3155 3156 ret += len; 3157 maxsize -= len; 3158 if (rdma->nr_sge >= rdma->max_sge || maxsize <= 0) 3159 break; 3160 start = 0; 3161 } 3162 3163 if (ret > 0) 3164 iov_iter_advance(iter, ret); 3165 return ret; 3166} 3167 3168/* 3169 * Extract fragments from a KVEC-class iterator and add them to an RDMA list. 3170 * This can deal with vmalloc'd buffers as well as kmalloc'd or static buffers. 3171 * The pages are not pinned. 3172 */ 3173static ssize_t smb_extract_kvec_to_rdma(struct iov_iter *iter, 3174 struct smb_extract_to_rdma *rdma, 3175 ssize_t maxsize) 3176{ 3177 const struct kvec *kv = iter->kvec; 3178 unsigned long start = iter->iov_offset; 3179 unsigned int i; 3180 ssize_t ret = 0; 3181 3182 for (i = 0; i < iter->nr_segs; i++) { 3183 struct page *page; 3184 unsigned long kaddr; 3185 size_t off, len, seg; 3186 3187 len = kv[i].iov_len; 3188 if (start >= len) { 3189 start -= len; 3190 continue; 3191 } 3192 3193 kaddr = (unsigned long)kv[i].iov_base + start; 3194 off = kaddr & ~PAGE_MASK; 3195 len = min_t(size_t, maxsize, len - start); 3196 kaddr &= PAGE_MASK; 3197 3198 maxsize -= len; 3199 do { 3200 seg = min_t(size_t, len, PAGE_SIZE - off); 3201 3202 if (is_vmalloc_or_module_addr((void *)kaddr)) 3203 page = vmalloc_to_page((void *)kaddr); 3204 else 3205 page = virt_to_page((void *)kaddr); 3206 3207 if (!smb_set_sge(rdma, page, off, seg)) 3208 return -EIO; 3209 3210 ret += seg; 3211 len -= seg; 3212 kaddr += PAGE_SIZE; 3213 off = 0; 3214 } while (len > 0 && rdma->nr_sge < rdma->max_sge); 3215 3216 if (rdma->nr_sge >= rdma->max_sge || maxsize <= 0) 3217 break; 3218 start = 0; 3219 } 3220 3221 if (ret > 0) 3222 iov_iter_advance(iter, ret); 3223 return ret; 3224} 3225 3226/* 3227 * Extract folio fragments from a FOLIOQ-class iterator and add them to an RDMA 3228 * list. The folios are not pinned. 3229 */ 3230static ssize_t smb_extract_folioq_to_rdma(struct iov_iter *iter, 3231 struct smb_extract_to_rdma *rdma, 3232 ssize_t maxsize) 3233{ 3234 const struct folio_queue *folioq = iter->folioq; 3235 unsigned int slot = iter->folioq_slot; 3236 ssize_t ret = 0; 3237 size_t offset = iter->iov_offset; 3238 3239 BUG_ON(!folioq); 3240 3241 if (slot >= folioq_nr_slots(folioq)) { 3242 folioq = folioq->next; 3243 if (WARN_ON_ONCE(!folioq)) 3244 return -EIO; 3245 slot = 0; 3246 } 3247 3248 do { 3249 struct folio *folio = folioq_folio(folioq, slot); 3250 size_t fsize = folioq_folio_size(folioq, slot); 3251 3252 if (offset < fsize) { 3253 size_t part = umin(maxsize, fsize - offset); 3254 3255 if (!smb_set_sge(rdma, folio_page(folio, 0), offset, part)) 3256 return -EIO; 3257 3258 offset += part; 3259 ret += part; 3260 maxsize -= part; 3261 } 3262 3263 if (offset >= fsize) { 3264 offset = 0; 3265 slot++; 3266 if (slot >= folioq_nr_slots(folioq)) { 3267 if (!folioq->next) { 3268 WARN_ON_ONCE(ret < iter->count); 3269 break; 3270 } 3271 folioq = folioq->next; 3272 slot = 0; 3273 } 3274 } 3275 } while (rdma->nr_sge < rdma->max_sge && maxsize > 0); 3276 3277 iter->folioq = folioq; 3278 iter->folioq_slot = slot; 3279 iter->iov_offset = offset; 3280 iter->count -= ret; 3281 return ret; 3282} 3283 3284/* 3285 * Extract page fragments from up to the given amount of the source iterator 3286 * and build up an RDMA list that refers to all of those bits. The RDMA list 3287 * is appended to, up to the maximum number of elements set in the parameter 3288 * block. 3289 * 3290 * The extracted page fragments are not pinned or ref'd in any way; if an 3291 * IOVEC/UBUF-type iterator is to be used, it should be converted to a 3292 * BVEC-type iterator and the pages pinned, ref'd or otherwise held in some 3293 * way. 3294 */ 3295static ssize_t smb_extract_iter_to_rdma(struct iov_iter *iter, size_t len, 3296 struct smb_extract_to_rdma *rdma) 3297{ 3298 ssize_t ret; 3299 int before = rdma->nr_sge; 3300 3301 switch (iov_iter_type(iter)) { 3302 case ITER_BVEC: 3303 ret = smb_extract_bvec_to_rdma(iter, rdma, len); 3304 break; 3305 case ITER_KVEC: 3306 ret = smb_extract_kvec_to_rdma(iter, rdma, len); 3307 break; 3308 case ITER_FOLIOQ: 3309 ret = smb_extract_folioq_to_rdma(iter, rdma, len); 3310 break; 3311 default: 3312 WARN_ON_ONCE(1); 3313 return -EIO; 3314 } 3315 3316 if (ret < 0) { 3317 while (rdma->nr_sge > before) { 3318 struct ib_sge *sge = &rdma->sge[rdma->nr_sge--]; 3319 3320 ib_dma_unmap_single(rdma->device, sge->addr, sge->length, 3321 rdma->direction); 3322 sge->addr = 0; 3323 } 3324 } 3325 3326 return ret; 3327}
~/
Read-only file preview.