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 ,
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 ;
/*
* @ 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
2018-12-17 18:15:16 +03:00
void rdma_restrack_kadd ( struct rdma_restrack_entry * res ) ;
void rdma_restrack_uadd ( struct rdma_restrack_entry * res ) ;
2018-01-28 12:17:20 +03:00
/**
* 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 ) ;
/**
* rdma_is_kernel_res ( ) - check the owner of resource
* @ res : resource entry
*/
static inline bool rdma_is_kernel_res ( struct rdma_restrack_entry * res )
{
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
/**
* rdma_restrack_set_task ( ) - set the task for this resource
* @ res : resource entry
2018-10-02 11:48:02 +03:00
* @ caller : kernel name , the current task will be used if the caller is NULL .
2018-03-02 00:57:44 +03:00
*/
2018-10-02 11:48:01 +03:00
void rdma_restrack_set_task ( struct rdma_restrack_entry * res ,
2018-10-02 11:48:02 +03:00
const char * caller ) ;
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-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 ) ;
2018-01-28 12:17:20 +03:00
# endif /* _RDMA_RESTRACK_H_ */