diff options
| -rw-r--r-- | drivers/infiniband/core/verbs.c | 39 | ||||
| -rw-r--r-- | include/rdma/ib_verbs.h | 38 |
2 files changed, 77 insertions, 0 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 3ac795115438..ca8ce7d097e3 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
| @@ -1169,6 +1169,45 @@ int ib_dereg_mr(struct ib_mr *mr) | |||
| 1169 | } | 1169 | } |
| 1170 | EXPORT_SYMBOL(ib_dereg_mr); | 1170 | EXPORT_SYMBOL(ib_dereg_mr); |
| 1171 | 1171 | ||
| 1172 | struct ib_mr *ib_create_mr(struct ib_pd *pd, | ||
| 1173 | struct ib_mr_init_attr *mr_init_attr) | ||
| 1174 | { | ||
| 1175 | struct ib_mr *mr; | ||
| 1176 | |||
| 1177 | if (!pd->device->create_mr) | ||
| 1178 | return ERR_PTR(-ENOSYS); | ||
| 1179 | |||
| 1180 | mr = pd->device->create_mr(pd, mr_init_attr); | ||
| 1181 | |||
| 1182 | if (!IS_ERR(mr)) { | ||
| 1183 | mr->device = pd->device; | ||
| 1184 | mr->pd = pd; | ||
| 1185 | mr->uobject = NULL; | ||
| 1186 | atomic_inc(&pd->usecnt); | ||
| 1187 | atomic_set(&mr->usecnt, 0); | ||
| 1188 | } | ||
| 1189 | |||
| 1190 | return mr; | ||
| 1191 | } | ||
| 1192 | EXPORT_SYMBOL(ib_create_mr); | ||
| 1193 | |||
| 1194 | int ib_destroy_mr(struct ib_mr *mr) | ||
| 1195 | { | ||
| 1196 | struct ib_pd *pd; | ||
| 1197 | int ret; | ||
| 1198 | |||
| 1199 | if (atomic_read(&mr->usecnt)) | ||
| 1200 | return -EBUSY; | ||
| 1201 | |||
| 1202 | pd = mr->pd; | ||
| 1203 | ret = mr->device->destroy_mr(mr); | ||
| 1204 | if (!ret) | ||
| 1205 | atomic_dec(&pd->usecnt); | ||
| 1206 | |||
| 1207 | return ret; | ||
| 1208 | } | ||
| 1209 | EXPORT_SYMBOL(ib_destroy_mr); | ||
| 1210 | |||
| 1172 | struct ib_mr *ib_alloc_fast_reg_mr(struct ib_pd *pd, int max_page_list_len) | 1211 | struct ib_mr *ib_alloc_fast_reg_mr(struct ib_pd *pd, int max_page_list_len) |
| 1173 | { | 1212 | { |
| 1174 | struct ib_mr *mr; | 1213 | struct ib_mr *mr; |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 6793f32ccb58..cb12e6a4e553 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
| @@ -461,6 +461,22 @@ int ib_rate_to_mult(enum ib_rate rate) __attribute_const__; | |||
| 461 | */ | 461 | */ |
| 462 | int ib_rate_to_mbps(enum ib_rate rate) __attribute_const__; | 462 | int ib_rate_to_mbps(enum ib_rate rate) __attribute_const__; |
| 463 | 463 | ||
| 464 | enum ib_mr_create_flags { | ||
| 465 | IB_MR_SIGNATURE_EN = 1, | ||
| 466 | }; | ||
| 467 | |||
| 468 | /** | ||
| 469 | * ib_mr_init_attr - Memory region init attributes passed to routine | ||
| 470 | * ib_create_mr. | ||
| 471 | * @max_reg_descriptors: max number of registration descriptors that | ||
| 472 | * may be used with registration work requests. | ||
| 473 | * @flags: MR creation flags bit mask. | ||
| 474 | */ | ||
| 475 | struct ib_mr_init_attr { | ||
| 476 | int max_reg_descriptors; | ||
| 477 | u32 flags; | ||
| 478 | }; | ||
| 479 | |||
| 464 | /** | 480 | /** |
| 465 | * mult_to_ib_rate - Convert a multiple of 2.5 Gbit/sec to an IB rate | 481 | * mult_to_ib_rate - Convert a multiple of 2.5 Gbit/sec to an IB rate |
| 466 | * enum. | 482 | * enum. |
| @@ -1407,6 +1423,9 @@ struct ib_device { | |||
| 1407 | int (*query_mr)(struct ib_mr *mr, | 1423 | int (*query_mr)(struct ib_mr *mr, |
| 1408 | struct ib_mr_attr *mr_attr); | 1424 | struct ib_mr_attr *mr_attr); |
| 1409 | int (*dereg_mr)(struct ib_mr *mr); | 1425 | int (*dereg_mr)(struct ib_mr *mr); |
| 1426 | int (*destroy_mr)(struct ib_mr *mr); | ||
| 1427 | struct ib_mr * (*create_mr)(struct ib_pd *pd, | ||
| 1428 | struct ib_mr_init_attr *mr_init_attr); | ||
| 1410 | struct ib_mr * (*alloc_fast_reg_mr)(struct ib_pd *pd, | 1429 | struct ib_mr * (*alloc_fast_reg_mr)(struct ib_pd *pd, |
| 1411 | int max_page_list_len); | 1430 | int max_page_list_len); |
| 1412 | struct ib_fast_reg_page_list * (*alloc_fast_reg_page_list)(struct ib_device *device, | 1431 | struct ib_fast_reg_page_list * (*alloc_fast_reg_page_list)(struct ib_device *device, |
| @@ -2250,6 +2269,25 @@ int ib_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr); | |||
| 2250 | */ | 2269 | */ |
| 2251 | int ib_dereg_mr(struct ib_mr *mr); | 2270 | int ib_dereg_mr(struct ib_mr *mr); |
| 2252 | 2271 | ||
| 2272 | |||
| 2273 | /** | ||
| 2274 | * ib_create_mr - Allocates a memory region that may be used for | ||
| 2275 | * signature handover operations. | ||
| 2276 | * @pd: The protection domain associated with the region. | ||
| 2277 | * @mr_init_attr: memory region init attributes. | ||
| 2278 | */ | ||
| 2279 | struct ib_mr *ib_create_mr(struct ib_pd *pd, | ||
| 2280 | struct ib_mr_init_attr *mr_init_attr); | ||
| 2281 | |||
| 2282 | /** | ||
| 2283 | * ib_destroy_mr - Destroys a memory region that was created using | ||
| 2284 | * ib_create_mr and removes it from HW translation tables. | ||
| 2285 | * @mr: The memory region to destroy. | ||
| 2286 | * | ||
| 2287 | * This function can fail, if the memory region has memory windows bound to it. | ||
| 2288 | */ | ||
| 2289 | int ib_destroy_mr(struct ib_mr *mr); | ||
| 2290 | |||
| 2253 | /** | 2291 | /** |
| 2254 | * ib_alloc_fast_reg_mr - Allocates memory region usable with the | 2292 | * ib_alloc_fast_reg_mr - Allocates memory region usable with the |
| 2255 | * IB_WR_FAST_REG_MR send work request. | 2293 | * IB_WR_FAST_REG_MR send work request. |
