mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 12:46:40 +07:00
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>
This commit is contained in:
parent
848b3082db
commit
b81d00bddf
@ -576,6 +576,42 @@ static void srp_free_req_data(struct srp_target_port *target)
|
||||
}
|
||||
}
|
||||
|
||||
static int srp_alloc_req_data(struct srp_target_port *target)
|
||||
{
|
||||
struct srp_device *srp_dev = target->srp_host->srp_dev;
|
||||
struct ib_device *ibdev = srp_dev->dev;
|
||||
struct srp_request *req;
|
||||
dma_addr_t dma_addr;
|
||||
int i, ret = -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&target->free_reqs);
|
||||
|
||||
for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {
|
||||
req = &target->req_ring[i];
|
||||
req->fmr_list = kmalloc(target->cmd_sg_cnt * sizeof(void *),
|
||||
GFP_KERNEL);
|
||||
req->map_page = kmalloc(SRP_FMR_SIZE * sizeof(void *),
|
||||
GFP_KERNEL);
|
||||
req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL);
|
||||
if (!req->fmr_list || !req->map_page || !req->indirect_desc)
|
||||
goto out;
|
||||
|
||||
dma_addr = ib_dma_map_single(ibdev, req->indirect_desc,
|
||||
target->indirect_size,
|
||||
DMA_TO_DEVICE);
|
||||
if (ib_dma_mapping_error(ibdev, dma_addr))
|
||||
goto out;
|
||||
|
||||
req->indirect_dma_addr = dma_addr;
|
||||
req->index = i;
|
||||
list_add_tail(&req->list, &target->free_reqs);
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* srp_del_scsi_host_attr() - Remove attributes defined in the host template.
|
||||
* @shost: SCSI host whose attributes to remove from sysfs.
|
||||
@ -2433,8 +2469,7 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
struct Scsi_Host *target_host;
|
||||
struct srp_target_port *target;
|
||||
struct ib_device *ibdev = host->srp_dev->dev;
|
||||
dma_addr_t dma_addr;
|
||||
int i, ret;
|
||||
int ret;
|
||||
|
||||
target_host = scsi_host_alloc(&srp_template,
|
||||
sizeof (struct srp_target_port));
|
||||
@ -2490,29 +2525,10 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
INIT_WORK(&target->remove_work, srp_remove_work);
|
||||
spin_lock_init(&target->lock);
|
||||
INIT_LIST_HEAD(&target->free_tx);
|
||||
INIT_LIST_HEAD(&target->free_reqs);
|
||||
for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {
|
||||
struct srp_request *req = &target->req_ring[i];
|
||||
|
||||
req->fmr_list = kmalloc(target->cmd_sg_cnt * sizeof (void *),
|
||||
GFP_KERNEL);
|
||||
req->map_page = kmalloc(SRP_FMR_SIZE * sizeof (void *),
|
||||
GFP_KERNEL);
|
||||
req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL);
|
||||
if (!req->fmr_list || !req->map_page || !req->indirect_desc)
|
||||
ret = srp_alloc_req_data(target);
|
||||
if (ret)
|
||||
goto err_free_mem;
|
||||
|
||||
dma_addr = ib_dma_map_single(ibdev, req->indirect_desc,
|
||||
target->indirect_size,
|
||||
DMA_TO_DEVICE);
|
||||
if (ib_dma_mapping_error(ibdev, dma_addr))
|
||||
goto err_free_mem;
|
||||
|
||||
req->indirect_dma_addr = dma_addr;
|
||||
req->index = i;
|
||||
list_add_tail(&req->list, &target->free_reqs);
|
||||
}
|
||||
|
||||
ib_query_gid(ibdev, host->port, 0, &target->path.sgid);
|
||||
|
||||
shost_printk(KERN_DEBUG, target->scsi_host, PFX
|
||||
|
Loading…
Reference in New Issue
Block a user