2018-06-05 07:48:08 +03:00
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2018-01-28 12:17:20 +03:00
/*
* Copyright ( c ) 2017 - 2018 Mellanox Technologies . All rights reserved .
*/
# ifndef _RDMA_RESTRACK_H_
# define _RDMA_RESTRACK_H_
# include <linux/typecheck.h>
# include <linux/sched.h>
# include <linux/kref.h>
# include <linux/completion.h>
2018-03-02 00:57:44 +03:00
# include <linux/sched/task.h>
2018-05-03 18:41:42 +03:00
# include <uapi/rdma/rdma_netlink.h>
2019-02-18 23:25:43 +03:00
# include <linux/xarray.h>
2018-01-28 12:17:20 +03:00
2019-07-09 15:44:47 +03:00
struct ib_device ;
struct sk_buff ;
2018-01-28 12:17:20 +03:00
/**
* enum rdma_restrack_type - HW objects to track
*/
enum rdma_restrack_type {
/**
* @ RDMA_RESTRACK_PD : Protection domain ( PD )
*/
RDMA_RESTRACK_PD ,
/**
* @ RDMA_RESTRACK_CQ : Completion queue ( CQ )
*/
RDMA_RESTRACK_CQ ,
/**
* @ RDMA_RESTRACK_QP : Queue pair ( QP )
*/
RDMA_RESTRACK_QP ,
2018-03-02 00:57:44 +03:00
/**
* @ RDMA_RESTRACK_CM_ID : Connection Manager ID ( CM_ID )
*/
RDMA_RESTRACK_CM_ID ,
2018-03-02 00:58:13 +03:00
/**
* @ RDMA_RESTRACK_MR : Memory Region ( MR )
*/
RDMA_RESTRACK_MR ,
2018-11-28 14:16:43 +03:00
/**
* @ RDMA_RESTRACK_CTX : Verbs contexts ( CTX )
*/
RDMA_RESTRACK_CTX ,
2019-07-02 13:02:31 +03:00
/**
* @ RDMA_RESTRACK_COUNTER : Statistic Counter
*/
RDMA_RESTRACK_COUNTER ,
2021-04-18 16:41:24 +03:00
/**
* @ RDMA_RESTRACK_SRQ : Shared receive queue ( SRQ )
*/
RDMA_RESTRACK_SRQ ,
2018-01-28 12:17:20 +03:00
/**
* @ RDMA_RESTRACK_MAX : Last entry , used for array dclarations
*/
RDMA_RESTRACK_MAX
} ;
/**
* struct rdma_restrack_entry - metadata per - entry
*/
struct rdma_restrack_entry {
/**
* @ valid : validity indicator
*
* The entries are filled during rdma_restrack_add ,
* can be attempted to be free during rdma_restrack_del .
*
* As an example for that , see mlx5 QPs with type MLX5_IB_QPT_HW_GSI
*/
bool valid ;
2020-11-17 10:01:47 +03:00
/**
* @ 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 ;
2018-01-28 12:17:20 +03:00
/*
* @ kref : Protect destroy of the resource
*/
struct kref kref ;
/*
* @ comp : Signal that all consumers of resource are completed their work
*/
struct completion comp ;
/**
* @ task : owner of resource tracking entity
*
* There are two types of entities : created by user and created
* by kernel .
*
* This is relevant for the entities created by users .
* For the entities created by kernel , this pointer will be NULL .
*/
struct task_struct * task ;
/**
* @ kern_name : name of owner for the kernel created entities .
*/
const char * kern_name ;
/**
* @ type : various objects in restrack database
*/
enum rdma_restrack_type type ;
2018-12-17 18:15:16 +03:00
/**
* @ user : user resource
*/
bool user ;
2019-02-18 23:25:43 +03:00
/**
* @ id : ID to expose to users
*/
u32 id ;
2018-01-28 12:17:20 +03:00
} ;
2019-01-30 13:48:58 +03:00
int rdma_restrack_count ( struct ib_device * dev ,
2019-08-15 11:38:29 +03:00
enum rdma_restrack_type type ) ;
2018-01-28 12:17:20 +03:00
/**
* rdma_is_kernel_res ( ) - check the owner of resource
* @ res : resource entry
*/
2020-09-22 12:11:06 +03:00
static inline bool rdma_is_kernel_res ( const struct rdma_restrack_entry * res )
2018-01-28 12:17:20 +03:00
{
2018-12-17 18:15:16 +03:00
return ! res - > user ;
2018-01-28 12:17:20 +03:00
}
/**
* rdma_restrack_get ( ) - grab to protect resource from release
* @ res : resource entry
*/
int __must_check rdma_restrack_get ( struct rdma_restrack_entry * res ) ;
/**
2018-03-21 18:12:42 +03:00
* rdma_restrack_put ( ) - release resource
2018-01-28 12:17:20 +03:00
* @ res : resource entry
*/
int rdma_restrack_put ( struct rdma_restrack_entry * res ) ;
2018-03-02 00:57:44 +03:00
2018-05-03 18:41:42 +03:00
/*
* Helper functions for rdma drivers when filling out
* nldev driver attributes .
*/
int rdma_nl_put_driver_u32 ( struct sk_buff * msg , const char * name , u32 value ) ;
int rdma_nl_put_driver_u32_hex ( struct sk_buff * msg , const char * name ,
u32 value ) ;
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 ) ;
2019-10-16 09:23:07 +03:00
int rdma_nl_put_driver_string ( struct sk_buff * msg , const char * name ,
const char * str ) ;
2019-10-16 09:23:08 +03:00
int rdma_nl_stat_hwcounter_entry ( struct sk_buff * msg , const char * name ,
u64 value ) ;
2019-10-16 09:23:07 +03:00
2019-02-18 23:25:44 +03:00
struct rdma_restrack_entry * rdma_restrack_get_byid ( struct ib_device * dev ,
enum rdma_restrack_type type ,
u32 id ) ;
2020-11-17 10:01:47 +03:00
/**
* rdma_restrack_no_track ( ) - don ' t add resource to the DB
* @ res : resource entry
*
2023-02-06 11:57:25 +03:00
* Every user of this API should be cross examined .
* Probably you don ' t need to use this function .
2020-11-17 10:01:47 +03:00
*/
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 ;
}
2018-01-28 12:17:20 +03:00
# endif /* _RDMA_RESTRACK_H_ */