aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/isert/ib_isert.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-11-07 16:33:07 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-11-07 16:33:07 -0500
commitab9f2faf8f40604551336e5b0a18e0910a57b92c (patch)
tree9068c73acf24452762d6e2b096df19e29436183e /drivers/infiniband/ulp/isert/ib_isert.c
parent75021d28594d9b6fb4d05bbc41f77948a0db0e02 (diff)
parentdb7489e07669073970358b6cacf6a9dd8dc9275e (diff)
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
Pull rdma updates from Doug Ledford: "This is my initial round of 4.4 merge window patches. There are a few other things I wish to get in for 4.4 that aren't in this pull, as this represents what has gone through merge/build/run testing and not what is the last few items for which testing is not yet complete. - "Checksum offload support in user space" enablement - Misc cxgb4 fixes, add T6 support - Misc usnic fixes - 32 bit build warning fixes - Misc ocrdma fixes - Multicast loopback prevention extension - Extend the GID cache to store and return attributes of GIDs - Misc iSER updates - iSER clustering update - Network NameSpace support for rdma CM - Work Request cleanup series - New Memory Registration API" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (76 commits) IB/core, cma: Make __attribute_const__ declarations sparse-friendly IB/core: Remove old fast registration API IB/ipath: Remove fast registration from the code IB/hfi1: Remove fast registration from the code RDMA/nes: Remove old FRWR API IB/qib: Remove old FRWR API iw_cxgb4: Remove old FRWR API RDMA/cxgb3: Remove old FRWR API RDMA/ocrdma: Remove old FRWR API IB/mlx4: Remove old FRWR API support IB/mlx5: Remove old FRWR API support IB/srp: Dont allocate a page vector when using fast_reg IB/srp: Remove srp_finish_mapping IB/srp: Convert to new registration API IB/srp: Split srp_map_sg RDS/IW: Convert to new memory registration API svcrdma: Port to new memory registration API xprtrdma: Port to new memory registration API iser-target: Port to new memory registration API IB/iser: Port to new fast registration API ...
Diffstat (limited to 'drivers/infiniband/ulp/isert/ib_isert.c')
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c269
1 files changed, 97 insertions, 172 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index aa59037d7504..dfbbbb28090b 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -473,10 +473,8 @@ isert_conn_free_fastreg_pool(struct isert_conn *isert_conn)
473 list_for_each_entry_safe(fr_desc, tmp, 473 list_for_each_entry_safe(fr_desc, tmp,
474 &isert_conn->fr_pool, list) { 474 &isert_conn->fr_pool, list) {
475 list_del(&fr_desc->list); 475 list_del(&fr_desc->list);
476 ib_free_fast_reg_page_list(fr_desc->data_frpl);
477 ib_dereg_mr(fr_desc->data_mr); 476 ib_dereg_mr(fr_desc->data_mr);
478 if (fr_desc->pi_ctx) { 477 if (fr_desc->pi_ctx) {
479 ib_free_fast_reg_page_list(fr_desc->pi_ctx->prot_frpl);
480 ib_dereg_mr(fr_desc->pi_ctx->prot_mr); 478 ib_dereg_mr(fr_desc->pi_ctx->prot_mr);
481 ib_dereg_mr(fr_desc->pi_ctx->sig_mr); 479 ib_dereg_mr(fr_desc->pi_ctx->sig_mr);
482 kfree(fr_desc->pi_ctx); 480 kfree(fr_desc->pi_ctx);
@@ -504,22 +502,13 @@ isert_create_pi_ctx(struct fast_reg_descriptor *desc,
504 return -ENOMEM; 502 return -ENOMEM;
505 } 503 }
506 504
507 pi_ctx->prot_frpl = ib_alloc_fast_reg_page_list(device,
508 ISCSI_ISER_SG_TABLESIZE);
509 if (IS_ERR(pi_ctx->prot_frpl)) {
510 isert_err("Failed to allocate prot frpl err=%ld\n",
511 PTR_ERR(pi_ctx->prot_frpl));
512 ret = PTR_ERR(pi_ctx->prot_frpl);
513 goto err_pi_ctx;
514 }
515
516 pi_ctx->prot_mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG, 505 pi_ctx->prot_mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG,
517 ISCSI_ISER_SG_TABLESIZE); 506 ISCSI_ISER_SG_TABLESIZE);
518 if (IS_ERR(pi_ctx->prot_mr)) { 507 if (IS_ERR(pi_ctx->prot_mr)) {
519 isert_err("Failed to allocate prot frmr err=%ld\n", 508 isert_err("Failed to allocate prot frmr err=%ld\n",
520 PTR_ERR(pi_ctx->prot_mr)); 509 PTR_ERR(pi_ctx->prot_mr));
521 ret = PTR_ERR(pi_ctx->prot_mr); 510 ret = PTR_ERR(pi_ctx->prot_mr);
522 goto err_prot_frpl; 511 goto err_pi_ctx;
523 } 512 }
524 desc->ind |= ISERT_PROT_KEY_VALID; 513 desc->ind |= ISERT_PROT_KEY_VALID;
525 514
@@ -539,8 +528,6 @@ isert_create_pi_ctx(struct fast_reg_descriptor *desc,
539 528
540err_prot_mr: 529err_prot_mr:
541 ib_dereg_mr(pi_ctx->prot_mr); 530 ib_dereg_mr(pi_ctx->prot_mr);
542err_prot_frpl:
543 ib_free_fast_reg_page_list(pi_ctx->prot_frpl);
544err_pi_ctx: 531err_pi_ctx:
545 kfree(pi_ctx); 532 kfree(pi_ctx);
546 533
@@ -551,34 +538,18 @@ static int
551isert_create_fr_desc(struct ib_device *ib_device, struct ib_pd *pd, 538isert_create_fr_desc(struct ib_device *ib_device, struct ib_pd *pd,
552 struct fast_reg_descriptor *fr_desc) 539 struct fast_reg_descriptor *fr_desc)
553{ 540{
554 int ret;
555
556 fr_desc->data_frpl = ib_alloc_fast_reg_page_list(ib_device,
557 ISCSI_ISER_SG_TABLESIZE);
558 if (IS_ERR(fr_desc->data_frpl)) {
559 isert_err("Failed to allocate data frpl err=%ld\n",
560 PTR_ERR(fr_desc->data_frpl));
561 return PTR_ERR(fr_desc->data_frpl);
562 }
563
564 fr_desc->data_mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG, 541 fr_desc->data_mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG,
565 ISCSI_ISER_SG_TABLESIZE); 542 ISCSI_ISER_SG_TABLESIZE);
566 if (IS_ERR(fr_desc->data_mr)) { 543 if (IS_ERR(fr_desc->data_mr)) {
567 isert_err("Failed to allocate data frmr err=%ld\n", 544 isert_err("Failed to allocate data frmr err=%ld\n",
568 PTR_ERR(fr_desc->data_mr)); 545 PTR_ERR(fr_desc->data_mr));
569 ret = PTR_ERR(fr_desc->data_mr); 546 return PTR_ERR(fr_desc->data_mr);
570 goto err_data_frpl;
571 } 547 }
572 fr_desc->ind |= ISERT_DATA_KEY_VALID; 548 fr_desc->ind |= ISERT_DATA_KEY_VALID;
573 549
574 isert_dbg("Created fr_desc %p\n", fr_desc); 550 isert_dbg("Created fr_desc %p\n", fr_desc);
575 551
576 return 0; 552 return 0;
577
578err_data_frpl:
579 ib_free_fast_reg_page_list(fr_desc->data_frpl);
580
581 return ret;
582} 553}
583 554
584static int 555static int
@@ -1579,7 +1550,6 @@ isert_rx_do_work(struct iser_rx_desc *rx_desc, struct isert_conn *isert_conn)
1579 struct iser_hdr *iser_hdr = &rx_desc->iser_header; 1550 struct iser_hdr *iser_hdr = &rx_desc->iser_header;
1580 uint64_t read_va = 0, write_va = 0; 1551 uint64_t read_va = 0, write_va = 0;
1581 uint32_t read_stag = 0, write_stag = 0; 1552 uint32_t read_stag = 0, write_stag = 0;
1582 int rc;
1583 1553
1584 switch (iser_hdr->flags & 0xF0) { 1554 switch (iser_hdr->flags & 0xF0) {
1585 case ISCSI_CTRL: 1555 case ISCSI_CTRL:
@@ -1606,8 +1576,8 @@ isert_rx_do_work(struct iser_rx_desc *rx_desc, struct isert_conn *isert_conn)
1606 break; 1576 break;
1607 } 1577 }
1608 1578
1609 rc = isert_rx_opcode(isert_conn, rx_desc, 1579 isert_rx_opcode(isert_conn, rx_desc,
1610 read_stag, read_va, write_stag, write_va); 1580 read_stag, read_va, write_stag, write_va);
1611} 1581}
1612 1582
1613static void 1583static void
@@ -1716,10 +1686,10 @@ isert_unmap_cmd(struct isert_cmd *isert_cmd, struct isert_conn *isert_conn)
1716 isert_unmap_data_buf(isert_conn, &wr->data); 1686 isert_unmap_data_buf(isert_conn, &wr->data);
1717 } 1687 }
1718 1688
1719 if (wr->send_wr) { 1689 if (wr->rdma_wr) {
1720 isert_dbg("Cmd %p free send_wr\n", isert_cmd); 1690 isert_dbg("Cmd %p free send_wr\n", isert_cmd);
1721 kfree(wr->send_wr); 1691 kfree(wr->rdma_wr);
1722 wr->send_wr = NULL; 1692 wr->rdma_wr = NULL;
1723 } 1693 }
1724 1694
1725 if (wr->ib_sge) { 1695 if (wr->ib_sge) {
@@ -1754,7 +1724,7 @@ isert_unreg_rdma(struct isert_cmd *isert_cmd, struct isert_conn *isert_conn)
1754 } 1724 }
1755 1725
1756 wr->ib_sge = NULL; 1726 wr->ib_sge = NULL;
1757 wr->send_wr = NULL; 1727 wr->rdma_wr = NULL;
1758} 1728}
1759 1729
1760static void 1730static void
@@ -1923,7 +1893,7 @@ isert_completion_rdma_write(struct iser_tx_desc *tx_desc,
1923 } 1893 }
1924 1894
1925 device->unreg_rdma_mem(isert_cmd, isert_conn); 1895 device->unreg_rdma_mem(isert_cmd, isert_conn);
1926 wr->send_wr_num = 0; 1896 wr->rdma_wr_num = 0;
1927 if (ret) 1897 if (ret)
1928 transport_send_check_condition_and_sense(se_cmd, 1898 transport_send_check_condition_and_sense(se_cmd,
1929 se_cmd->pi_err, 0); 1899 se_cmd->pi_err, 0);
@@ -1951,7 +1921,7 @@ isert_completion_rdma_read(struct iser_tx_desc *tx_desc,
1951 iscsit_stop_dataout_timer(cmd); 1921 iscsit_stop_dataout_timer(cmd);
1952 device->unreg_rdma_mem(isert_cmd, isert_conn); 1922 device->unreg_rdma_mem(isert_cmd, isert_conn);
1953 cmd->write_data_done = wr->data.len; 1923 cmd->write_data_done = wr->data.len;
1954 wr->send_wr_num = 0; 1924 wr->rdma_wr_num = 0;
1955 1925
1956 isert_dbg("Cmd: %p RDMA_READ comp calling execute_cmd\n", isert_cmd); 1926 isert_dbg("Cmd: %p RDMA_READ comp calling execute_cmd\n", isert_cmd);
1957 spin_lock_bh(&cmd->istate_lock); 1927 spin_lock_bh(&cmd->istate_lock);
@@ -2403,7 +2373,7 @@ isert_put_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
2403 2373
2404static int 2374static int
2405isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, 2375isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
2406 struct ib_sge *ib_sge, struct ib_send_wr *send_wr, 2376 struct ib_sge *ib_sge, struct ib_rdma_wr *rdma_wr,
2407 u32 data_left, u32 offset) 2377 u32 data_left, u32 offset)
2408{ 2378{
2409 struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd; 2379 struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd;
@@ -2418,8 +2388,8 @@ isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
2418 sg_nents = min(cmd->se_cmd.t_data_nents - sg_off, isert_conn->max_sge); 2388 sg_nents = min(cmd->se_cmd.t_data_nents - sg_off, isert_conn->max_sge);
2419 page_off = offset % PAGE_SIZE; 2389 page_off = offset % PAGE_SIZE;
2420 2390
2421 send_wr->sg_list = ib_sge; 2391 rdma_wr->wr.sg_list = ib_sge;
2422 send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc; 2392 rdma_wr->wr.wr_id = (uintptr_t)&isert_cmd->tx_desc;
2423 /* 2393 /*
2424 * Perform mapping of TCM scatterlist memory ib_sge dma_addr. 2394 * Perform mapping of TCM scatterlist memory ib_sge dma_addr.
2425 */ 2395 */
@@ -2444,11 +2414,11 @@ isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
2444 isert_dbg("Incrementing ib_sge pointer to %p\n", ib_sge); 2414 isert_dbg("Incrementing ib_sge pointer to %p\n", ib_sge);
2445 } 2415 }
2446 2416
2447 send_wr->num_sge = ++i; 2417 rdma_wr->wr.num_sge = ++i;
2448 isert_dbg("Set outgoing sg_list: %p num_sg: %u from TCM SGLs\n", 2418 isert_dbg("Set outgoing sg_list: %p num_sg: %u from TCM SGLs\n",
2449 send_wr->sg_list, send_wr->num_sge); 2419 rdma_wr->wr.sg_list, rdma_wr->wr.num_sge);
2450 2420
2451 return send_wr->num_sge; 2421 return rdma_wr->wr.num_sge;
2452} 2422}
2453 2423
2454static int 2424static int
@@ -2459,7 +2429,7 @@ isert_map_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2459 struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd); 2429 struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
2460 struct isert_conn *isert_conn = conn->context; 2430 struct isert_conn *isert_conn = conn->context;
2461 struct isert_data_buf *data = &wr->data; 2431 struct isert_data_buf *data = &wr->data;
2462 struct ib_send_wr *send_wr; 2432 struct ib_rdma_wr *rdma_wr;
2463 struct ib_sge *ib_sge; 2433 struct ib_sge *ib_sge;
2464 u32 offset, data_len, data_left, rdma_write_max, va_offset = 0; 2434 u32 offset, data_len, data_left, rdma_write_max, va_offset = 0;
2465 int ret = 0, i, ib_sge_cnt; 2435 int ret = 0, i, ib_sge_cnt;
@@ -2484,11 +2454,11 @@ isert_map_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2484 } 2454 }
2485 wr->ib_sge = ib_sge; 2455 wr->ib_sge = ib_sge;
2486 2456
2487 wr->send_wr_num = DIV_ROUND_UP(data->nents, isert_conn->max_sge); 2457 wr->rdma_wr_num = DIV_ROUND_UP(data->nents, isert_conn->max_sge);
2488 wr->send_wr = kzalloc(sizeof(struct ib_send_wr) * wr->send_wr_num, 2458 wr->rdma_wr = kzalloc(sizeof(struct ib_rdma_wr) * wr->rdma_wr_num,
2489 GFP_KERNEL); 2459 GFP_KERNEL);
2490 if (!wr->send_wr) { 2460 if (!wr->rdma_wr) {
2491 isert_dbg("Unable to allocate wr->send_wr\n"); 2461 isert_dbg("Unable to allocate wr->rdma_wr\n");
2492 ret = -ENOMEM; 2462 ret = -ENOMEM;
2493 goto unmap_cmd; 2463 goto unmap_cmd;
2494 } 2464 }
@@ -2496,31 +2466,31 @@ isert_map_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2496 wr->isert_cmd = isert_cmd; 2466 wr->isert_cmd = isert_cmd;
2497 rdma_write_max = isert_conn->max_sge * PAGE_SIZE; 2467 rdma_write_max = isert_conn->max_sge * PAGE_SIZE;
2498 2468
2499 for (i = 0; i < wr->send_wr_num; i++) { 2469 for (i = 0; i < wr->rdma_wr_num; i++) {
2500 send_wr = &isert_cmd->rdma_wr.send_wr[i]; 2470 rdma_wr = &isert_cmd->rdma_wr.rdma_wr[i];
2501 data_len = min(data_left, rdma_write_max); 2471 data_len = min(data_left, rdma_write_max);
2502 2472
2503 send_wr->send_flags = 0; 2473 rdma_wr->wr.send_flags = 0;
2504 if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) { 2474 if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) {
2505 send_wr->opcode = IB_WR_RDMA_WRITE; 2475 rdma_wr->wr.opcode = IB_WR_RDMA_WRITE;
2506 send_wr->wr.rdma.remote_addr = isert_cmd->read_va + offset; 2476 rdma_wr->remote_addr = isert_cmd->read_va + offset;
2507 send_wr->wr.rdma.rkey = isert_cmd->read_stag; 2477 rdma_wr->rkey = isert_cmd->read_stag;
2508 if (i + 1 == wr->send_wr_num) 2478 if (i + 1 == wr->rdma_wr_num)
2509 send_wr->next = &isert_cmd->tx_desc.send_wr; 2479 rdma_wr->wr.next = &isert_cmd->tx_desc.send_wr;
2510 else 2480 else
2511 send_wr->next = &wr->send_wr[i + 1]; 2481 rdma_wr->wr.next = &wr->rdma_wr[i + 1].wr;
2512 } else { 2482 } else {
2513 send_wr->opcode = IB_WR_RDMA_READ; 2483 rdma_wr->wr.opcode = IB_WR_RDMA_READ;
2514 send_wr->wr.rdma.remote_addr = isert_cmd->write_va + va_offset; 2484 rdma_wr->remote_addr = isert_cmd->write_va + va_offset;
2515 send_wr->wr.rdma.rkey = isert_cmd->write_stag; 2485 rdma_wr->rkey = isert_cmd->write_stag;
2516 if (i + 1 == wr->send_wr_num) 2486 if (i + 1 == wr->rdma_wr_num)
2517 send_wr->send_flags = IB_SEND_SIGNALED; 2487 rdma_wr->wr.send_flags = IB_SEND_SIGNALED;
2518 else 2488 else
2519 send_wr->next = &wr->send_wr[i + 1]; 2489 rdma_wr->wr.next = &wr->rdma_wr[i + 1].wr;
2520 } 2490 }
2521 2491
2522 ib_sge_cnt = isert_build_rdma_wr(isert_conn, isert_cmd, ib_sge, 2492 ib_sge_cnt = isert_build_rdma_wr(isert_conn, isert_cmd, ib_sge,
2523 send_wr, data_len, offset); 2493 rdma_wr, data_len, offset);
2524 ib_sge += ib_sge_cnt; 2494 ib_sge += ib_sge_cnt;
2525 2495
2526 offset += data_len; 2496 offset += data_len;
@@ -2535,45 +2505,6 @@ unmap_cmd:
2535 return ret; 2505 return ret;
2536} 2506}
2537 2507
2538static int
2539isert_map_fr_pagelist(struct ib_device *ib_dev,
2540 struct scatterlist *sg_start, int sg_nents, u64 *fr_pl)
2541{
2542 u64 start_addr, end_addr, page, chunk_start = 0;
2543 struct scatterlist *tmp_sg;
2544 int i = 0, new_chunk, last_ent, n_pages;
2545
2546 n_pages = 0;
2547 new_chunk = 1;
2548 last_ent = sg_nents - 1;
2549 for_each_sg(sg_start, tmp_sg, sg_nents, i) {
2550 start_addr = ib_sg_dma_address(ib_dev, tmp_sg);
2551 if (new_chunk)
2552 chunk_start = start_addr;
2553 end_addr = start_addr + ib_sg_dma_len(ib_dev, tmp_sg);
2554
2555 isert_dbg("SGL[%d] dma_addr: 0x%llx len: %u\n",
2556 i, (unsigned long long)tmp_sg->dma_address,
2557 tmp_sg->length);
2558
2559 if ((end_addr & ~PAGE_MASK) && i < last_ent) {
2560 new_chunk = 0;
2561 continue;
2562 }
2563 new_chunk = 1;
2564
2565 page = chunk_start & PAGE_MASK;
2566 do {
2567 fr_pl[n_pages++] = page;
2568 isert_dbg("Mapped page_list[%d] page_addr: 0x%llx\n",
2569 n_pages - 1, page);
2570 page += PAGE_SIZE;
2571 } while (page < end_addr);
2572 }
2573
2574 return n_pages;
2575}
2576
2577static inline void 2508static inline void
2578isert_inv_rkey(struct ib_send_wr *inv_wr, struct ib_mr *mr) 2509isert_inv_rkey(struct ib_send_wr *inv_wr, struct ib_mr *mr)
2579{ 2510{
@@ -2599,11 +2530,9 @@ isert_fast_reg_mr(struct isert_conn *isert_conn,
2599 struct isert_device *device = isert_conn->device; 2530 struct isert_device *device = isert_conn->device;
2600 struct ib_device *ib_dev = device->ib_device; 2531 struct ib_device *ib_dev = device->ib_device;
2601 struct ib_mr *mr; 2532 struct ib_mr *mr;
2602 struct ib_fast_reg_page_list *frpl; 2533 struct ib_reg_wr reg_wr;
2603 struct ib_send_wr fr_wr, inv_wr; 2534 struct ib_send_wr inv_wr, *bad_wr, *wr = NULL;
2604 struct ib_send_wr *bad_wr, *wr = NULL; 2535 int ret, n;
2605 int ret, pagelist_len;
2606 u32 page_off;
2607 2536
2608 if (mem->dma_nents == 1) { 2537 if (mem->dma_nents == 1) {
2609 sge->lkey = device->pd->local_dma_lkey; 2538 sge->lkey = device->pd->local_dma_lkey;
@@ -2614,45 +2543,41 @@ isert_fast_reg_mr(struct isert_conn *isert_conn,
2614 return 0; 2543 return 0;
2615 } 2544 }
2616 2545
2617 if (ind == ISERT_DATA_KEY_VALID) { 2546 if (ind == ISERT_DATA_KEY_VALID)
2618 /* Registering data buffer */ 2547 /* Registering data buffer */
2619 mr = fr_desc->data_mr; 2548 mr = fr_desc->data_mr;
2620 frpl = fr_desc->data_frpl; 2549 else
2621 } else {
2622 /* Registering protection buffer */ 2550 /* Registering protection buffer */
2623 mr = fr_desc->pi_ctx->prot_mr; 2551 mr = fr_desc->pi_ctx->prot_mr;
2624 frpl = fr_desc->pi_ctx->prot_frpl;
2625 }
2626
2627 page_off = mem->offset % PAGE_SIZE;
2628
2629 isert_dbg("Use fr_desc %p sg_nents %d offset %u\n",
2630 fr_desc, mem->nents, mem->offset);
2631
2632 pagelist_len = isert_map_fr_pagelist(ib_dev, mem->sg, mem->nents,
2633 &frpl->page_list[0]);
2634 2552
2635 if (!(fr_desc->ind & ind)) { 2553 if (!(fr_desc->ind & ind)) {
2636 isert_inv_rkey(&inv_wr, mr); 2554 isert_inv_rkey(&inv_wr, mr);
2637 wr = &inv_wr; 2555 wr = &inv_wr;
2638 } 2556 }
2639 2557
2640 /* Prepare FASTREG WR */ 2558 n = ib_map_mr_sg(mr, mem->sg, mem->nents, PAGE_SIZE);
2641 memset(&fr_wr, 0, sizeof(fr_wr)); 2559 if (unlikely(n != mem->nents)) {
2642 fr_wr.wr_id = ISER_FASTREG_LI_WRID; 2560 isert_err("failed to map mr sg (%d/%d)\n",
2643 fr_wr.opcode = IB_WR_FAST_REG_MR; 2561 n, mem->nents);
2644 fr_wr.wr.fast_reg.iova_start = frpl->page_list[0] + page_off; 2562 return n < 0 ? n : -EINVAL;
2645 fr_wr.wr.fast_reg.page_list = frpl; 2563 }
2646 fr_wr.wr.fast_reg.page_list_len = pagelist_len; 2564
2647 fr_wr.wr.fast_reg.page_shift = PAGE_SHIFT; 2565 isert_dbg("Use fr_desc %p sg_nents %d offset %u\n",
2648 fr_wr.wr.fast_reg.length = mem->len; 2566 fr_desc, mem->nents, mem->offset);
2649 fr_wr.wr.fast_reg.rkey = mr->rkey; 2567
2650 fr_wr.wr.fast_reg.access_flags = IB_ACCESS_LOCAL_WRITE; 2568 reg_wr.wr.next = NULL;
2569 reg_wr.wr.opcode = IB_WR_REG_MR;
2570 reg_wr.wr.wr_id = ISER_FASTREG_LI_WRID;
2571 reg_wr.wr.send_flags = 0;
2572 reg_wr.wr.num_sge = 0;
2573 reg_wr.mr = mr;
2574 reg_wr.key = mr->lkey;
2575 reg_wr.access = IB_ACCESS_LOCAL_WRITE;
2651 2576
2652 if (!wr) 2577 if (!wr)
2653 wr = &fr_wr; 2578 wr = &reg_wr.wr;
2654 else 2579 else
2655 wr->next = &fr_wr; 2580 wr->next = &reg_wr.wr;
2656 2581
2657 ret = ib_post_send(isert_conn->qp, wr, &bad_wr); 2582 ret = ib_post_send(isert_conn->qp, wr, &bad_wr);
2658 if (ret) { 2583 if (ret) {
@@ -2662,8 +2587,8 @@ isert_fast_reg_mr(struct isert_conn *isert_conn,
2662 fr_desc->ind &= ~ind; 2587 fr_desc->ind &= ~ind;
2663 2588
2664 sge->lkey = mr->lkey; 2589 sge->lkey = mr->lkey;
2665 sge->addr = frpl->page_list[0] + page_off; 2590 sge->addr = mr->iova;
2666 sge->length = mem->len; 2591 sge->length = mr->length;
2667 2592
2668 isert_dbg("sge: addr: 0x%llx length: %u lkey: %x\n", 2593 isert_dbg("sge: addr: 0x%llx length: %u lkey: %x\n",
2669 sge->addr, sge->length, sge->lkey); 2594 sge->addr, sge->length, sge->lkey);
@@ -2733,8 +2658,8 @@ isert_reg_sig_mr(struct isert_conn *isert_conn,
2733 struct isert_rdma_wr *rdma_wr, 2658 struct isert_rdma_wr *rdma_wr,
2734 struct fast_reg_descriptor *fr_desc) 2659 struct fast_reg_descriptor *fr_desc)
2735{ 2660{
2736 struct ib_send_wr sig_wr, inv_wr; 2661 struct ib_sig_handover_wr sig_wr;
2737 struct ib_send_wr *bad_wr, *wr = NULL; 2662 struct ib_send_wr inv_wr, *bad_wr, *wr = NULL;
2738 struct pi_context *pi_ctx = fr_desc->pi_ctx; 2663 struct pi_context *pi_ctx = fr_desc->pi_ctx;
2739 struct ib_sig_attrs sig_attrs; 2664 struct ib_sig_attrs sig_attrs;
2740 int ret; 2665 int ret;
@@ -2752,20 +2677,20 @@ isert_reg_sig_mr(struct isert_conn *isert_conn,
2752 } 2677 }
2753 2678
2754 memset(&sig_wr, 0, sizeof(sig_wr)); 2679 memset(&sig_wr, 0, sizeof(sig_wr));
2755 sig_wr.opcode = IB_WR_REG_SIG_MR; 2680 sig_wr.wr.opcode = IB_WR_REG_SIG_MR;
2756 sig_wr.wr_id = ISER_FASTREG_LI_WRID; 2681 sig_wr.wr.wr_id = ISER_FASTREG_LI_WRID;
2757 sig_wr.sg_list = &rdma_wr->ib_sg[DATA]; 2682 sig_wr.wr.sg_list = &rdma_wr->ib_sg[DATA];
2758 sig_wr.num_sge = 1; 2683 sig_wr.wr.num_sge = 1;
2759 sig_wr.wr.sig_handover.access_flags = IB_ACCESS_LOCAL_WRITE; 2684 sig_wr.access_flags = IB_ACCESS_LOCAL_WRITE;
2760 sig_wr.wr.sig_handover.sig_attrs = &sig_attrs; 2685 sig_wr.sig_attrs = &sig_attrs;
2761 sig_wr.wr.sig_handover.sig_mr = pi_ctx->sig_mr; 2686 sig_wr.sig_mr = pi_ctx->sig_mr;
2762 if (se_cmd->t_prot_sg) 2687 if (se_cmd->t_prot_sg)
2763 sig_wr.wr.sig_handover.prot = &rdma_wr->ib_sg[PROT]; 2688 sig_wr.prot = &rdma_wr->ib_sg[PROT];
2764 2689
2765 if (!wr) 2690 if (!wr)
2766 wr = &sig_wr; 2691 wr = &sig_wr.wr;
2767 else 2692 else
2768 wr->next = &sig_wr; 2693 wr->next = &sig_wr.wr;
2769 2694
2770 ret = ib_post_send(isert_conn->qp, wr, &bad_wr); 2695 ret = ib_post_send(isert_conn->qp, wr, &bad_wr);
2771 if (ret) { 2696 if (ret) {
@@ -2859,7 +2784,7 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2859 struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd); 2784 struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
2860 struct isert_conn *isert_conn = conn->context; 2785 struct isert_conn *isert_conn = conn->context;
2861 struct fast_reg_descriptor *fr_desc = NULL; 2786 struct fast_reg_descriptor *fr_desc = NULL;
2862 struct ib_send_wr *send_wr; 2787 struct ib_rdma_wr *rdma_wr;
2863 struct ib_sge *ib_sg; 2788 struct ib_sge *ib_sg;
2864 u32 offset; 2789 u32 offset;
2865 int ret = 0; 2790 int ret = 0;
@@ -2900,26 +2825,26 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2900 2825
2901 memcpy(&wr->s_ib_sge, ib_sg, sizeof(*ib_sg)); 2826 memcpy(&wr->s_ib_sge, ib_sg, sizeof(*ib_sg));
2902 wr->ib_sge = &wr->s_ib_sge; 2827 wr->ib_sge = &wr->s_ib_sge;
2903 wr->send_wr_num = 1; 2828 wr->rdma_wr_num = 1;
2904 memset(&wr->s_send_wr, 0, sizeof(*send_wr)); 2829 memset(&wr->s_rdma_wr, 0, sizeof(wr->s_rdma_wr));
2905 wr->send_wr = &wr->s_send_wr; 2830 wr->rdma_wr = &wr->s_rdma_wr;
2906 wr->isert_cmd = isert_cmd; 2831 wr->isert_cmd = isert_cmd;
2907 2832
2908 send_wr = &isert_cmd->rdma_wr.s_send_wr; 2833 rdma_wr = &isert_cmd->rdma_wr.s_rdma_wr;
2909 send_wr->sg_list = &wr->s_ib_sge; 2834 rdma_wr->wr.sg_list = &wr->s_ib_sge;
2910 send_wr->num_sge = 1; 2835 rdma_wr->wr.num_sge = 1;
2911 send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc; 2836 rdma_wr->wr.wr_id = (uintptr_t)&isert_cmd->tx_desc;
2912 if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) { 2837 if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) {
2913 send_wr->opcode = IB_WR_RDMA_WRITE; 2838 rdma_wr->wr.opcode = IB_WR_RDMA_WRITE;
2914 send_wr->wr.rdma.remote_addr = isert_cmd->read_va; 2839 rdma_wr->remote_addr = isert_cmd->read_va;
2915 send_wr->wr.rdma.rkey = isert_cmd->read_stag; 2840 rdma_wr->rkey = isert_cmd->read_stag;
2916 send_wr->send_flags = !isert_prot_cmd(isert_conn, se_cmd) ? 2841 rdma_wr->wr.send_flags = !isert_prot_cmd(isert_conn, se_cmd) ?
2917 0 : IB_SEND_SIGNALED; 2842 0 : IB_SEND_SIGNALED;
2918 } else { 2843 } else {
2919 send_wr->opcode = IB_WR_RDMA_READ; 2844 rdma_wr->wr.opcode = IB_WR_RDMA_READ;
2920 send_wr->wr.rdma.remote_addr = isert_cmd->write_va; 2845 rdma_wr->remote_addr = isert_cmd->write_va;
2921 send_wr->wr.rdma.rkey = isert_cmd->write_stag; 2846 rdma_wr->rkey = isert_cmd->write_stag;
2922 send_wr->send_flags = IB_SEND_SIGNALED; 2847 rdma_wr->wr.send_flags = IB_SEND_SIGNALED;
2923 } 2848 }
2924 2849
2925 return 0; 2850 return 0;
@@ -2967,8 +2892,8 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
2967 isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc); 2892 isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
2968 isert_init_send_wr(isert_conn, isert_cmd, 2893 isert_init_send_wr(isert_conn, isert_cmd,
2969 &isert_cmd->tx_desc.send_wr); 2894 &isert_cmd->tx_desc.send_wr);
2970 isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr; 2895 isert_cmd->rdma_wr.s_rdma_wr.wr.next = &isert_cmd->tx_desc.send_wr;
2971 wr->send_wr_num += 1; 2896 wr->rdma_wr_num += 1;
2972 2897
2973 rc = isert_post_recv(isert_conn, isert_cmd->rx_desc); 2898 rc = isert_post_recv(isert_conn, isert_cmd->rx_desc);
2974 if (rc) { 2899 if (rc) {
@@ -2977,7 +2902,7 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
2977 } 2902 }
2978 } 2903 }
2979 2904
2980 rc = ib_post_send(isert_conn->qp, wr->send_wr, &wr_failed); 2905 rc = ib_post_send(isert_conn->qp, &wr->rdma_wr->wr, &wr_failed);
2981 if (rc) 2906 if (rc)
2982 isert_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n"); 2907 isert_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n");
2983 2908
@@ -3011,7 +2936,7 @@ isert_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, bool recovery)
3011 return rc; 2936 return rc;
3012 } 2937 }
3013 2938
3014 rc = ib_post_send(isert_conn->qp, wr->send_wr, &wr_failed); 2939 rc = ib_post_send(isert_conn->qp, &wr->rdma_wr->wr, &wr_failed);
3015 if (rc) 2940 if (rc)
3016 isert_warn("ib_post_send() failed for IB_WR_RDMA_READ\n"); 2941 isert_warn("ib_post_send() failed for IB_WR_RDMA_READ\n");
3017 2942
@@ -3097,7 +3022,7 @@ isert_setup_id(struct isert_np *isert_np)
3097 sa = (struct sockaddr *)&np->np_sockaddr; 3022 sa = (struct sockaddr *)&np->np_sockaddr;
3098 isert_dbg("ksockaddr: %p, sa: %p\n", &np->np_sockaddr, sa); 3023 isert_dbg("ksockaddr: %p, sa: %p\n", &np->np_sockaddr, sa);
3099 3024
3100 id = rdma_create_id(isert_cma_handler, isert_np, 3025 id = rdma_create_id(&init_net, isert_cma_handler, isert_np,
3101 RDMA_PS_TCP, IB_QPT_RC); 3026 RDMA_PS_TCP, IB_QPT_RC);
3102 if (IS_ERR(id)) { 3027 if (IS_ERR(id)) {
3103 isert_err("rdma_create_id() failed: %ld\n", PTR_ERR(id)); 3028 isert_err("rdma_create_id() failed: %ld\n", PTR_ERR(id));