|
@@ -371,6 +371,7 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,
|
|
|
struct srp_fr_desc *d;
|
|
|
struct ib_mr *mr;
|
|
|
int i, ret = -EINVAL;
|
|
|
+ enum ib_mr_type mr_type;
|
|
|
|
|
|
if (pool_size <= 0)
|
|
|
goto err;
|
|
@@ -384,9 +385,13 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,
|
|
|
spin_lock_init(&pool->lock);
|
|
|
INIT_LIST_HEAD(&pool->free_list);
|
|
|
|
|
|
+ if (device->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
|
|
|
+ mr_type = IB_MR_TYPE_SG_GAPS;
|
|
|
+ else
|
|
|
+ mr_type = IB_MR_TYPE_MEM_REG;
|
|
|
+
|
|
|
for (i = 0, d = &pool->desc[0]; i < pool->size; i++, d++) {
|
|
|
- mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG,
|
|
|
- max_page_list_len);
|
|
|
+ mr = ib_alloc_mr(pd, mr_type, max_page_list_len);
|
|
|
if (IS_ERR(mr)) {
|
|
|
ret = PTR_ERR(mr);
|
|
|
if (ret == -ENOMEM)
|