diff options
Diffstat (limited to 'drivers/infiniband/ulp/isert/ib_isert.c')
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 269 |
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 | ||
540 | err_prot_mr: | 529 | err_prot_mr: |
541 | ib_dereg_mr(pi_ctx->prot_mr); | 530 | ib_dereg_mr(pi_ctx->prot_mr); |
542 | err_prot_frpl: | ||
543 | ib_free_fast_reg_page_list(pi_ctx->prot_frpl); | ||
544 | err_pi_ctx: | 531 | err_pi_ctx: |
545 | kfree(pi_ctx); | 532 | kfree(pi_ctx); |
546 | 533 | ||
@@ -551,34 +538,18 @@ static int | |||
551 | isert_create_fr_desc(struct ib_device *ib_device, struct ib_pd *pd, | 538 | isert_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 | |||
578 | err_data_frpl: | ||
579 | ib_free_fast_reg_page_list(fr_desc->data_frpl); | ||
580 | |||
581 | return ret; | ||
582 | } | 553 | } |
583 | 554 | ||
584 | static int | 555 | static 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 | ||
1613 | static void | 1583 | static 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 | ||
1760 | static void | 1730 | static 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 | ||
2404 | static int | 2374 | static int |
2405 | isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, | 2375 | isert_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 | ||
2454 | static int | 2424 | static 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 | ||
2538 | static int | ||
2539 | isert_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 | |||
2577 | static inline void | 2508 | static inline void |
2578 | isert_inv_rkey(struct ib_send_wr *inv_wr, struct ib_mr *mr) | 2509 | isert_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 = ®_wr.wr; |
2654 | else | 2579 | else |
2655 | wr->next = &fr_wr; | 2580 | wr->next = ®_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)); |