summaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/iser/iser_memory.c
diff options
context:
space:
mode:
authorAdir Lev <adirl@mellanox.com>2015-08-06 18:32:59 +0300
committerDoug Ledford <dledford@redhat.com>2015-08-30 18:12:30 -0400
commit2b3bf958103899a96d230c9f2e0d87606f08a7be (patch)
tree9639c689b81d58f16f201d6a8d6ffa22e3570668 /drivers/infiniband/ulp/iser/iser_memory.c
parent385ad87d4b637c1ebdb54bc93274fc2c267dfc16 (diff)
downloadlinux-2b3bf958103899a96d230c9f2e0d87606f08a7be.tar.bz2
IB/iser: Maintain connection fmr_pool under a single registration descriptor
This will allow us to unify the memory registration code path between the various methods which vary by the device capabilities. This change will make it easier and less intrusive to remove fmr_pools from the code when we'd want to. The reason we use a single descriptor is to avoid taking a redundant spinlock when working with FMRs. We also change the signature of iser_reg_page_vec to make it match iser_fast_reg_mr (and the future indirect registration method). Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Adir Lev <adirl@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/ulp/iser/iser_memory.c')
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index d731ed7616c8..c79292975261 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -189,7 +189,7 @@ iser_reg_desc_get(struct ib_conn *ib_conn)
unsigned long flags;
spin_lock_irqsave(&fr_pool->lock, flags);
- desc = list_first_entry(&fr_pool->fastreg.pool,
+ desc = list_first_entry(&fr_pool->list,
struct iser_fr_desc, list);
list_del(&desc->list);
spin_unlock_irqrestore(&fr_pool->lock, flags);
@@ -205,7 +205,7 @@ iser_reg_desc_put(struct ib_conn *ib_conn,
unsigned long flags;
spin_lock_irqsave(&fr_pool->lock, flags);
- list_add(&desc->list, &fr_pool->fastreg.pool);
+ list_add(&desc->list, &fr_pool->list);
spin_unlock_irqrestore(&fr_pool->lock, flags);
}
@@ -478,12 +478,13 @@ static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task,
static
int iser_reg_page_vec(struct iscsi_iser_task *iser_task,
struct iser_data_buf *mem,
- struct iser_page_vec *page_vec,
+ struct iser_reg_resources *rsc,
struct iser_mem_reg *mem_reg)
{
struct ib_conn *ib_conn = &iser_task->iser_conn->ib_conn;
- struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
struct iser_device *device = ib_conn->device;
+ struct iser_page_vec *page_vec = rsc->page_vec;
+ struct ib_fmr_pool *fmr_pool = rsc->fmr_pool;
struct ib_pool_fmr *fmr;
int ret, plen;
@@ -499,7 +500,7 @@ int iser_reg_page_vec(struct iscsi_iser_task *iser_task,
return -EINVAL;
}
- fmr = ib_fmr_pool_map_phys(fr_pool->fmr.pool,
+ fmr = ib_fmr_pool_map_phys(fmr_pool,
page_vec->pages,
page_vec->length,
page_vec->pages[0]);
@@ -587,20 +588,23 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
if (mem->dma_nents == 1) {
return iser_reg_dma(device, mem, mem_reg);
} else { /* use FMR for multiple dma entries */
- err = iser_reg_page_vec(iser_task, mem,
- fr_pool->fmr.page_vec, mem_reg);
+ struct iser_fr_desc *desc;
+
+ desc = list_first_entry(&fr_pool->list,
+ struct iser_fr_desc, list);
+ err = iser_reg_page_vec(iser_task, mem, &desc->rsc, mem_reg);
if (err && err != -EAGAIN) {
iser_data_buf_dump(mem, ibdev);
iser_err("mem->dma_nents = %d (dlength = 0x%x)\n",
mem->dma_nents,
ntoh24(iser_task->desc.iscsi_header.dlength));
iser_err("page_vec: data_size = 0x%x, length = %d, offset = 0x%x\n",
- fr_pool->fmr.page_vec->data_size,
- fr_pool->fmr.page_vec->length,
- fr_pool->fmr.page_vec->offset);
- for (i = 0; i < fr_pool->fmr.page_vec->length; i++)
+ desc->rsc.page_vec->data_size,
+ desc->rsc.page_vec->length,
+ desc->rsc.page_vec->offset);
+ for (i = 0; i < desc->rsc.page_vec->length; i++)
iser_err("page_vec[%d] = 0x%llx\n", i,
- (unsigned long long)fr_pool->fmr.page_vec->pages[i]);
+ (unsigned long long)desc->rsc.page_vec->pages[i]);
}
if (err)
return err;