linux/include/rdma/restrack.h
<<
>>
Prefs
   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/**
  18 * enum rdma_restrack_type - HW objects to track
  19 */
  20enum rdma_restrack_type {
  21        /**
  22         * @RDMA_RESTRACK_PD: Protection domain (PD)
  23         */
  24        RDMA_RESTRACK_PD,
  25        /**
  26         * @RDMA_RESTRACK_CQ: Completion queue (CQ)
  27         */
  28        RDMA_RESTRACK_CQ,
  29        /**
  30         * @RDMA_RESTRACK_QP: Queue pair (QP)
  31         */
  32        RDMA_RESTRACK_QP,
  33        /**
  34         * @RDMA_RESTRACK_CM_ID: Connection Manager ID (CM_ID)
  35         */
  36        RDMA_RESTRACK_CM_ID,
  37        /**
  38         * @RDMA_RESTRACK_MR: Memory Region (MR)
  39         */
  40        RDMA_RESTRACK_MR,
  41        /**
  42         * @RDMA_RESTRACK_CTX: Verbs contexts (CTX)
  43         */
  44        RDMA_RESTRACK_CTX,
  45        /**
  46         * @RDMA_RESTRACK_MAX: Last entry, used for array dclarations
  47         */
  48        RDMA_RESTRACK_MAX
  49};
  50
  51struct ib_device;
  52
  53/**
  54 * struct rdma_restrack_entry - metadata per-entry
  55 */
  56struct rdma_restrack_entry {
  57        /**
  58         * @valid: validity indicator
  59         *
  60         * The entries are filled during rdma_restrack_add,
  61         * can be attempted to be free during rdma_restrack_del.
  62         *
  63         * As an example for that, see mlx5 QPs with type MLX5_IB_QPT_HW_GSI
  64         */
  65        bool                    valid;
  66        /*
  67         * @kref: Protect destroy of the resource
  68         */
  69        struct kref             kref;
  70        /*
  71         * @comp: Signal that all consumers of resource are completed their work
  72         */
  73        struct completion       comp;
  74        /**
  75         * @task: owner of resource tracking entity
  76         *
  77         * There are two types of entities: created by user and created
  78         * by kernel.
  79         *
  80         * This is relevant for the entities created by users.
  81         * For the entities created by kernel, this pointer will be NULL.
  82         */
  83        struct task_struct      *task;
  84        /**
  85         * @kern_name: name of owner for the kernel created entities.
  86         */
  87        const char              *kern_name;
  88        /**
  89         * @type: various objects in restrack database
  90         */
  91        enum rdma_restrack_type type;
  92        /**
  93         * @user: user resource
  94         */
  95        bool                    user;
  96        /**
  97         * @id: ID to expose to users
  98         */
  99        u32 id;
 100};
 101
 102int rdma_restrack_count(struct ib_device *dev,
 103                        enum rdma_restrack_type type,
 104                        struct pid_namespace *ns);
 105
 106void rdma_restrack_kadd(struct rdma_restrack_entry *res);
 107void rdma_restrack_uadd(struct rdma_restrack_entry *res);
 108
 109/**
 110 * rdma_restrack_del() - delete object from the reource tracking database
 111 * @res:  resource entry
 112 * @type: actual type of object to operate
 113 */
 114void rdma_restrack_del(struct rdma_restrack_entry *res);
 115
 116/**
 117 * rdma_is_kernel_res() - check the owner of resource
 118 * @res:  resource entry
 119 */
 120static inline bool rdma_is_kernel_res(struct rdma_restrack_entry *res)
 121{
 122        return !res->user;
 123}
 124
 125/**
 126 * rdma_restrack_get() - grab to protect resource from release
 127 * @res:  resource entry
 128 */
 129int __must_check rdma_restrack_get(struct rdma_restrack_entry *res);
 130
 131/**
 132 * rdma_restrack_put() - release resource
 133 * @res:  resource entry
 134 */
 135int rdma_restrack_put(struct rdma_restrack_entry *res);
 136
 137/**
 138 * rdma_restrack_set_task() - set the task for this resource
 139 * @res:  resource entry
 140 * @caller: kernel name, the current task will be used if the caller is NULL.
 141 */
 142void rdma_restrack_set_task(struct rdma_restrack_entry *res,
 143                            const char *caller);
 144
 145/*
 146 * Helper functions for rdma drivers when filling out
 147 * nldev driver attributes.
 148 */
 149int rdma_nl_put_driver_u32(struct sk_buff *msg, const char *name, u32 value);
 150int rdma_nl_put_driver_u32_hex(struct sk_buff *msg, const char *name,
 151                               u32 value);
 152int rdma_nl_put_driver_u64(struct sk_buff *msg, const char *name, u64 value);
 153int rdma_nl_put_driver_u64_hex(struct sk_buff *msg, const char *name,
 154                               u64 value);
 155struct rdma_restrack_entry *rdma_restrack_get_byid(struct ib_device *dev,
 156                                                   enum rdma_restrack_type type,
 157                                                   u32 id);
 158#endif /* _RDMA_RESTRACK_H_ */
 159