Commit | Line | Data |
---|---|---|
38321256 MB |
1 | /* |
2 | * Copyright (c) 2005 Topspin Communications. All rights reserved. | |
3 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. | |
4 | * Copyright (c) 2005-2017 Mellanox Technologies. All rights reserved. | |
5 | * Copyright (c) 2005 Voltaire, Inc. All rights reserved. | |
6 | * Copyright (c) 2005 PathScale, Inc. All rights reserved. | |
7 | * | |
8 | * This software is available to you under a choice of one of two | |
9 | * licenses. You may choose to be licensed under the terms of the GNU | |
10 | * General Public License (GPL) Version 2, available from the file | |
11 | * COPYING in the main directory of this source tree, or the | |
12 | * OpenIB.org BSD license below: | |
13 | * | |
14 | * Redistribution and use in source and binary forms, with or | |
15 | * without modification, are permitted provided that the following | |
16 | * conditions are met: | |
17 | * | |
18 | * - Redistributions of source code must retain the above | |
19 | * copyright notice, this list of conditions and the following | |
20 | * disclaimer. | |
21 | * | |
22 | * - Redistributions in binary form must reproduce the above | |
23 | * copyright notice, this list of conditions and the following | |
24 | * disclaimer in the documentation and/or other materials | |
25 | * provided with the distribution. | |
26 | * | |
27 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
28 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
29 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
30 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |
31 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
32 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
33 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
34 | * SOFTWARE. | |
35 | */ | |
36 | ||
37 | #ifndef RDMA_CORE_H | |
38 | #define RDMA_CORE_H | |
39 | ||
40 | #include <linux/idr.h> | |
41 | #include <rdma/uverbs_types.h> | |
a0aa309c | 42 | #include <rdma/uverbs_ioctl.h> |
38321256 MB |
43 | #include <rdma/ib_verbs.h> |
44 | #include <linux/mutex.h> | |
45 | ||
9ed3e5f4 JG |
46 | struct ib_uverbs_device; |
47 | ||
fac9658c | 48 | int uverbs_ns_idx(u16 *id, unsigned int ns_count); |
87fc2a62 | 49 | const struct uverbs_object_spec *uverbs_get_object(struct ib_uverbs_file *ufile, |
fac9658c MB |
50 | uint16_t object); |
51 | const struct uverbs_method_spec *uverbs_get_method(const struct uverbs_object_spec *object, | |
52 | uint16_t method); | |
6ef1c828 | 53 | |
e951747a JG |
54 | void uverbs_destroy_ufile_hw(struct ib_uverbs_file *ufile, |
55 | enum rdma_remove_reason reason); | |
38321256 | 56 | |
7452a3c7 JG |
57 | int uobj_destroy(struct ib_uobject *uobj); |
58 | ||
fd3c7904 MB |
59 | /* |
60 | * uverbs_uobject_get is called in order to increase the reference count on | |
61 | * an uobject. This is useful when a handler wants to keep the uobject's memory | |
62 | * alive, regardless if this uobject is still alive in the context's objects | |
63 | * repository. Objects are put via uverbs_uobject_put. | |
64 | */ | |
65 | void uverbs_uobject_get(struct ib_uobject *uobject); | |
66 | ||
67 | /* | |
68 | * In order to indicate we no longer needs this uobject, uverbs_uobject_put | |
69 | * is called. When the reference count is decreased, the uobject is freed. | |
70 | * For example, this is used when attaching a completion channel to a CQ. | |
71 | */ | |
72 | void uverbs_uobject_put(struct ib_uobject *uobject); | |
73 | ||
cf8966b3 MB |
74 | /* Indicate this fd is no longer used by this consumer, but its memory isn't |
75 | * necessarily released yet. When the last reference is put, we release the | |
76 | * memory. After this call is executed, calling uverbs_uobject_get isn't | |
77 | * allowed. | |
78 | * This must be called from the release file_operations of the file! | |
79 | */ | |
80 | void uverbs_close_fd(struct file *f); | |
81 | ||
a0aa309c | 82 | /* |
6ef1c828 | 83 | * Get an ib_uobject that corresponds to the given id from ufile, assuming |
a0aa309c MB |
84 | * the object is from the given type. Lock it to the required access when |
85 | * applicable. | |
86 | * This function could create (access == NEW), destroy (access == DESTROY) | |
87 | * or unlock (access == READ || access == WRITE) objects if required. | |
f43dbebf MB |
88 | * The action will be finalized only when uverbs_finalize_object or |
89 | * uverbs_finalize_objects are called. | |
a0aa309c | 90 | */ |
6ef1c828 | 91 | struct ib_uobject * |
6b0d08f4 | 92 | uverbs_get_uobject_from_file(u16 object_id, |
6ef1c828 | 93 | struct ib_uverbs_file *ufile, |
1250c304 | 94 | enum uverbs_obj_access access, s64 id); |
6ef1c828 | 95 | |
f43dbebf MB |
96 | /* |
97 | * Note that certain finalize stages could return a status: | |
98 | * (a) alloc_commit could return a failure if the object is committed at the | |
99 | * same time when the context is destroyed. | |
100 | * (b) remove_commit could fail if the object wasn't destroyed successfully. | |
101 | * Since multiple objects could be finalized in one transaction, it is very NOT | |
102 | * recommended to have several finalize actions which have side effects. | |
103 | * For example, it's NOT recommended to have a certain action which has both | |
104 | * a commit action and a destroy action or two destroy objects in the same | |
105 | * action. The rule of thumb is to have one destroy or commit action with | |
106 | * multiple lookups. | |
107 | * The first non zero return value of finalize_object is returned from this | |
108 | * function. For example, this could happen when we couldn't destroy an | |
109 | * object. | |
110 | */ | |
9442d8bf MB |
111 | int uverbs_finalize_object(struct ib_uobject *uobj, |
112 | enum uverbs_obj_access access, | |
113 | bool commit); | |
a0aa309c | 114 | |
0f50d88a JG |
115 | void setup_ufile_idr_uobject(struct ib_uverbs_file *ufile); |
116 | void release_ufile_idr_uobject(struct ib_uverbs_file *ufile); | |
117 | ||
9ed3e5f4 JG |
118 | /* |
119 | * This is the runtime description of the uverbs API, used by the syscall | |
120 | * machinery to validate and dispatch calls. | |
121 | */ | |
122 | ||
123 | /* | |
124 | * Depending on ID the slot pointer in the radix tree points at one of these | |
125 | * structs. | |
126 | */ | |
127 | struct uverbs_api_object { | |
128 | const struct uverbs_obj_type *type_attrs; | |
129 | const struct uverbs_obj_type_class *type_class; | |
130 | }; | |
131 | ||
132 | struct uverbs_api_ioctl_method { | |
133 | int (__rcu *handler)(struct ib_uverbs_file *ufile, | |
134 | struct uverbs_attr_bundle *ctx); | |
135 | DECLARE_BITMAP(attr_mandatory, UVERBS_API_ATTR_BKEY_LEN); | |
136 | u8 driver_method:1; | |
137 | u8 key_bitmap_len; | |
138 | u8 destroy_bkey; | |
139 | }; | |
140 | ||
141 | struct uverbs_api_attr { | |
142 | struct uverbs_attr_spec spec; | |
143 | }; | |
144 | ||
145 | struct uverbs_api_object; | |
146 | struct uverbs_api { | |
147 | /* radix tree contains struct uverbs_api_* pointers */ | |
148 | struct radix_tree_root radix; | |
149 | enum rdma_driver_id driver_id; | |
150 | }; | |
151 | ||
152 | static inline const struct uverbs_api_object * | |
153 | uapi_get_object(struct uverbs_api *uapi, u16 object_id) | |
154 | { | |
155 | return radix_tree_lookup(&uapi->radix, uapi_key_obj(object_id)); | |
156 | } | |
157 | ||
158 | char *uapi_key_format(char *S, unsigned int key); | |
159 | struct uverbs_api *uverbs_alloc_api( | |
160 | const struct uverbs_object_tree_def *const *driver_specs, | |
161 | enum rdma_driver_id driver_id); | |
162 | void uverbs_disassociate_api_pre(struct ib_uverbs_device *uverbs_dev); | |
163 | void uverbs_disassociate_api(struct uverbs_api *uapi); | |
164 | void uverbs_destroy_api(struct uverbs_api *uapi); | |
165 | ||
38321256 | 166 | #endif /* RDMA_CORE_H */ |