diff options
author | Bart Van Assche <bvanassche@acm.org> | 2013-10-26 08:38:47 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-11-08 17:43:17 -0500 |
commit | b81d00bddfdccf000f29a5ba5bf7caa8f26fa00b (patch) | |
tree | 71f12b811c74b9288d0709d9bbce1d6a867cfcc1 | |
parent | 848b3082dba4215e886c8a595b61f5b70247b341 (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.c | 64 |
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 | ||
579 | static 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 | |||
611 | out: | ||
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 | ||