History

IB/uverbs: Add alloc/free dm uverbs ioctl support

This change adds uverbs support for allocation/freeing of device memory commands. A new uverbs object is defined of type idr to represent and track the new resource type allocation per context. The API requires provider driver to implement 2 new ib_device callbacks - one for allocation and one for deallocation which return and accept (respectively) the ib_dm object which represents the allocated memory on the device. The support is added via the ioctl command infrastructure only.

Ariel Levkovich committed 8 years ago

Commit bee76d71 parent 1d8eeb96 files · +146 −3Browse files

Unified · Split

6 files
  1. drivers/infiniband/core/Makefile +1 −1
  2. drivers/infiniband/core/uverbs.h +1 −0
  3. drivers/infiniband/core/uverbs_std_types.c +2 −1
  4. drivers/infiniband/core/uverbs_std_types_dm.c +108 −0
  5. include/rdma/ib_verbs.h +19 −1
  6. include/uapi/rdma/ib_user_ioctl_cmds.h +15 −0
drivers/infiniband/core/Makefile+1−1
@@ -35,4 +35,4 @@ ib_ucm-y := ucm.o · 34 unmodified lines
3535 ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \
3636 rdma_core.o uverbs_std_types.o uverbs_ioctl.o \
3737 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
drivers/infiniband/core/uverbs.h+1−0
@@ -286,6 +286,7 @@ extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_WQ); · 285 unmodified lines
286286 extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL);
287287 extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_XRCD);
288288 extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION);
289+extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_DM);
289290
290291 #define IB_UVERBS_DECLARE_CMD(name) \
291292 ssize_t ib_uverbs_##name(struct ib_uverbs_file *file, \
drivers/infiniband/core/uverbs_std_types.c+2−1
@@ -311,7 +311,8 @@ static DECLARE_UVERBS_OBJECT_TREE(uverbs_default_objects, · 310 unmodified lines
311311 &UVERBS_OBJECT(UVERBS_OBJECT_WQ),
312312 &UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL),
313313 &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));
315316
316317 const struct uverbs_object_tree_def *uverbs_default_get_objects(void)
317318 {
drivers/infiniband/core/uverbs_std_types_dm.c+108−0
@@ -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));
include/rdma/ib_verbs.h+19−1
@@ -321,6 +321,12 @@ struct ib_cq_caps { · 320 unmodified lines
321321 u16 max_cq_moderation_period;
322322 };
323323
324+struct ib_dm_alloc_attr {
325+ u64 length;
326+ u32 alignment;
327+ u32 flags;
328+};
329+
324330 struct ib_device_attr {
325331 u64 fw_ver;
326332 __be64 sys_image_guid;
@@ -1769,6 +1775,14 @@ struct ib_qp { · 1442 unmodified lines
17691775 struct rdma_restrack_entry res;
17701776 };
17711777
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+
17721786 struct ib_mr {
17731787 struct ib_device *device;
17741788 struct ib_pd *pd;
@@ -2425,7 +2439,11 @@ struct ib_device { · 650 unmodified lines
24252439 int (*modify_flow_action_esp)(struct ib_flow_action *action,
24262440 const struct ib_flow_action_attrs_esp *attr,
24272441 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);
24292447 /**
24302448 * rdma netdev operation
24312449 *
include/uapi/rdma/ib_user_ioctl_cmds.h+15−0
@@ -54,6 +54,7 @@ enum uverbs_default_objects { · 53 unmodified lines
5454 UVERBS_OBJECT_RWQ_IND_TBL,
5555 UVERBS_OBJECT_WQ,
5656 UVERBS_OBJECT_FLOW_ACTION,
57+ UVERBS_OBJECT_DM,
5758 };
5859
5960 enum {
@@ -100,4 +101,18 @@ enum uverbs_methods_actions_flow_action_ops { · 40 unmodified lines
100101 UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY,
101102 };
102103
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+};
103118 #endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t