diff options
-rw-r--r-- | drivers/infiniband/core/Makefile | 2 | ||||
-rw-r--r-- | drivers/infiniband/core/uverbs.h | 1 | ||||
-rw-r--r-- | drivers/infiniband/core/uverbs_std_types.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/core/uverbs_std_types_dm.c | 108 | ||||
-rw-r--r-- | include/rdma/ib_verbs.h | 20 | ||||
-rw-r--r-- | include/uapi/rdma/ib_user_ioctl_cmds.h | 15 |
6 files changed, 146 insertions, 3 deletions
diff --git a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Makefile index 445c5504f605..636da34f8308 100644 --- a/drivers/infiniband/core/Makefile +++ b/drivers/infiniband/core/Makefile | |||
@@ -35,4 +35,4 @@ ib_ucm-y := ucm.o | |||
35 | ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \ | 35 | ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \ |
36 | rdma_core.o uverbs_std_types.o uverbs_ioctl.o \ | 36 | rdma_core.o uverbs_std_types.o uverbs_ioctl.o \ |
37 | uverbs_ioctl_merge.o uverbs_std_types_cq.o \ | 37 | uverbs_ioctl_merge.o uverbs_std_types_cq.o \ |
38 | uverbs_std_types_flow_action.o | 38 | uverbs_std_types_flow_action.o uverbs_std_types_dm.o |
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h index 3229e87d03cb..cfb51618ab7a 100644 --- a/drivers/infiniband/core/uverbs.h +++ b/drivers/infiniband/core/uverbs.h | |||
@@ -286,6 +286,7 @@ extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_WQ); | |||
286 | extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL); | 286 | extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL); |
287 | extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_XRCD); | 287 | extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_XRCD); |
288 | extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION); | 288 | extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION); |
289 | extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_DM); | ||
289 | 290 | ||
290 | #define IB_UVERBS_DECLARE_CMD(name) \ | 291 | #define IB_UVERBS_DECLARE_CMD(name) \ |
291 | ssize_t ib_uverbs_##name(struct ib_uverbs_file *file, \ | 292 | ssize_t ib_uverbs_##name(struct ib_uverbs_file *file, \ |
diff --git a/drivers/infiniband/core/uverbs_std_types.c b/drivers/infiniband/core/uverbs_std_types.c index 173eab8d3482..4fedf59ec396 100644 --- a/drivers/infiniband/core/uverbs_std_types.c +++ b/drivers/infiniband/core/uverbs_std_types.c | |||
@@ -311,7 +311,8 @@ static DECLARE_UVERBS_OBJECT_TREE(uverbs_default_objects, | |||
311 | &UVERBS_OBJECT(UVERBS_OBJECT_WQ), | 311 | &UVERBS_OBJECT(UVERBS_OBJECT_WQ), |
312 | &UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL), | 312 | &UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL), |
313 | &UVERBS_OBJECT(UVERBS_OBJECT_XRCD), | 313 | &UVERBS_OBJECT(UVERBS_OBJECT_XRCD), |
314 | &UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION)); | 314 | &UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION), |
315 | &UVERBS_OBJECT(UVERBS_OBJECT_DM)); | ||
315 | 316 | ||
316 | const struct uverbs_object_tree_def *uverbs_default_get_objects(void) | 317 | const struct uverbs_object_tree_def *uverbs_default_get_objects(void) |
317 | { | 318 | { |
diff --git a/drivers/infiniband/core/uverbs_std_types_dm.c b/drivers/infiniband/core/uverbs_std_types_dm.c new file mode 100644 index 000000000000..8b681575b615 --- /dev/null +++ b/drivers/infiniband/core/uverbs_std_types_dm.c | |||
@@ -0,0 +1,108 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2018, Mellanox Technologies inc. All rights reserved. | ||
3 | * | ||
4 | * 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 | * General Public License (GPL) Version 2, available from the file | ||
7 | * COPYING in the main directory of this source tree, or the | ||
8 | * OpenIB.org BSD license below: | ||
9 | * | ||
10 | * Redistribution and use in source and binary forms, with or | ||
11 | * without modification, are permitted provided that the following | ||
12 | * conditions are met: | ||
13 | * | ||
14 | * - Redistributions of source code must retain the above | ||
15 | * copyright notice, this list of conditions and the following | ||
16 | * disclaimer. | ||
17 | * | ||
18 | * - Redistributions in binary form must reproduce the above | ||
19 | * copyright notice, this list of conditions and the following | ||
20 | * disclaimer in the documentation and/or other materials | ||
21 | * provided with the distribution. | ||
22 | * | ||
23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
24 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
25 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
26 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
27 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
28 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
29 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
30 | * SOFTWARE. | ||
31 | */ | ||
32 | |||
33 | #include "uverbs.h" | ||
34 | #include <rdma/uverbs_std_types.h> | ||
35 | |||
36 | static int uverbs_free_dm(struct ib_uobject *uobject, | ||
37 | enum rdma_remove_reason why) | ||
38 | { | ||
39 | struct ib_dm *dm = uobject->object; | ||
40 | |||
41 | if (why == RDMA_REMOVE_DESTROY && atomic_read(&dm->usecnt)) | ||
42 | return -EBUSY; | ||
43 | |||
44 | return dm->device->dealloc_dm(dm); | ||
45 | } | ||
46 | |||
47 | static int UVERBS_HANDLER(UVERBS_METHOD_DM_ALLOC)(struct ib_device *ib_dev, | ||
48 | struct ib_uverbs_file *file, | ||
49 | struct uverbs_attr_bundle *attrs) | ||
50 | { | ||
51 | struct ib_ucontext *ucontext = file->ucontext; | ||
52 | struct ib_dm_alloc_attr attr = {}; | ||
53 | struct ib_uobject *uobj; | ||
54 | struct ib_dm *dm; | ||
55 | int ret; | ||
56 | |||
57 | if (!ib_dev->alloc_dm) | ||
58 | return -EOPNOTSUPP; | ||
59 | |||
60 | ret = uverbs_copy_from(&attr.length, attrs, | ||
61 | UVERBS_ATTR_ALLOC_DM_LENGTH); | ||
62 | if (ret) | ||
63 | return ret; | ||
64 | |||
65 | ret = uverbs_copy_from(&attr.alignment, attrs, | ||
66 | UVERBS_ATTR_ALLOC_DM_ALIGNMENT); | ||
67 | if (ret) | ||
68 | return ret; | ||
69 | |||
70 | uobj = uverbs_attr_get(attrs, UVERBS_ATTR_ALLOC_DM_HANDLE)->obj_attr.uobject; | ||
71 | |||
72 | dm = ib_dev->alloc_dm(ib_dev, ucontext, &attr, attrs); | ||
73 | if (IS_ERR(dm)) | ||
74 | return PTR_ERR(dm); | ||
75 | |||
76 | dm->device = ib_dev; | ||
77 | dm->length = attr.length; | ||
78 | dm->uobject = uobj; | ||
79 | atomic_set(&dm->usecnt, 0); | ||
80 | |||
81 | uobj->object = dm; | ||
82 | |||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | static DECLARE_UVERBS_NAMED_METHOD(UVERBS_METHOD_DM_ALLOC, | ||
87 | &UVERBS_ATTR_IDR(UVERBS_ATTR_ALLOC_DM_HANDLE, UVERBS_OBJECT_DM, | ||
88 | UVERBS_ACCESS_NEW, | ||
89 | UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)), | ||
90 | &UVERBS_ATTR_PTR_IN(UVERBS_ATTR_ALLOC_DM_LENGTH, | ||
91 | UVERBS_ATTR_TYPE(u64), | ||
92 | UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)), | ||
93 | &UVERBS_ATTR_PTR_IN(UVERBS_ATTR_ALLOC_DM_ALIGNMENT, | ||
94 | UVERBS_ATTR_TYPE(u32), | ||
95 | UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY))); | ||
96 | |||
97 | static DECLARE_UVERBS_NAMED_METHOD_WITH_HANDLER(UVERBS_METHOD_DM_FREE, | ||
98 | uverbs_destroy_def_handler, | ||
99 | &UVERBS_ATTR_IDR(UVERBS_ATTR_FREE_DM_HANDLE, | ||
100 | UVERBS_OBJECT_DM, | ||
101 | UVERBS_ACCESS_DESTROY, | ||
102 | UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY))); | ||
103 | |||
104 | DECLARE_UVERBS_NAMED_OBJECT(UVERBS_OBJECT_DM, | ||
105 | /* 1 is used in order to free the DM after MRs */ | ||
106 | &UVERBS_TYPE_ALLOC_IDR(1, uverbs_free_dm), | ||
107 | &UVERBS_METHOD(UVERBS_METHOD_DM_ALLOC), | ||
108 | &UVERBS_METHOD(UVERBS_METHOD_DM_FREE)); | ||
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index ed425627efd8..6806c4f5657a 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -321,6 +321,12 @@ struct ib_cq_caps { | |||
321 | u16 max_cq_moderation_period; | 321 | u16 max_cq_moderation_period; |
322 | }; | 322 | }; |
323 | 323 | ||
324 | struct ib_dm_alloc_attr { | ||
325 | u64 length; | ||
326 | u32 alignment; | ||
327 | u32 flags; | ||
328 | }; | ||
329 | |||
324 | struct ib_device_attr { | 330 | struct ib_device_attr { |
325 | u64 fw_ver; | 331 | u64 fw_ver; |
326 | __be64 sys_image_guid; | 332 | __be64 sys_image_guid; |
@@ -1769,6 +1775,14 @@ struct ib_qp { | |||
1769 | struct rdma_restrack_entry res; | 1775 | struct rdma_restrack_entry res; |
1770 | }; | 1776 | }; |
1771 | 1777 | ||
1778 | struct ib_dm { | ||
1779 | struct ib_device *device; | ||
1780 | u32 length; | ||
1781 | u32 flags; | ||
1782 | struct ib_uobject *uobject; | ||
1783 | atomic_t usecnt; | ||
1784 | }; | ||
1785 | |||
1772 | struct ib_mr { | 1786 | struct ib_mr { |
1773 | struct ib_device *device; | 1787 | struct ib_device *device; |
1774 | struct ib_pd *pd; | 1788 | struct ib_pd *pd; |
@@ -2425,7 +2439,11 @@ struct ib_device { | |||
2425 | int (*modify_flow_action_esp)(struct ib_flow_action *action, | 2439 | int (*modify_flow_action_esp)(struct ib_flow_action *action, |
2426 | const struct ib_flow_action_attrs_esp *attr, | 2440 | const struct ib_flow_action_attrs_esp *attr, |
2427 | struct uverbs_attr_bundle *attrs); | 2441 | struct uverbs_attr_bundle *attrs); |
2428 | 2442 | struct ib_dm * (*alloc_dm)(struct ib_device *device, | |
2443 | struct ib_ucontext *context, | ||
2444 | struct ib_dm_alloc_attr *attr, | ||
2445 | struct uverbs_attr_bundle *attrs); | ||
2446 | int (*dealloc_dm)(struct ib_dm *dm); | ||
2429 | /** | 2447 | /** |
2430 | * rdma netdev operation | 2448 | * rdma netdev operation |
2431 | * | 2449 | * |
diff --git a/include/uapi/rdma/ib_user_ioctl_cmds.h b/include/uapi/rdma/ib_user_ioctl_cmds.h index 500b64a444ad..6034df2625c6 100644 --- a/include/uapi/rdma/ib_user_ioctl_cmds.h +++ b/include/uapi/rdma/ib_user_ioctl_cmds.h | |||
@@ -54,6 +54,7 @@ enum uverbs_default_objects { | |||
54 | UVERBS_OBJECT_RWQ_IND_TBL, | 54 | UVERBS_OBJECT_RWQ_IND_TBL, |
55 | UVERBS_OBJECT_WQ, | 55 | UVERBS_OBJECT_WQ, |
56 | UVERBS_OBJECT_FLOW_ACTION, | 56 | UVERBS_OBJECT_FLOW_ACTION, |
57 | UVERBS_OBJECT_DM, | ||
57 | }; | 58 | }; |
58 | 59 | ||
59 | enum { | 60 | enum { |
@@ -100,4 +101,18 @@ enum uverbs_methods_actions_flow_action_ops { | |||
100 | UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY, | 101 | UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY, |
101 | }; | 102 | }; |
102 | 103 | ||
104 | enum uverbs_attrs_alloc_dm_cmd_attr_ids { | ||
105 | UVERBS_ATTR_ALLOC_DM_HANDLE, | ||
106 | UVERBS_ATTR_ALLOC_DM_LENGTH, | ||
107 | UVERBS_ATTR_ALLOC_DM_ALIGNMENT, | ||
108 | }; | ||
109 | |||
110 | enum uverbs_attrs_free_dm_cmd_attr_ids { | ||
111 | UVERBS_ATTR_FREE_DM_HANDLE, | ||
112 | }; | ||
113 | |||
114 | enum uverbs_methods_dm { | ||
115 | UVERBS_METHOD_DM_ALLOC, | ||
116 | UVERBS_METHOD_DM_FREE, | ||
117 | }; | ||
103 | #endif | 118 | #endif |