Commit | Line | Data |
---|---|---|
6be60aed MB |
1 | /* |
2 | * Copyright (c) 2017, 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 | #ifndef _UVERBS_STD_TYPES__ | |
34 | #define _UVERBS_STD_TYPES__ | |
35 | ||
36 | #include <rdma/uverbs_types.h> | |
52427112 | 37 | #include <rdma/uverbs_ioctl.h> |
64b19e13 | 38 | #include <rdma/ib_user_ioctl_verbs.h> |
09e3ebf8 | 39 | |
dfb13955 MB |
40 | #if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS) |
41 | const struct uverbs_object_tree_def *uverbs_default_get_objects(void); | |
52427112 MB |
42 | #else |
43 | static inline const struct uverbs_object_tree_def *uverbs_default_get_objects(void) | |
44 | { | |
45 | return NULL; | |
46 | } | |
47 | #endif | |
48 | ||
1250c304 JG |
49 | /* Returns _id, or causes a compile error if _id is not a u32. |
50 | * | |
51 | * The uobj APIs should only be used with the write based uAPI to access | |
52 | * object IDs. The write API must use a u32 for the object handle, which is | |
53 | * checked by this macro. | |
54 | */ | |
55 | #define _uobj_check_id(_id) ((_id) * typecheck(u32, _id)) | |
fd3c7904 | 56 | |
6b0d08f4 JG |
57 | #define uobj_get_type(_ufile, _object) \ |
58 | uapi_get_object((_ufile)->device->uapi, _object) | |
fd3c7904 | 59 | |
2cc1e3b8 | 60 | #define uobj_get_read(_type, _id, _ufile) \ |
6b0d08f4 | 61 | rdma_lookup_get_uobject(uobj_get_type(_ufile, _type), _ufile, \ |
9867f5c6 | 62 | _uobj_check_id(_id), UVERBS_LOOKUP_READ) |
fd3c7904 | 63 | |
1250c304 | 64 | #define ufd_get_read(_type, _fdnum, _ufile) \ |
6b0d08f4 | 65 | rdma_lookup_get_uobject(uobj_get_type(_ufile, _type), _ufile, \ |
9867f5c6 JG |
66 | (_fdnum)*typecheck(s32, _fdnum), \ |
67 | UVERBS_LOOKUP_READ) | |
2cc1e3b8 | 68 | |
1250c304 JG |
69 | static inline void *_uobj_get_obj_read(struct ib_uobject *uobj) |
70 | { | |
2cc1e3b8 JG |
71 | if (IS_ERR(uobj)) |
72 | return NULL; | |
73 | return uobj->object; | |
74 | } | |
75 | #define uobj_get_obj_read(_object, _type, _id, _ufile) \ | |
1250c304 JG |
76 | ((struct ib_##_object *)_uobj_get_obj_read( \ |
77 | uobj_get_read(_type, _id, _ufile))) | |
fd3c7904 | 78 | |
2cc1e3b8 | 79 | #define uobj_get_write(_type, _id, _ufile) \ |
6b0d08f4 | 80 | rdma_lookup_get_uobject(uobj_get_type(_ufile, _type), _ufile, \ |
9867f5c6 | 81 | _uobj_check_id(_id), UVERBS_LOOKUP_WRITE) |
fd3c7904 | 82 | |
6b0d08f4 | 83 | int __uobj_perform_destroy(const struct uverbs_api_object *obj, u32 id, |
c33e73af JG |
84 | struct ib_uverbs_file *ufile, int success_res); |
85 | #define uobj_perform_destroy(_type, _id, _ufile, _success_res) \ | |
6b0d08f4 JG |
86 | __uobj_perform_destroy(uobj_get_type(_ufile, _type), \ |
87 | _uobj_check_id(_id), _ufile, _success_res) | |
c33e73af | 88 | |
6b0d08f4 | 89 | struct ib_uobject *__uobj_get_destroy(const struct uverbs_api_object *obj, |
32ed5c00 JG |
90 | u32 id, struct ib_uverbs_file *ufile); |
91 | ||
92 | #define uobj_get_destroy(_type, _id, _ufile) \ | |
6b0d08f4 JG |
93 | __uobj_get_destroy(uobj_get_type(_ufile, _type), _uobj_check_id(_id), \ |
94 | _ufile) | |
32ed5c00 JG |
95 | |
96 | static inline void uobj_put_destroy(struct ib_uobject *uobj) | |
97 | { | |
9867f5c6 | 98 | rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE); |
32ed5c00 JG |
99 | } |
100 | ||
fd3c7904 MB |
101 | static inline void uobj_put_read(struct ib_uobject *uobj) |
102 | { | |
9867f5c6 | 103 | rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_READ); |
fd3c7904 MB |
104 | } |
105 | ||
106 | #define uobj_put_obj_read(_obj) \ | |
107 | uobj_put_read((_obj)->uobject) | |
108 | ||
109 | static inline void uobj_put_write(struct ib_uobject *uobj) | |
110 | { | |
9867f5c6 | 111 | rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE); |
fd3c7904 MB |
112 | } |
113 | ||
2c96eb7d JG |
114 | static inline int __must_check uobj_alloc_commit(struct ib_uobject *uobj, |
115 | int success_res) | |
fd3c7904 | 116 | { |
2c96eb7d JG |
117 | int ret = rdma_alloc_commit_uobject(uobj); |
118 | ||
119 | if (ret) | |
120 | return ret; | |
121 | return success_res; | |
fd3c7904 MB |
122 | } |
123 | ||
124 | static inline void uobj_alloc_abort(struct ib_uobject *uobj) | |
125 | { | |
126 | rdma_alloc_abort_uobject(uobj); | |
127 | } | |
128 | ||
6b0d08f4 JG |
129 | static inline struct ib_uobject * |
130 | __uobj_alloc(const struct uverbs_api_object *obj, struct ib_uverbs_file *ufile, | |
131 | struct ib_device **ib_dev) | |
fd3c7904 | 132 | { |
6b0d08f4 | 133 | struct ib_uobject *uobj = rdma_alloc_begin_uobject(obj, ufile); |
bbd51e88 JG |
134 | |
135 | if (!IS_ERR(uobj)) | |
136 | *ib_dev = uobj->context->device; | |
137 | return uobj; | |
fd3c7904 MB |
138 | } |
139 | ||
bbd51e88 | 140 | #define uobj_alloc(_type, _ufile, _ib_dev) \ |
6b0d08f4 | 141 | __uobj_alloc(uobj_get_type(_ufile, _type), _ufile, _ib_dev) |
fd3c7904 | 142 | |
6be60aed MB |
143 | #endif |
144 |