aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBart Van Assche <bvanassche@acm.org>2013-10-26 08:38:47 -0400
committerRoland Dreier <roland@purestorage.com>2013-11-08 17:43:17 -0500
commitb81d00bddfdccf000f29a5ba5bf7caa8f26fa00b (patch)
tree71f12b811c74b9288d0709d9bbce1d6a867cfcc1
parent848b3082dba4215e886c8a595b61f5b70247b341 (diff)
IB/srp: Introduce srp_alloc_req_data()
This patch does not change any functionality. Signed-off-by: Bart Van Assche <bvanassche@acm.org> Acked-by: David Dillow <dillowda@ornl.gov> Cc: Roland Dreier <roland@purestorage.com> Cc: Vu Pham <vu@mellanox.com> Cc: Sebastian Riemer <sebastian.riemer@profitbricks.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/ulp/srp/ib_srp.c64
1 files changed, 40 insertions, 24 deletions
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 62e1f2a1c522..735af11d9b82 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -576,6 +576,42 @@ static void srp_free_req_data(struct srp_target_port *target)
576 } 576 }
577} 577}
578 578
579static int srp_alloc_req_data(struct srp_target_port *target)
580{
581 struct srp_device *srp_dev = target->srp_host->srp_dev;
582 struct ib_device *ibdev = srp_dev->dev;
583 struct srp_request *req;
584 dma_addr_t dma_addr;
585 int i, ret = -ENOMEM;
586
587 INIT_LIST_HEAD(&target->free_reqs);
588
589 for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {
590 req = &target->req_ring[i];
591 req->fmr_list = kmalloc(target->cmd_sg_cnt * sizeof(void *),
592 GFP_KERNEL);
593 req->map_page = kmalloc(SRP_FMR_SIZE * sizeof(void *),
594 GFP_KERNEL);
595 req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL);
596 if (!req->fmr_list || !req->map_page || !req->indirect_desc)
597 goto out;
598
599 dma_addr = ib_dma_map_single(ibdev, req->indirect_desc,
600 target->indirect_size,
601 DMA_TO_DEVICE);
602 if (ib_dma_mapping_error(ibdev, dma_addr))
603 goto out;
604
605 req->indirect_dma_addr = dma_addr;
606 req->index = i;
607 list_add_tail(&req->list, &target->free_reqs);
608 }
609 ret = 0;
610
611out:
612 return ret;
613}
614
579/** 615/**
580 * srp_del_scsi_host_attr() - Remove attributes defined in the host template. 616 * srp_del_scsi_host_attr() - Remove attributes defined in the host template.
581 * @shost: SCSI host whose attributes to remove from sysfs. 617 * @shost: SCSI host whose attributes to remove from sysfs.
@@ -2433,8 +2469,7 @@ static ssize_t srp_create_target(struct device *dev,
2433 struct Scsi_Host *target_host; 2469 struct Scsi_Host *target_host;
2434 struct srp_target_port *target; 2470 struct srp_target_port *target;
2435 struct ib_device *ibdev = host->srp_dev->dev; 2471 struct ib_device *ibdev = host->srp_dev->dev;
2436 dma_addr_t dma_addr; 2472 int ret;
2437 int i, ret;
2438 2473
2439 target_host = scsi_host_alloc(&srp_template, 2474 target_host = scsi_host_alloc(&srp_template,
2440 sizeof (struct srp_target_port)); 2475 sizeof (struct srp_target_port));
@@ -2490,28 +2525,9 @@ static ssize_t srp_create_target(struct device *dev,
2490 INIT_WORK(&target->remove_work, srp_remove_work); 2525 INIT_WORK(&target->remove_work, srp_remove_work);
2491 spin_lock_init(&target->lock); 2526 spin_lock_init(&target->lock);
2492 INIT_LIST_HEAD(&target->free_tx); 2527 INIT_LIST_HEAD(&target->free_tx);
2493 INIT_LIST_HEAD(&target->free_reqs); 2528 ret = srp_alloc_req_data(target);
2494 for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) { 2529 if (ret)
2495 struct srp_request *req = &target->req_ring[i]; 2530 goto err_free_mem;
2496
2497 req->fmr_list = kmalloc(target->cmd_sg_cnt * sizeof (void *),
2498 GFP_KERNEL);
2499 req->map_page = kmalloc(SRP_FMR_SIZE * sizeof (void *),
2500 GFP_KERNEL);
2501 req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL);
2502 if (!req->fmr_list || !req->map_page || !req->indirect_desc)
2503 goto err_free_mem;
2504
2505 dma_addr = ib_dma_map_single(ibdev, req->indirect_desc,
2506 target->indirect_size,
2507 DMA_TO_DEVICE);
2508 if (ib_dma_mapping_error(ibdev, dma_addr))
2509 goto err_free_mem;
2510
2511 req->indirect_dma_addr = dma_addr;
2512 req->index = i;
2513 list_add_tail(&req->list, &target->free_reqs);
2514 }
2515 2531
2516 ib_query_gid(ibdev, host->port, 0, &target->path.sgid); 2532 ib_query_gid(ibdev, host->port, 0, &target->path.sgid);
2517 2533