1
2
3
4
5
6#ifndef _RDMA_RESTRACK_H_
7#define _RDMA_RESTRACK_H_
8
9#include <linux/typecheck.h>
10#include <linux/sched.h>
11#include <linux/kref.h>
12#include <linux/completion.h>
13#include <linux/sched/task.h>
14#include <uapi/rdma/rdma_netlink.h>
15#include <linux/xarray.h>
16
17struct ib_device;
18struct sk_buff;
19
20
21
22
23enum rdma_restrack_type {
24
25
26
27 RDMA_RESTRACK_PD,
28
29
30
31 RDMA_RESTRACK_CQ,
32
33
34
35 RDMA_RESTRACK_QP,
36
37
38
39 RDMA_RESTRACK_CM_ID,
40
41
42
43 RDMA_RESTRACK_MR,
44
45
46
47 RDMA_RESTRACK_CTX,
48
49
50
51 RDMA_RESTRACK_COUNTER,
52
53
54
55 RDMA_RESTRACK_MAX
56};
57
58
59
60
61struct rdma_restrack_entry {
62
63
64
65
66
67
68
69
70 bool valid;
71
72
73
74 struct kref kref;
75
76
77
78 struct completion comp;
79
80
81
82
83
84
85
86
87
88 struct task_struct *task;
89
90
91
92 const char *kern_name;
93
94
95
96 enum rdma_restrack_type type;
97
98
99
100 bool user;
101
102
103
104 u32 id;
105};
106
107int rdma_restrack_count(struct ib_device *dev,
108 enum rdma_restrack_type type);
109
110void rdma_restrack_kadd(struct rdma_restrack_entry *res);
111void rdma_restrack_uadd(struct rdma_restrack_entry *res);
112
113
114
115
116
117
118void rdma_restrack_del(struct rdma_restrack_entry *res);
119
120
121
122
123
124static inline bool rdma_is_kernel_res(struct rdma_restrack_entry *res)
125{
126 return !res->user;
127}
128
129
130
131
132
133int __must_check rdma_restrack_get(struct rdma_restrack_entry *res);
134
135
136
137
138
139int rdma_restrack_put(struct rdma_restrack_entry *res);
140
141
142
143
144
145
146void rdma_restrack_set_task(struct rdma_restrack_entry *res,
147 const char *caller);
148
149
150
151
152
153int rdma_nl_put_driver_u32(struct sk_buff *msg, const char *name, u32 value);
154int rdma_nl_put_driver_u32_hex(struct sk_buff *msg, const char *name,
155 u32 value);
156int rdma_nl_put_driver_u64(struct sk_buff *msg, const char *name, u64 value);
157int rdma_nl_put_driver_u64_hex(struct sk_buff *msg, const char *name,
158 u64 value);
159struct rdma_restrack_entry *rdma_restrack_get_byid(struct ib_device *dev,
160 enum rdma_restrack_type type,
161 u32 id);
162#endif
163