Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/rdma/restrack.h
26278 views
1
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2
/*
3
* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved.
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
17
/* Mark entry as containing driver specific details, it is used to provide QP subtype for now */
18
#define RESTRACK_DD XA_MARK_1
19
20
struct ib_device;
21
struct sk_buff;
22
23
/**
24
* enum rdma_restrack_type - HW objects to track
25
*/
26
enum rdma_restrack_type {
27
/**
28
* @RDMA_RESTRACK_PD: Protection domain (PD)
29
*/
30
RDMA_RESTRACK_PD,
31
/**
32
* @RDMA_RESTRACK_CQ: Completion queue (CQ)
33
*/
34
RDMA_RESTRACK_CQ,
35
/**
36
* @RDMA_RESTRACK_QP: Queue pair (QP)
37
*/
38
RDMA_RESTRACK_QP,
39
/**
40
* @RDMA_RESTRACK_CM_ID: Connection Manager ID (CM_ID)
41
*/
42
RDMA_RESTRACK_CM_ID,
43
/**
44
* @RDMA_RESTRACK_MR: Memory Region (MR)
45
*/
46
RDMA_RESTRACK_MR,
47
/**
48
* @RDMA_RESTRACK_CTX: Verbs contexts (CTX)
49
*/
50
RDMA_RESTRACK_CTX,
51
/**
52
* @RDMA_RESTRACK_COUNTER: Statistic Counter
53
*/
54
RDMA_RESTRACK_COUNTER,
55
/**
56
* @RDMA_RESTRACK_SRQ: Shared receive queue (SRQ)
57
*/
58
RDMA_RESTRACK_SRQ,
59
/**
60
* @RDMA_RESTRACK_DMAH: DMA handle
61
*/
62
RDMA_RESTRACK_DMAH,
63
/**
64
* @RDMA_RESTRACK_MAX: Last entry, used for array dclarations
65
*/
66
RDMA_RESTRACK_MAX
67
};
68
69
/**
70
* struct rdma_restrack_entry - metadata per-entry
71
*/
72
struct rdma_restrack_entry {
73
/**
74
* @valid: validity indicator
75
*
76
* The entries are filled during rdma_restrack_add,
77
* can be attempted to be free during rdma_restrack_del.
78
*
79
* As an example for that, see mlx5 QPs with type MLX5_IB_QPT_HW_GSI
80
*/
81
bool valid;
82
/**
83
* @no_track: don't add this entry to restrack DB
84
*
85
* This field is used to mark an entry that doesn't need to be added to
86
* internal restrack DB and presented later to the users at the nldev
87
* query stage.
88
*/
89
u8 no_track : 1;
90
/*
91
* @kref: Protect destroy of the resource
92
*/
93
struct kref kref;
94
/*
95
* @comp: Signal that all consumers of resource are completed their work
96
*/
97
struct completion comp;
98
/**
99
* @task: owner of resource tracking entity
100
*
101
* There are two types of entities: created by user and created
102
* by kernel.
103
*
104
* This is relevant for the entities created by users.
105
* For the entities created by kernel, this pointer will be NULL.
106
*/
107
struct task_struct *task;
108
/**
109
* @kern_name: name of owner for the kernel created entities.
110
*/
111
const char *kern_name;
112
/**
113
* @type: various objects in restrack database
114
*/
115
enum rdma_restrack_type type;
116
/**
117
* @user: user resource
118
*/
119
bool user;
120
/**
121
* @id: ID to expose to users
122
*/
123
u32 id;
124
};
125
126
int rdma_restrack_count(struct ib_device *dev, enum rdma_restrack_type type,
127
bool show_details);
128
/**
129
* rdma_is_kernel_res() - check the owner of resource
130
* @res: resource entry
131
*/
132
static inline bool rdma_is_kernel_res(const struct rdma_restrack_entry *res)
133
{
134
return !res->user;
135
}
136
137
/**
138
* rdma_restrack_get() - grab to protect resource from release
139
* @res: resource entry
140
*/
141
int __must_check rdma_restrack_get(struct rdma_restrack_entry *res);
142
143
/**
144
* rdma_restrack_put() - release resource
145
* @res: resource entry
146
*/
147
int rdma_restrack_put(struct rdma_restrack_entry *res);
148
149
/*
150
* Helper functions for rdma drivers when filling out
151
* nldev driver attributes.
152
*/
153
int rdma_nl_put_driver_u32(struct sk_buff *msg, const char *name, u32 value);
154
int rdma_nl_put_driver_u32_hex(struct sk_buff *msg, const char *name,
155
u32 value);
156
int rdma_nl_put_driver_u64(struct sk_buff *msg, const char *name, u64 value);
157
int rdma_nl_put_driver_u64_hex(struct sk_buff *msg, const char *name,
158
u64 value);
159
int rdma_nl_put_driver_string(struct sk_buff *msg, const char *name,
160
const char *str);
161
int rdma_nl_stat_hwcounter_entry(struct sk_buff *msg, const char *name,
162
u64 value);
163
164
struct rdma_restrack_entry *rdma_restrack_get_byid(struct ib_device *dev,
165
enum rdma_restrack_type type,
166
u32 id);
167
168
/**
169
* rdma_restrack_no_track() - don't add resource to the DB
170
* @res: resource entry
171
*
172
* Every user of this API should be cross examined.
173
* Probably you don't need to use this function.
174
*/
175
static inline void rdma_restrack_no_track(struct rdma_restrack_entry *res)
176
{
177
res->no_track = true;
178
}
179
static inline bool rdma_restrack_is_tracked(struct rdma_restrack_entry *res)
180
{
181
return !res->no_track;
182
}
183
#endif /* _RDMA_RESTRACK_H_ */
184
185