Implement a new uverbs ioctl method for memory registration with file descriptor as an extra parameter.
Unified · Split
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. | 2 | * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. |
| 3 | * Copyright (c) 2020, Intel Corporation. All rights reserved. | ||
| 3 | * | 4 | * |
| 4 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
| 5 | * licenses. You may choose to be licensed under the terms of the GNU | 6 | * licenses. You may choose to be licensed under the terms of the GNU |
| @@ -182,6 +183,86 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QUERY_MR)( · 176 unmodified lines | |||
| 182 | return IS_UVERBS_COPY_ERR(ret) ? ret : 0; | 183 | return IS_UVERBS_COPY_ERR(ret) ? ret : 0; |
| 183 | } | 184 | } |
| 184 | 185 | ||
| 186 | static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)( | ||
| 187 | struct uverbs_attr_bundle *attrs) | ||
| 188 | { | ||
| 189 | struct ib_uobject *uobj = | ||
| 190 | uverbs_attr_get_uobject(attrs, UVERBS_ATTR_REG_DMABUF_MR_HANDLE); | ||
| 191 | struct ib_pd *pd = | ||
| 192 | uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE); | ||
| 193 | struct ib_device *ib_dev = pd->device; | ||
| 194 | |||
| 195 | u64 offset, length, iova; | ||
| 196 | u32 fd, access_flags; | ||
| 197 | struct ib_mr *mr; | ||
| 198 | int ret; | ||
| 199 | |||
| 200 | if (!ib_dev->ops.reg_user_mr_dmabuf) | ||
| 201 | return -EOPNOTSUPP; | ||
| 202 | |||
| 203 | ret = uverbs_copy_from(&offset, attrs, | ||
| 204 | UVERBS_ATTR_REG_DMABUF_MR_OFFSET); | ||
| 205 | if (ret) | ||
| 206 | return ret; | ||
| 207 | |||
| 208 | ret = uverbs_copy_from(&length, attrs, | ||
| 209 | UVERBS_ATTR_REG_DMABUF_MR_LENGTH); | ||
| 210 | if (ret) | ||
| 211 | return ret; | ||
| 212 | |||
| 213 | ret = uverbs_copy_from(&iova, attrs, | ||
| 214 | UVERBS_ATTR_REG_DMABUF_MR_IOVA); | ||
| 215 | if (ret) | ||
| 216 | return ret; | ||
| 217 | |||
| 218 | if ((offset & ~PAGE_MASK) != (iova & ~PAGE_MASK)) | ||
| 219 | return -EINVAL; | ||
| 220 | |||
| 221 | ret = uverbs_copy_from(&fd, attrs, | ||
| 222 | UVERBS_ATTR_REG_DMABUF_MR_FD); | ||
| 223 | if (ret) | ||
| 224 | return ret; | ||
| 225 | |||
| 226 | ret = uverbs_get_flags32(&access_flags, attrs, | ||
| 227 | UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS, | ||
| 228 | IB_ACCESS_LOCAL_WRITE | | ||
| 229 | IB_ACCESS_REMOTE_READ | | ||
| 230 | IB_ACCESS_REMOTE_WRITE | | ||
| 231 | IB_ACCESS_REMOTE_ATOMIC | | ||
| 232 | IB_ACCESS_RELAXED_ORDERING); | ||
| 233 | if (ret) | ||
| 234 | return ret; | ||
| 235 | |||
| 236 | ret = ib_check_mr_access(ib_dev, access_flags); | ||
| 237 | if (ret) | ||
| 238 | return ret; | ||
| 239 | |||
| 240 | mr = pd->device->ops.reg_user_mr_dmabuf(pd, offset, length, iova, fd, | ||
| 241 | access_flags, | ||
| 242 | &attrs->driver_udata); | ||
| 243 | if (IS_ERR(mr)) | ||
| 244 | return PTR_ERR(mr); | ||
| 245 | |||
| 246 | mr->device = pd->device; | ||
| 247 | mr->pd = pd; | ||
| 248 | mr->type = IB_MR_TYPE_USER; | ||
| 249 | mr->uobject = uobj; | ||
| 250 | atomic_inc(&pd->usecnt); | ||
| 251 | |||
| 252 | uobj->object = mr; | ||
| 253 | |||
| 254 | uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_REG_DMABUF_MR_HANDLE); | ||
| 255 | |||
| 256 | ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY, | ||
| 257 | &mr->lkey, sizeof(mr->lkey)); | ||
| 258 | if (ret) | ||
| 259 | return ret; | ||
| 260 | |||
| 261 | ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY, | ||
| 262 | &mr->rkey, sizeof(mr->rkey)); | ||
| 263 | return ret; | ||
| 264 | } | ||
| 265 | |||
| 185 | DECLARE_UVERBS_NAMED_METHOD( | 266 | DECLARE_UVERBS_NAMED_METHOD( |
| 186 | UVERBS_METHOD_ADVISE_MR, | 267 | UVERBS_METHOD_ADVISE_MR, |
| 187 | UVERBS_ATTR_IDR(UVERBS_ATTR_ADVISE_MR_PD_HANDLE, | 268 | UVERBS_ATTR_IDR(UVERBS_ATTR_ADVISE_MR_PD_HANDLE, |
| @@ -247,6 +328,37 @@ DECLARE_UVERBS_NAMED_METHOD( · 59 unmodified lines | |||
| 247 | UVERBS_ATTR_TYPE(u32), | 328 | UVERBS_ATTR_TYPE(u32), |
| 248 | UA_MANDATORY)); | 329 | UA_MANDATORY)); |
| 249 | 330 | ||
| 331 | DECLARE_UVERBS_NAMED_METHOD( | ||
| 332 | UVERBS_METHOD_REG_DMABUF_MR, | ||
| 333 | UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DMABUF_MR_HANDLE, | ||
| 334 | UVERBS_OBJECT_MR, | ||
| 335 | UVERBS_ACCESS_NEW, | ||
| 336 | UA_MANDATORY), | ||
| 337 | UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE, | ||
| 338 | UVERBS_OBJECT_PD, | ||
| 339 | UVERBS_ACCESS_READ, | ||
| 340 | UA_MANDATORY), | ||
| 341 | UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_OFFSET, | ||
| 342 | UVERBS_ATTR_TYPE(u64), | ||
| 343 | UA_MANDATORY), | ||
| 344 | UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_LENGTH, | ||
| 345 | UVERBS_ATTR_TYPE(u64), | ||
| 346 | UA_MANDATORY), | ||
| 347 | UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_IOVA, | ||
| 348 | UVERBS_ATTR_TYPE(u64), | ||
| 349 | UA_MANDATORY), | ||
| 350 | UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_FD, | ||
| 351 | UVERBS_ATTR_TYPE(u32), | ||
| 352 | UA_MANDATORY), | ||
| 353 | UVERBS_ATTR_FLAGS_IN(UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS, | ||
| 354 | enum ib_access_flags), | ||
| 355 | UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY, | ||
| 356 | UVERBS_ATTR_TYPE(u32), | ||
| 357 | UA_MANDATORY), | ||
| 358 | UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY, | ||
| 359 | UVERBS_ATTR_TYPE(u32), | ||
| 360 | UA_MANDATORY)); | ||
| 361 | |||
| 250 | DECLARE_UVERBS_NAMED_METHOD_DESTROY( | 362 | DECLARE_UVERBS_NAMED_METHOD_DESTROY( |
| 251 | UVERBS_METHOD_MR_DESTROY, | 363 | UVERBS_METHOD_MR_DESTROY, |
| 252 | UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_MR_HANDLE, | 364 | UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_MR_HANDLE, |
| @@ -257,10 +369,11 @@ DECLARE_UVERBS_NAMED_METHOD_DESTROY( · 4 unmodified lines | |||
| 257 | DECLARE_UVERBS_NAMED_OBJECT( | 369 | DECLARE_UVERBS_NAMED_OBJECT( |
| 258 | UVERBS_OBJECT_MR, | 370 | UVERBS_OBJECT_MR, |
| 259 | UVERBS_TYPE_ALLOC_IDR(uverbs_free_mr), | 371 | UVERBS_TYPE_ALLOC_IDR(uverbs_free_mr), |
| 372 | &UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR), | ||
| 260 | &UVERBS_METHOD(UVERBS_METHOD_DM_MR_REG), | 373 | &UVERBS_METHOD(UVERBS_METHOD_DM_MR_REG), |
| 261 | &UVERBS_METHOD(UVERBS_METHOD_MR_DESTROY), | 374 | &UVERBS_METHOD(UVERBS_METHOD_MR_DESTROY), |
| 262 | &UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR), | 375 | &UVERBS_METHOD(UVERBS_METHOD_QUERY_MR), |
| 263 | &UVERBS_METHOD(UVERBS_METHOD_QUERY_MR)); | 376 | &UVERBS_METHOD(UVERBS_METHOD_REG_DMABUF_MR)); |
| 264 | 377 | ||
| 265 | const struct uapi_definition uverbs_def_obj_mr[] = { | 378 | const struct uapi_definition uverbs_def_obj_mr[] = { |
| 266 | UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MR, | 379 | UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MR, |
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. | 2 | * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. |
| 3 | * Copyright (c) 2020, Intel Corporation. All rights reserved. | ||
| 3 | * | 4 | * |
| 4 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
| 5 | * licenses. You may choose to be licensed under the terms of the GNU | 6 | * licenses. You may choose to be licensed under the terms of the GNU |
| @@ -251,6 +252,7 @@ enum uverbs_methods_mr { · 245 unmodified lines | |||
| 251 | UVERBS_METHOD_MR_DESTROY, | 252 | UVERBS_METHOD_MR_DESTROY, |
| 252 | UVERBS_METHOD_ADVISE_MR, | 253 | UVERBS_METHOD_ADVISE_MR, |
| 253 | UVERBS_METHOD_QUERY_MR, | 254 | UVERBS_METHOD_QUERY_MR, |
| 255 | UVERBS_METHOD_REG_DMABUF_MR, | ||
| 254 | }; | 256 | }; |
| 255 | 257 | ||
| 256 | enum uverbs_attrs_mr_destroy_ids { | 258 | enum uverbs_attrs_mr_destroy_ids { |
| @@ -272,6 +274,18 @@ enum uverbs_attrs_query_mr_cmd_attr_ids { · 15 unmodified lines | |||
| 272 | UVERBS_ATTR_QUERY_MR_RESP_IOVA, | 274 | UVERBS_ATTR_QUERY_MR_RESP_IOVA, |
| 273 | }; | 275 | }; |
| 274 | 276 | ||
| 277 | enum uverbs_attrs_reg_dmabuf_mr_cmd_attr_ids { | ||
| 278 | UVERBS_ATTR_REG_DMABUF_MR_HANDLE, | ||
| 279 | UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE, | ||
| 280 | UVERBS_ATTR_REG_DMABUF_MR_OFFSET, | ||
| 281 | UVERBS_ATTR_REG_DMABUF_MR_LENGTH, | ||
| 282 | UVERBS_ATTR_REG_DMABUF_MR_IOVA, | ||
| 283 | UVERBS_ATTR_REG_DMABUF_MR_FD, | ||
| 284 | UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS, | ||
| 285 | UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY, | ||
| 286 | UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY, | ||
| 287 | }; | ||
| 288 | |||
| 275 | enum uverbs_attrs_create_counters_cmd_attr_ids { | 289 | enum uverbs_attrs_create_counters_cmd_attr_ids { |
| 276 | UVERBS_ATTR_CREATE_COUNTERS_HANDLE, | 290 | UVERBS_ATTR_CREATE_COUNTERS_HANDLE, |
| 277 | }; | 291 | }; |