Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RDMA/srp: Remove support for FMR memory registration

FMR is not supported on most recent RDMA devices (that use fast memory
registration mechanism). Also, FMR was recently removed from NFS/RDMA
ULP.

Link: https://lore.kernel.org/r/2-v3-f58e6669d5d3+2cf-fmr_removal_jgg@mellanox.com
Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
Reviewed-by: Israel Rukshin <israelr@mellanox.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>

authored by

Max Gurtovoy and committed by
Jason Gunthorpe
f273ad4f 1fc43132

+22 -227
+16 -206
drivers/infiniband/ulp/srp/ib_srp.c
··· 71 71 static unsigned int cmd_sg_entries; 72 72 static unsigned int indirect_sg_entries; 73 73 static bool allow_ext_sg; 74 - static bool prefer_fr = true; 75 74 static bool register_always = true; 76 75 static bool never_register; 77 76 static int topspin_workarounds = 1; ··· 93 94 module_param(topspin_workarounds, int, 0444); 94 95 MODULE_PARM_DESC(topspin_workarounds, 95 96 "Enable workarounds for Topspin/Cisco SRP target bugs if != 0"); 96 - 97 - module_param(prefer_fr, bool, 0444); 98 - MODULE_PARM_DESC(prefer_fr, 99 - "Whether to use fast registration if both FMR and fast registration are supported"); 100 97 101 98 module_param(register_always, bool, 0444); 102 99 MODULE_PARM_DESC(register_always, ··· 383 388 srp_new_ib_cm_id(ch); 384 389 } 385 390 386 - static struct ib_fmr_pool *srp_alloc_fmr_pool(struct srp_target_port *target) 387 - { 388 - struct srp_device *dev = target->srp_host->srp_dev; 389 - struct ib_fmr_pool_param fmr_param; 390 - 391 - memset(&fmr_param, 0, sizeof(fmr_param)); 392 - fmr_param.pool_size = target->mr_pool_size; 393 - fmr_param.dirty_watermark = fmr_param.pool_size / 4; 394 - fmr_param.cache = 1; 395 - fmr_param.max_pages_per_fmr = dev->max_pages_per_mr; 396 - fmr_param.page_shift = ilog2(dev->mr_page_size); 397 - fmr_param.access = (IB_ACCESS_LOCAL_WRITE | 398 - IB_ACCESS_REMOTE_WRITE | 399 - IB_ACCESS_REMOTE_READ); 400 - 401 - return ib_create_fmr_pool(dev->pd, &fmr_param); 402 - } 403 - 404 391 /** 405 392 * srp_destroy_fr_pool() - free the resources owned by a pool 406 393 * @pool: Fast registration pool to be destroyed. ··· 533 556 struct ib_qp_init_attr *init_attr; 534 557 struct ib_cq *recv_cq, *send_cq; 535 558 struct ib_qp *qp; 536 - struct ib_fmr_pool *fmr_pool = NULL; 537 559 struct srp_fr_pool *fr_pool = NULL; 538 560 const int m = 1 + dev->use_fast_reg * target->mr_per_cmd * 2; 539 561 int ret; ··· 595 619 "FR pool allocation failed (%d)\n", ret); 596 620 goto err_qp; 597 621 } 598 - } else if (dev->use_fmr) { 599 - fmr_pool = srp_alloc_fmr_pool(target); 600 - if (IS_ERR(fmr_pool)) { 601 - ret = PTR_ERR(fmr_pool); 602 - shost_printk(KERN_WARNING, target->scsi_host, PFX 603 - "FMR pool allocation failed (%d)\n", ret); 604 - goto err_qp; 605 - } 606 622 } 607 623 608 624 if (ch->qp) ··· 612 644 if (ch->fr_pool) 613 645 srp_destroy_fr_pool(ch->fr_pool); 614 646 ch->fr_pool = fr_pool; 615 - } else if (dev->use_fmr) { 616 - if (ch->fmr_pool) 617 - ib_destroy_fmr_pool(ch->fmr_pool); 618 - ch->fmr_pool = fmr_pool; 619 647 } 620 648 621 649 kfree(init_attr); ··· 666 702 if (dev->use_fast_reg) { 667 703 if (ch->fr_pool) 668 704 srp_destroy_fr_pool(ch->fr_pool); 669 - } else if (dev->use_fmr) { 670 - if (ch->fmr_pool) 671 - ib_destroy_fmr_pool(ch->fmr_pool); 672 705 } 673 706 674 707 srp_destroy_qp(ch); ··· 978 1017 979 1018 for (i = 0; i < target->req_ring_size; ++i) { 980 1019 req = &ch->req_ring[i]; 981 - if (dev->use_fast_reg) { 1020 + if (dev->use_fast_reg) 982 1021 kfree(req->fr_list); 983 - } else { 984 - kfree(req->fmr_list); 985 - kfree(req->map_page); 986 - } 987 1022 if (req->indirect_dma_addr) { 988 1023 ib_dma_unmap_single(ibdev, req->indirect_dma_addr, 989 1024 target->indirect_size, ··· 1013 1056 GFP_KERNEL); 1014 1057 if (!mr_list) 1015 1058 goto out; 1016 - if (srp_dev->use_fast_reg) { 1059 + if (srp_dev->use_fast_reg) 1017 1060 req->fr_list = mr_list; 1018 - } else { 1019 - req->fmr_list = mr_list; 1020 - req->map_page = kmalloc_array(srp_dev->max_pages_per_mr, 1021 - sizeof(void *), 1022 - GFP_KERNEL); 1023 - if (!req->map_page) 1024 - goto out; 1025 - } 1026 1061 req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL); 1027 1062 if (!req->indirect_desc) 1028 1063 goto out; ··· 1221 1272 if (req->nmdesc) 1222 1273 srp_fr_pool_put(ch->fr_pool, req->fr_list, 1223 1274 req->nmdesc); 1224 - } else if (dev->use_fmr) { 1225 - struct ib_pool_fmr **pfmr; 1226 - 1227 - for (i = req->nmdesc, pfmr = req->fmr_list; i > 0; i--, pfmr++) 1228 - ib_fmr_pool_unmap(*pfmr); 1229 1275 } 1230 1276 1231 1277 ib_dma_unmap_sg(ibdev, scsi_sglist(scmnd), scsi_sg_count(scmnd), ··· 1416 1472 state->ndesc++; 1417 1473 } 1418 1474 1419 - static int srp_map_finish_fmr(struct srp_map_state *state, 1420 - struct srp_rdma_ch *ch) 1421 - { 1422 - struct srp_target_port *target = ch->target; 1423 - struct srp_device *dev = target->srp_host->srp_dev; 1424 - struct ib_pool_fmr *fmr; 1425 - u64 io_addr = 0; 1426 - 1427 - if (state->fmr.next >= state->fmr.end) { 1428 - shost_printk(KERN_ERR, ch->target->scsi_host, 1429 - PFX "Out of MRs (mr_per_cmd = %d)\n", 1430 - ch->target->mr_per_cmd); 1431 - return -ENOMEM; 1432 - } 1433 - 1434 - WARN_ON_ONCE(!dev->use_fmr); 1435 - 1436 - if (state->npages == 0) 1437 - return 0; 1438 - 1439 - if (state->npages == 1 && target->global_rkey) { 1440 - srp_map_desc(state, state->base_dma_addr, state->dma_len, 1441 - target->global_rkey); 1442 - goto reset_state; 1443 - } 1444 - 1445 - fmr = ib_fmr_pool_map_phys(ch->fmr_pool, state->pages, 1446 - state->npages, io_addr); 1447 - if (IS_ERR(fmr)) 1448 - return PTR_ERR(fmr); 1449 - 1450 - *state->fmr.next++ = fmr; 1451 - state->nmdesc++; 1452 - 1453 - srp_map_desc(state, state->base_dma_addr & ~dev->mr_page_mask, 1454 - state->dma_len, fmr->fmr->rkey); 1455 - 1456 - reset_state: 1457 - state->npages = 0; 1458 - state->dma_len = 0; 1459 - 1460 - return 0; 1461 - } 1462 - 1463 1475 static void srp_reg_mr_err_done(struct ib_cq *cq, struct ib_wc *wc) 1464 1476 { 1465 1477 srp_handle_qp_err(cq, wc, "FAST REG"); ··· 1506 1606 return n; 1507 1607 } 1508 1608 1509 - static int srp_map_sg_entry(struct srp_map_state *state, 1510 - struct srp_rdma_ch *ch, 1511 - struct scatterlist *sg) 1512 - { 1513 - struct srp_target_port *target = ch->target; 1514 - struct srp_device *dev = target->srp_host->srp_dev; 1515 - dma_addr_t dma_addr = sg_dma_address(sg); 1516 - unsigned int dma_len = sg_dma_len(sg); 1517 - unsigned int len = 0; 1518 - int ret; 1519 - 1520 - WARN_ON_ONCE(!dma_len); 1521 - 1522 - while (dma_len) { 1523 - unsigned offset = dma_addr & ~dev->mr_page_mask; 1524 - 1525 - if (state->npages == dev->max_pages_per_mr || 1526 - (state->npages > 0 && offset != 0)) { 1527 - ret = srp_map_finish_fmr(state, ch); 1528 - if (ret) 1529 - return ret; 1530 - } 1531 - 1532 - len = min_t(unsigned int, dma_len, dev->mr_page_size - offset); 1533 - 1534 - if (!state->npages) 1535 - state->base_dma_addr = dma_addr; 1536 - state->pages[state->npages++] = dma_addr & dev->mr_page_mask; 1537 - state->dma_len += len; 1538 - dma_addr += len; 1539 - dma_len -= len; 1540 - } 1541 - 1542 - /* 1543 - * If the end of the MR is not on a page boundary then we need to 1544 - * close it out and start a new one -- we can only merge at page 1545 - * boundaries. 1546 - */ 1547 - ret = 0; 1548 - if ((dma_addr & ~dev->mr_page_mask) != 0) 1549 - ret = srp_map_finish_fmr(state, ch); 1550 - return ret; 1551 - } 1552 - 1553 - static int srp_map_sg_fmr(struct srp_map_state *state, struct srp_rdma_ch *ch, 1554 - struct srp_request *req, struct scatterlist *scat, 1555 - int count) 1556 - { 1557 - struct scatterlist *sg; 1558 - int i, ret; 1559 - 1560 - state->pages = req->map_page; 1561 - state->fmr.next = req->fmr_list; 1562 - state->fmr.end = req->fmr_list + ch->target->mr_per_cmd; 1563 - 1564 - for_each_sg(scat, sg, count, i) { 1565 - ret = srp_map_sg_entry(state, ch, sg); 1566 - if (ret) 1567 - return ret; 1568 - } 1569 - 1570 - ret = srp_map_finish_fmr(state, ch); 1571 - if (ret) 1572 - return ret; 1573 - 1574 - return 0; 1575 - } 1576 - 1577 1609 static int srp_map_sg_fr(struct srp_map_state *state, struct srp_rdma_ch *ch, 1578 1610 struct srp_request *req, struct scatterlist *scat, 1579 1611 int count) ··· 1565 1733 struct srp_device *dev = target->srp_host->srp_dev; 1566 1734 struct srp_map_state state; 1567 1735 struct srp_direct_buf idb_desc; 1568 - u64 idb_pages[1]; 1569 1736 struct scatterlist idb_sg[1]; 1570 1737 int ret; 1571 1738 ··· 1587 1756 if (ret < 0) 1588 1757 return ret; 1589 1758 WARN_ON_ONCE(ret < 1); 1590 - } else if (dev->use_fmr) { 1591 - state.pages = idb_pages; 1592 - state.pages[0] = (req->indirect_dma_addr & 1593 - dev->mr_page_mask); 1594 - state.npages = 1; 1595 - ret = srp_map_finish_fmr(&state, ch); 1596 - if (ret < 0) 1597 - return ret; 1598 1759 } else { 1599 1760 return -EINVAL; 1600 1761 } ··· 1610 1787 if (dev->use_fast_reg) 1611 1788 for (i = 0, pfr = req->fr_list; i < state->nmdesc; i++, pfr++) 1612 1789 mr_len += (*pfr)->mr->length; 1613 - else if (dev->use_fmr) 1614 - for (i = 0; i < state->nmdesc; i++) 1615 - mr_len += be32_to_cpu(req->indirect_desc[i].len); 1616 1790 if (desc_len != scsi_bufflen(req->scmnd) || 1617 1791 mr_len > scsi_bufflen(req->scmnd)) 1618 1792 pr_err("Inconsistent: scsi len %d <> desc len %lld <> mr len %lld; ndesc %d; nmdesc = %d\n", ··· 1724 1904 state.desc = req->indirect_desc; 1725 1905 if (dev->use_fast_reg) 1726 1906 ret = srp_map_sg_fr(&state, ch, req, scat, count); 1727 - else if (dev->use_fmr) 1728 - ret = srp_map_sg_fmr(&state, ch, req, scat, count); 1729 1907 else 1730 1908 ret = srp_map_sg_dma(&state, ch, req, scat, count); 1731 1909 req->nmdesc = state.nmdesc; ··· 3692 3874 goto out; 3693 3875 } 3694 3876 3695 - if (!srp_dev->has_fmr && !srp_dev->has_fr && !target->allow_ext_sg && 3877 + if (!srp_dev->has_fr && !target->allow_ext_sg && 3696 3878 target->cmd_sg_cnt < target->sg_tablesize) { 3697 3879 pr_warn("No MR pool and no external indirect descriptors, limiting sg_tablesize to cmd_sg_cnt\n"); 3698 3880 target->sg_tablesize = target->cmd_sg_cnt; 3699 3881 } 3700 3882 3701 - if (srp_dev->use_fast_reg || srp_dev->use_fmr) { 3883 + if (srp_dev->use_fast_reg) { 3702 3884 bool gaps_reg = (ibdev->attrs.device_cap_flags & 3703 3885 IB_DEVICE_SG_GAPS_REG); 3704 3886 ··· 3706 3888 (ilog2(srp_dev->mr_page_size) - 9); 3707 3889 if (!gaps_reg) { 3708 3890 /* 3709 - * FR and FMR can only map one HCA page per entry. If 3710 - * the start address is not aligned on a HCA page 3711 - * boundary two entries will be used for the head and 3712 - * the tail although these two entries combined 3713 - * contain at most one HCA page of data. Hence the "+ 3714 - * 1" in the calculation below. 3891 + * FR can only map one HCA page per entry. If the start 3892 + * address is not aligned on a HCA page boundary two 3893 + * entries will be used for the head and the tail 3894 + * although these two entries combined contain at most 3895 + * one HCA page of data. Hence the "+ 1" in the 3896 + * calculation below. 3715 3897 * 3716 3898 * The indirect data buffer descriptor is contiguous 3717 3899 * so the memory for that buffer will only be ··· 3992 4174 srp_dev->max_pages_per_mr = min_t(u64, SRP_MAX_PAGES_PER_MR, 3993 4175 max_pages_per_mr); 3994 4176 3995 - srp_dev->has_fmr = (device->ops.alloc_fmr && 3996 - device->ops.dealloc_fmr && 3997 - device->ops.map_phys_fmr && 3998 - device->ops.unmap_fmr); 3999 4177 srp_dev->has_fr = (attr->device_cap_flags & 4000 4178 IB_DEVICE_MEM_MGT_EXTENSIONS); 4001 - if (!never_register && !srp_dev->has_fmr && !srp_dev->has_fr) { 4002 - dev_warn(&device->dev, "neither FMR nor FR is supported\n"); 4003 - } else if (!never_register && 4004 - attr->max_mr_size >= 2 * srp_dev->mr_page_size) { 4005 - srp_dev->use_fast_reg = (srp_dev->has_fr && 4006 - (!srp_dev->has_fmr || prefer_fr)); 4007 - srp_dev->use_fmr = !srp_dev->use_fast_reg && srp_dev->has_fmr; 4008 - } 4179 + if (!never_register && !srp_dev->has_fr) 4180 + dev_warn(&device->dev, "FR is not supported\n"); 4181 + else if (!never_register && 4182 + attr->max_mr_size >= 2 * srp_dev->mr_page_size) 4183 + srp_dev->use_fast_reg = srp_dev->has_fr; 4009 4184 4010 - if (never_register || !register_always || 4011 - (!srp_dev->has_fmr && !srp_dev->has_fr)) 4185 + if (never_register || !register_always || !srp_dev->has_fr) 4012 4186 flags |= IB_PD_UNSAFE_GLOBAL_RKEY; 4013 4187 4014 4188 if (srp_dev->use_fast_reg) {
+6 -21
drivers/infiniband/ulp/srp/ib_srp.h
··· 44 44 #include <rdma/ib_verbs.h> 45 45 #include <rdma/ib_sa.h> 46 46 #include <rdma/ib_cm.h> 47 - #include <rdma/ib_fmr_pool.h> 48 47 #include <rdma/rdma_cm.h> 49 48 50 49 enum { ··· 94 95 /* 95 96 * @mr_page_mask: HCA memory registration page mask. 96 97 * @mr_page_size: HCA memory registration page size. 97 - * @mr_max_size: Maximum size in bytes of a single FMR / FR registration 98 - * request. 98 + * @mr_max_size: Maximum size in bytes of a single FR registration request. 99 99 */ 100 100 struct srp_device { 101 101 struct list_head dev_list; ··· 105 107 int mr_page_size; 106 108 int mr_max_size; 107 109 int max_pages_per_mr; 108 - bool has_fmr; 109 110 bool has_fr; 110 - bool use_fmr; 111 111 bool use_fast_reg; 112 112 }; 113 113 ··· 123 127 struct srp_request { 124 128 struct scsi_cmnd *scmnd; 125 129 struct srp_iu *cmd; 126 - union { 127 - struct ib_pool_fmr **fmr_list; 128 - struct srp_fr_desc **fr_list; 129 - }; 130 - u64 *map_page; 130 + struct srp_fr_desc **fr_list; 131 131 struct srp_direct_buf *indirect_desc; 132 132 dma_addr_t indirect_dma_addr; 133 133 short nmdesc; ··· 147 155 struct ib_cq *send_cq; 148 156 struct ib_cq *recv_cq; 149 157 struct ib_qp *qp; 150 - union { 151 - struct ib_fmr_pool *fmr_pool; 152 - struct srp_fr_pool *fr_pool; 153 - }; 158 + struct srp_fr_pool *fr_pool; 154 159 uint32_t max_it_iu_len; 155 160 uint32_t max_ti_iu_len; 156 161 u8 max_imm_sge; ··· 308 319 * @pages: Array with DMA addresses of pages being considered for 309 320 * memory registration. 310 321 * @base_dma_addr: DMA address of the first page that has not yet been mapped. 311 - * @dma_len: Number of bytes that will be registered with the next 312 - * FMR or FR memory registration call. 322 + * @dma_len: Number of bytes that will be registered with the next FR 323 + * memory registration call. 313 324 * @total_len: Total number of bytes in the sg-list being mapped. 314 325 * @npages: Number of page addresses in the pages[] array. 315 - * @nmdesc: Number of FMR or FR memory descriptors used for mapping. 326 + * @nmdesc: Number of FR memory descriptors used for mapping. 316 327 * @ndesc: Number of SRP buffer descriptors that have been filled in. 317 328 */ 318 329 struct srp_map_state { 319 330 union { 320 - struct { 321 - struct ib_pool_fmr **next; 322 - struct ib_pool_fmr **end; 323 - } fmr; 324 331 struct { 325 332 struct srp_fr_desc **next; 326 333 struct srp_fr_desc **end;