aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2015-04-14 11:08:17 -0400
committerDoug Ledford <dledford@redhat.com>2015-04-15 16:07:12 -0400
commitd03e61d0366c61f596ada66ab11c217e7f887d15 (patch)
treea2fb026fd033078bb576c59a3a3ba4d35e53d862 /drivers/infiniband/ulp
parent56408325900d380f6544460c5892bfeb0616cab3 (diff)
IB/iser: Move memory reg/dereg routines to iser_memory.c
As memory registration/de-registration methods, lets move them to their natural location. While we're at it, make iser_reg_page_vec routine static. This patch does not change any functionality. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/ulp')
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.h4
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c88
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c87
3 files changed, 88 insertions, 91 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index 5c7036c90766..d5e5288fe3dd 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -632,10 +632,6 @@ int iser_connect(struct iser_conn *iser_conn,
632 struct sockaddr *dst_addr, 632 struct sockaddr *dst_addr,
633 int non_blocking); 633 int non_blocking);
634 634
635int iser_reg_page_vec(struct ib_conn *ib_conn,
636 struct iser_page_vec *page_vec,
637 struct iser_mem_reg *mem_reg);
638
639void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task, 635void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,
640 enum iser_data_dir cmd_dir); 636 enum iser_data_dir cmd_dir);
641void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task, 637void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index 9c60ff1d82a2..4e0cbbb671cc 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -362,6 +362,94 @@ static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task,
362} 362}
363 363
364/** 364/**
365 * iser_reg_page_vec - Register physical memory
366 *
367 * returns: 0 on success, errno code on failure
368 */
369static
370int iser_reg_page_vec(struct ib_conn *ib_conn,
371 struct iser_page_vec *page_vec,
372 struct iser_mem_reg *mem_reg)
373{
374 struct ib_pool_fmr *mem;
375 u64 io_addr;
376 u64 *page_list;
377 int status;
378
379 page_list = page_vec->pages;
380 io_addr = page_list[0];
381
382 mem = ib_fmr_pool_map_phys(ib_conn->fmr.pool,
383 page_list,
384 page_vec->length,
385 io_addr);
386
387 if (IS_ERR(mem)) {
388 status = (int)PTR_ERR(mem);
389 iser_err("ib_fmr_pool_map_phys failed: %d\n", status);
390 return status;
391 }
392
393 mem_reg->lkey = mem->fmr->lkey;
394 mem_reg->rkey = mem->fmr->rkey;
395 mem_reg->len = page_vec->length * SIZE_4K;
396 mem_reg->va = io_addr;
397 mem_reg->mem_h = (void *)mem;
398
399 mem_reg->va += page_vec->offset;
400 mem_reg->len = page_vec->data_size;
401
402 iser_dbg("PHYSICAL Mem.register, [PHYS p_array: 0x%p, sz: %d, "
403 "entry[0]: (0x%08lx,%ld)] -> "
404 "[lkey: 0x%08X mem_h: 0x%p va: 0x%08lX sz: %ld]\n",
405 page_vec, page_vec->length,
406 (unsigned long)page_vec->pages[0],
407 (unsigned long)page_vec->data_size,
408 (unsigned int)mem_reg->lkey, mem_reg->mem_h,
409 (unsigned long)mem_reg->va, (unsigned long)mem_reg->len);
410 return 0;
411}
412
413/**
414 * Unregister (previosuly registered using FMR) memory.
415 * If memory is non-FMR does nothing.
416 */
417void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,
418 enum iser_data_dir cmd_dir)
419{
420 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg;
421 int ret;
422
423 if (!reg->mem_h)
424 return;
425
426 iser_dbg("PHYSICAL Mem.Unregister mem_h %p\n", reg->mem_h);
427
428 ret = ib_fmr_pool_unmap((struct ib_pool_fmr *)reg->mem_h);
429 if (ret)
430 iser_err("ib_fmr_pool_unmap failed %d\n", ret);
431
432 reg->mem_h = NULL;
433}
434
435void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
436 enum iser_data_dir cmd_dir)
437{
438 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg;
439 struct iser_conn *iser_conn = iser_task->iser_conn;
440 struct ib_conn *ib_conn = &iser_conn->ib_conn;
441 struct fast_reg_descriptor *desc = reg->mem_h;
442
443 if (!desc)
444 return;
445
446 reg->mem_h = NULL;
447 spin_lock_bh(&ib_conn->lock);
448 list_add_tail(&desc->list, &ib_conn->fastreg.pool);
449 spin_unlock_bh(&ib_conn->lock);
450}
451
452/**
365 * iser_reg_rdma_mem_fmr - Registers memory intended for RDMA, 453 * iser_reg_rdma_mem_fmr - Registers memory intended for RDMA,
366 * using FMR (if possible) obtaining rkey and va 454 * using FMR (if possible) obtaining rkey and va
367 * 455 *
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 7ee4926925d3..986b5f4823ea 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -992,93 +992,6 @@ connect_failure:
992 return err; 992 return err;
993} 993}
994 994
995/**
996 * iser_reg_page_vec - Register physical memory
997 *
998 * returns: 0 on success, errno code on failure
999 */
1000int iser_reg_page_vec(struct ib_conn *ib_conn,
1001 struct iser_page_vec *page_vec,
1002 struct iser_mem_reg *mem_reg)
1003{
1004 struct ib_pool_fmr *mem;
1005 u64 io_addr;
1006 u64 *page_list;
1007 int status;
1008
1009 page_list = page_vec->pages;
1010 io_addr = page_list[0];
1011
1012 mem = ib_fmr_pool_map_phys(ib_conn->fmr.pool,
1013 page_list,
1014 page_vec->length,
1015 io_addr);
1016
1017 if (IS_ERR(mem)) {
1018 status = (int)PTR_ERR(mem);
1019 iser_err("ib_fmr_pool_map_phys failed: %d\n", status);
1020 return status;
1021 }
1022
1023 mem_reg->lkey = mem->fmr->lkey;
1024 mem_reg->rkey = mem->fmr->rkey;
1025 mem_reg->len = page_vec->length * SIZE_4K;
1026 mem_reg->va = io_addr;
1027 mem_reg->mem_h = (void *)mem;
1028
1029 mem_reg->va += page_vec->offset;
1030 mem_reg->len = page_vec->data_size;
1031
1032 iser_dbg("PHYSICAL Mem.register, [PHYS p_array: 0x%p, sz: %d, "
1033 "entry[0]: (0x%08lx,%ld)] -> "
1034 "[lkey: 0x%08X mem_h: 0x%p va: 0x%08lX sz: %ld]\n",
1035 page_vec, page_vec->length,
1036 (unsigned long)page_vec->pages[0],
1037 (unsigned long)page_vec->data_size,
1038 (unsigned int)mem_reg->lkey, mem_reg->mem_h,
1039 (unsigned long)mem_reg->va, (unsigned long)mem_reg->len);
1040 return 0;
1041}
1042
1043/**
1044 * Unregister (previosuly registered using FMR) memory.
1045 * If memory is non-FMR does nothing.
1046 */
1047void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,
1048 enum iser_data_dir cmd_dir)
1049{
1050 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg;
1051 int ret;
1052
1053 if (!reg->mem_h)
1054 return;
1055
1056 iser_dbg("PHYSICAL Mem.Unregister mem_h %p\n",reg->mem_h);
1057
1058 ret = ib_fmr_pool_unmap((struct ib_pool_fmr *)reg->mem_h);
1059 if (ret)
1060 iser_err("ib_fmr_pool_unmap failed %d\n", ret);
1061
1062 reg->mem_h = NULL;
1063}
1064
1065void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
1066 enum iser_data_dir cmd_dir)
1067{
1068 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg;
1069 struct iser_conn *iser_conn = iser_task->iser_conn;
1070 struct ib_conn *ib_conn = &iser_conn->ib_conn;
1071 struct fast_reg_descriptor *desc = reg->mem_h;
1072
1073 if (!desc)
1074 return;
1075
1076 reg->mem_h = NULL;
1077 spin_lock_bh(&ib_conn->lock);
1078 list_add_tail(&desc->list, &ib_conn->fastreg.pool);
1079 spin_unlock_bh(&ib_conn->lock);
1080}
1081
1082int iser_post_recvl(struct iser_conn *iser_conn) 995int iser_post_recvl(struct iser_conn *iser_conn)
1083{ 996{
1084 struct ib_recv_wr rx_wr, *rx_wr_failed; 997 struct ib_recv_wr rx_wr, *rx_wr_failed;