|
@@ -199,7 +199,9 @@ static void iser_free_device_ib_res(struct iser_device *device)
|
|
|
*
|
|
|
* returns 0 on success, or errno code on failure
|
|
|
*/
|
|
|
-int iser_alloc_fmr_pool(struct ib_conn *ib_conn, unsigned cmds_max)
|
|
|
+int iser_alloc_fmr_pool(struct ib_conn *ib_conn,
|
|
|
+ unsigned cmds_max,
|
|
|
+ unsigned int size)
|
|
|
{
|
|
|
struct iser_device *device = ib_conn->device;
|
|
|
struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
|
|
@@ -216,8 +218,7 @@ int iser_alloc_fmr_pool(struct ib_conn *ib_conn, unsigned cmds_max)
|
|
|
if (!desc)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- page_vec = kmalloc(sizeof(*page_vec) +
|
|
|
- (sizeof(u64) * (ISCSI_ISER_SG_TABLESIZE + 1)),
|
|
|
+ page_vec = kmalloc(sizeof(*page_vec) + (sizeof(u64) * size),
|
|
|
GFP_KERNEL);
|
|
|
if (!page_vec) {
|
|
|
ret = -ENOMEM;
|
|
@@ -227,9 +228,7 @@ int iser_alloc_fmr_pool(struct ib_conn *ib_conn, unsigned cmds_max)
|
|
|
page_vec->pages = (u64 *)(page_vec + 1);
|
|
|
|
|
|
params.page_shift = SHIFT_4K;
|
|
|
- /* when the first/last SG element are not start/end *
|
|
|
- * page aligned, the map whould be of N+1 pages */
|
|
|
- params.max_pages_per_fmr = ISCSI_ISER_SG_TABLESIZE + 1;
|
|
|
+ params.max_pages_per_fmr = size;
|
|
|
/* make the pool size twice the max number of SCSI commands *
|
|
|
* the ML is expected to queue, watermark for unmap at 50% */
|
|
|
params.pool_size = cmds_max * 2;
|
|
@@ -282,13 +281,14 @@ void iser_free_fmr_pool(struct ib_conn *ib_conn)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-iser_alloc_reg_res(struct ib_device *ib_device, struct ib_pd *pd,
|
|
|
- struct iser_reg_resources *res)
|
|
|
+iser_alloc_reg_res(struct ib_device *ib_device,
|
|
|
+ struct ib_pd *pd,
|
|
|
+ struct iser_reg_resources *res,
|
|
|
+ unsigned int size)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- res->frpl = ib_alloc_fast_reg_page_list(ib_device,
|
|
|
- ISCSI_ISER_SG_TABLESIZE + 1);
|
|
|
+ res->frpl = ib_alloc_fast_reg_page_list(ib_device, size);
|
|
|
if (IS_ERR(res->frpl)) {
|
|
|
ret = PTR_ERR(res->frpl);
|
|
|
iser_err("Failed to allocate ib_fast_reg_page_list err=%d\n",
|
|
@@ -296,8 +296,7 @@ iser_alloc_reg_res(struct ib_device *ib_device, struct ib_pd *pd,
|
|
|
return PTR_ERR(res->frpl);
|
|
|
}
|
|
|
|
|
|
- res->mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG,
|
|
|
- ISCSI_ISER_SG_TABLESIZE + 1);
|
|
|
+ res->mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG, size);
|
|
|
if (IS_ERR(res->mr)) {
|
|
|
ret = PTR_ERR(res->mr);
|
|
|
iser_err("Failed to allocate ib_fast_reg_mr err=%d\n", ret);
|
|
@@ -321,8 +320,10 @@ iser_free_reg_res(struct iser_reg_resources *rsc)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-iser_alloc_pi_ctx(struct ib_device *ib_device, struct ib_pd *pd,
|
|
|
- struct iser_fr_desc *desc)
|
|
|
+iser_alloc_pi_ctx(struct ib_device *ib_device,
|
|
|
+ struct ib_pd *pd,
|
|
|
+ struct iser_fr_desc *desc,
|
|
|
+ unsigned int size)
|
|
|
{
|
|
|
struct iser_pi_context *pi_ctx = NULL;
|
|
|
int ret;
|
|
@@ -333,7 +334,7 @@ iser_alloc_pi_ctx(struct ib_device *ib_device, struct ib_pd *pd,
|
|
|
|
|
|
pi_ctx = desc->pi_ctx;
|
|
|
|
|
|
- ret = iser_alloc_reg_res(ib_device, pd, &pi_ctx->rsc);
|
|
|
+ ret = iser_alloc_reg_res(ib_device, pd, &pi_ctx->rsc, size);
|
|
|
if (ret) {
|
|
|
iser_err("failed to allocate reg_resources\n");
|
|
|
goto alloc_reg_res_err;
|
|
@@ -366,8 +367,10 @@ iser_free_pi_ctx(struct iser_pi_context *pi_ctx)
|
|
|
}
|
|
|
|
|
|
static struct iser_fr_desc *
|
|
|
-iser_create_fastreg_desc(struct ib_device *ib_device, struct ib_pd *pd,
|
|
|
- bool pi_enable)
|
|
|
+iser_create_fastreg_desc(struct ib_device *ib_device,
|
|
|
+ struct ib_pd *pd,
|
|
|
+ bool pi_enable,
|
|
|
+ unsigned int size)
|
|
|
{
|
|
|
struct iser_fr_desc *desc;
|
|
|
int ret;
|
|
@@ -376,12 +379,12 @@ iser_create_fastreg_desc(struct ib_device *ib_device, struct ib_pd *pd,
|
|
|
if (!desc)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- ret = iser_alloc_reg_res(ib_device, pd, &desc->rsc);
|
|
|
+ ret = iser_alloc_reg_res(ib_device, pd, &desc->rsc, size);
|
|
|
if (ret)
|
|
|
goto reg_res_alloc_failure;
|
|
|
|
|
|
if (pi_enable) {
|
|
|
- ret = iser_alloc_pi_ctx(ib_device, pd, desc);
|
|
|
+ ret = iser_alloc_pi_ctx(ib_device, pd, desc, size);
|
|
|
if (ret)
|
|
|
goto pi_ctx_alloc_failure;
|
|
|
}
|
|
@@ -401,7 +404,9 @@ reg_res_alloc_failure:
|
|
|
* for fast registration work requests.
|
|
|
* returns 0 on success, or errno code on failure
|
|
|
*/
|
|
|
-int iser_alloc_fastreg_pool(struct ib_conn *ib_conn, unsigned cmds_max)
|
|
|
+int iser_alloc_fastreg_pool(struct ib_conn *ib_conn,
|
|
|
+ unsigned cmds_max,
|
|
|
+ unsigned int size)
|
|
|
{
|
|
|
struct iser_device *device = ib_conn->device;
|
|
|
struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
|
|
@@ -413,7 +418,7 @@ int iser_alloc_fastreg_pool(struct ib_conn *ib_conn, unsigned cmds_max)
|
|
|
fr_pool->size = 0;
|
|
|
for (i = 0; i < cmds_max; i++) {
|
|
|
desc = iser_create_fastreg_desc(device->ib_device, device->pd,
|
|
|
- ib_conn->pi_support);
|
|
|
+ ib_conn->pi_support, size);
|
|
|
if (IS_ERR(desc)) {
|
|
|
ret = PTR_ERR(desc);
|
|
|
goto err;
|