diff options
Diffstat (limited to 'include/rdma/restrack.h')
| -rw-r--r-- | include/rdma/restrack.h | 123 |
1 files changed, 55 insertions, 68 deletions
diff --git a/include/rdma/restrack.h b/include/rdma/restrack.h index 8f179be9d9a9..8a9bcf77dace 100644 --- a/include/rdma/restrack.h +++ b/include/rdma/restrack.h @@ -7,12 +7,18 @@ #define _RDMA_RESTRACK_H_ #include <linux/typecheck.h> -#include <linux/rwsem.h> #include <linux/sched.h> #include <linux/kref.h> #include <linux/completion.h> #include <linux/sched/task.h> #include <uapi/rdma/rdma_netlink.h> +#include <linux/xarray.h> + +/* Mark entry as containing driver specific details, it is used to provide QP subtype for now */ +#define RESTRACK_DD XA_MARK_1 + +struct ib_device; +struct sk_buff; /** * enum rdma_restrack_type - HW objects to track @@ -43,34 +49,21 @@ enum rdma_restrack_type { */ RDMA_RESTRACK_CTX, /** - * @RDMA_RESTRACK_MAX: Last entry, used for array dclarations + * @RDMA_RESTRACK_COUNTER: Statistic Counter */ - RDMA_RESTRACK_MAX -}; - -#define RDMA_RESTRACK_HASH_BITS 8 -struct rdma_restrack_entry; - -/** - * struct rdma_restrack_root - main resource tracking management - * entity, per-device - */ -struct rdma_restrack_root { - /* - * @rwsem: Read/write lock to protect lists + RDMA_RESTRACK_COUNTER, + /** + * @RDMA_RESTRACK_SRQ: Shared receive queue (SRQ) */ - struct rw_semaphore rwsem; + RDMA_RESTRACK_SRQ, /** - * @hash: global database for all resources per-device + * @RDMA_RESTRACK_DMAH: DMA handle */ - DECLARE_HASHTABLE(hash, RDMA_RESTRACK_HASH_BITS); + RDMA_RESTRACK_DMAH, /** - * @fill_res_entry: driver-specific fill function - * - * Allows rdma drivers to add their own restrack attributes. + * @RDMA_RESTRACK_MAX: Last entry, used for array dclarations */ - int (*fill_res_entry)(struct sk_buff *msg, - struct rdma_restrack_entry *entry); + RDMA_RESTRACK_MAX }; /** @@ -86,6 +79,14 @@ struct rdma_restrack_entry { * As an example for that, see mlx5 QPs with type MLX5_IB_QPT_HW_GSI */ bool valid; + /** + * @no_track: don't add this entry to restrack DB + * + * This field is used to mark an entry that doesn't need to be added to + * internal restrack DB and presented later to the users at the nldev + * query stage. + */ + u8 no_track : 1; /* * @kref: Protect destroy of the resource */ @@ -109,10 +110,6 @@ struct rdma_restrack_entry { */ const char *kern_name; /** - * @node: hash table entry - */ - struct hlist_node node; - /** * @type: various objects in restrack database */ enum rdma_restrack_type type; @@ -120,45 +117,19 @@ struct rdma_restrack_entry { * @user: user resource */ bool user; + /** + * @id: ID to expose to users + */ + u32 id; }; -/** - * rdma_restrack_init() - initialize resource tracking - * @res: resource tracking root - */ -void rdma_restrack_init(struct rdma_restrack_root *res); - -/** - * rdma_restrack_clean() - clean resource tracking - * @res: resource tracking root - */ -void rdma_restrack_clean(struct rdma_restrack_root *res); - -/** - * rdma_restrack_count() - the current usage of specific object - * @res: resource entry - * @type: actual type of object to operate - * @ns: PID namespace - */ -int rdma_restrack_count(struct rdma_restrack_root *res, - enum rdma_restrack_type type, - struct pid_namespace *ns); - -void rdma_restrack_kadd(struct rdma_restrack_entry *res); -void rdma_restrack_uadd(struct rdma_restrack_entry *res); - -/** - * rdma_restrack_del() - delete object from the reource tracking database - * @res: resource entry - * @type: actual type of object to operate - */ -void rdma_restrack_del(struct rdma_restrack_entry *res); - +int rdma_restrack_count(struct ib_device *dev, enum rdma_restrack_type type, + bool show_details); /** * rdma_is_kernel_res() - check the owner of resource * @res: resource entry */ -static inline bool rdma_is_kernel_res(struct rdma_restrack_entry *res) +static inline bool rdma_is_kernel_res(const struct rdma_restrack_entry *res) { return !res->user; } @@ -175,14 +146,6 @@ int __must_check rdma_restrack_get(struct rdma_restrack_entry *res); */ int rdma_restrack_put(struct rdma_restrack_entry *res); -/** - * rdma_restrack_set_task() - set the task for this resource - * @res: resource entry - * @caller: kernel name, the current task will be used if the caller is NULL. - */ -void rdma_restrack_set_task(struct rdma_restrack_entry *res, - const char *caller); - /* * Helper functions for rdma drivers when filling out * nldev driver attributes. @@ -193,4 +156,28 @@ int rdma_nl_put_driver_u32_hex(struct sk_buff *msg, const char *name, int rdma_nl_put_driver_u64(struct sk_buff *msg, const char *name, u64 value); int rdma_nl_put_driver_u64_hex(struct sk_buff *msg, const char *name, u64 value); +int rdma_nl_put_driver_string(struct sk_buff *msg, const char *name, + const char *str); +int rdma_nl_stat_hwcounter_entry(struct sk_buff *msg, const char *name, + u64 value); + +struct rdma_restrack_entry *rdma_restrack_get_byid(struct ib_device *dev, + enum rdma_restrack_type type, + u32 id); + +/** + * rdma_restrack_no_track() - don't add resource to the DB + * @res: resource entry + * + * Every user of this API should be cross examined. + * Probably you don't need to use this function. + */ +static inline void rdma_restrack_no_track(struct rdma_restrack_entry *res) +{ + res->no_track = true; +} +static inline bool rdma_restrack_is_tracked(struct rdma_restrack_entry *res) +{ + return !res->no_track; +} #endif /* _RDMA_RESTRACK_H_ */ |
