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 | 2 | * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. |
| 3 | + * Copyright (c) 2020, Intel Corporation. All rights reserved. | |
| 3 | 4 | * |
| 4 | 5 | * This software is available to you under a choice of one of two |
| 5 | 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 | 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 | 266 | DECLARE_UVERBS_NAMED_METHOD( |
| 186 | 267 | UVERBS_METHOD_ADVISE_MR, |
| 187 | 268 | UVERBS_ATTR_IDR(UVERBS_ATTR_ADVISE_MR_PD_HANDLE, |
| @@ -247,6 +328,37 @@ DECLARE_UVERBS_NAMED_METHOD( · 59 unmodified lines | ||
| 247 | 328 | UVERBS_ATTR_TYPE(u32), |
| 248 | 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 | 362 | DECLARE_UVERBS_NAMED_METHOD_DESTROY( |
| 251 | 363 | UVERBS_METHOD_MR_DESTROY, |
| 252 | 364 | UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_MR_HANDLE, |
| @@ -257,10 +369,11 @@ DECLARE_UVERBS_NAMED_METHOD_DESTROY( · 4 unmodified lines | ||
| 257 | 369 | DECLARE_UVERBS_NAMED_OBJECT( |
| 258 | 370 | UVERBS_OBJECT_MR, |
| 259 | 371 | UVERBS_TYPE_ALLOC_IDR(uverbs_free_mr), |
| 372 | + &UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR), | |
| 260 | 373 | &UVERBS_METHOD(UVERBS_METHOD_DM_MR_REG), |
| 261 | 374 | &UVERBS_METHOD(UVERBS_METHOD_MR_DESTROY), |
| 262 | − &UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR), | |
| 263 | − &UVERBS_METHOD(UVERBS_METHOD_QUERY_MR)); | |
| 375 | + &UVERBS_METHOD(UVERBS_METHOD_QUERY_MR), | |
| 376 | + &UVERBS_METHOD(UVERBS_METHOD_REG_DMABUF_MR)); | |
| 264 | 377 | |
| 265 | 378 | const struct uapi_definition uverbs_def_obj_mr[] = { |
| 266 | 379 | UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MR, |
| @@ -1,5 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. |
| 3 | + * Copyright (c) 2020, Intel Corporation. All rights reserved. | |
| 3 | 4 | * |
| 4 | 5 | * This software is available to you under a choice of one of two |
| 5 | 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 | 252 | UVERBS_METHOD_MR_DESTROY, |
| 252 | 253 | UVERBS_METHOD_ADVISE_MR, |
| 253 | 254 | UVERBS_METHOD_QUERY_MR, |
| 255 | + UVERBS_METHOD_REG_DMABUF_MR, | |
| 254 | 256 | }; |
| 255 | 257 | |
| 256 | 258 | enum uverbs_attrs_mr_destroy_ids { |
| @@ -272,6 +274,18 @@ enum uverbs_attrs_query_mr_cmd_attr_ids { · 15 unmodified lines | ||
| 272 | 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 | 289 | enum uverbs_attrs_create_counters_cmd_attr_ids { |
| 276 | 290 | UVERBS_ATTR_CREATE_COUNTERS_HANDLE, |
| 277 | 291 | }; |