linux/include/rdma/uverbs_std_types.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2017, Mellanox Technologies inc.  All rights reserved.
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and/or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 */
  32
  33#ifndef _UVERBS_STD_TYPES__
  34#define _UVERBS_STD_TYPES__
  35
  36#include <rdma/uverbs_types.h>
  37#include <rdma/uverbs_ioctl.h>
  38#include <rdma/ib_user_ioctl_verbs.h>
  39
  40/* Returns _id, or causes a compile error if _id is not a u32.
  41 *
  42 * The uobj APIs should only be used with the write based uAPI to access
  43 * object IDs. The write API must use a u32 for the object handle, which is
  44 * checked by this macro.
  45 */
  46#define _uobj_check_id(_id) ((_id) * typecheck(u32, _id))
  47
  48#define uobj_get_type(_attrs, _object)                                         \
  49        uapi_get_object((_attrs)->ufile->device->uapi, _object)
  50
  51#define uobj_get_read(_type, _id, _attrs)                                      \
  52        rdma_lookup_get_uobject(uobj_get_type(_attrs, _type), (_attrs)->ufile, \
  53                                _uobj_check_id(_id), UVERBS_LOOKUP_READ,       \
  54                                _attrs)
  55
  56#define ufd_get_read(_type, _fdnum, _attrs)                                    \
  57        rdma_lookup_get_uobject(uobj_get_type(_attrs, _type), (_attrs)->ufile, \
  58                                (_fdnum)*typecheck(s32, _fdnum),               \
  59                                UVERBS_LOOKUP_READ, _attrs)
  60
  61static inline void *_uobj_get_obj_read(struct ib_uobject *uobj)
  62{
  63        if (IS_ERR(uobj))
  64                return NULL;
  65        return uobj->object;
  66}
  67#define uobj_get_obj_read(_object, _type, _id, _attrs)                         \
  68        ((struct ib_##_object *)_uobj_get_obj_read(                            \
  69                uobj_get_read(_type, _id, _attrs)))
  70
  71#define uobj_get_write(_type, _id, _attrs)                                     \
  72        rdma_lookup_get_uobject(uobj_get_type(_attrs, _type), (_attrs)->ufile, \
  73                                _uobj_check_id(_id), UVERBS_LOOKUP_WRITE,      \
  74                                _attrs)
  75
  76int __uobj_perform_destroy(const struct uverbs_api_object *obj, u32 id,
  77                           struct uverbs_attr_bundle *attrs);
  78#define uobj_perform_destroy(_type, _id, _attrs)                               \
  79        __uobj_perform_destroy(uobj_get_type(_attrs, _type),                   \
  80                               _uobj_check_id(_id), _attrs)
  81
  82struct ib_uobject *__uobj_get_destroy(const struct uverbs_api_object *obj,
  83                                      u32 id, struct uverbs_attr_bundle *attrs);
  84
  85#define uobj_get_destroy(_type, _id, _attrs)                                   \
  86        __uobj_get_destroy(uobj_get_type(_attrs, _type), _uobj_check_id(_id),  \
  87                           _attrs)
  88
  89static inline void uobj_put_destroy(struct ib_uobject *uobj)
  90{
  91        rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
  92}
  93
  94static inline void uobj_put_read(struct ib_uobject *uobj)
  95{
  96        rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_READ);
  97}
  98
  99#define uobj_put_obj_read(_obj)                                 \
 100        uobj_put_read((_obj)->uobject)
 101
 102static inline void uobj_put_write(struct ib_uobject *uobj)
 103{
 104        rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
 105}
 106
 107static inline int __must_check
 108uobj_alloc_commit(struct ib_uobject *uobj, struct uverbs_attr_bundle *attrs)
 109{
 110        int ret = rdma_alloc_commit_uobject(uobj, attrs);
 111
 112        if (ret)
 113                return ret;
 114        return 0;
 115}
 116
 117static inline void uobj_alloc_abort(struct ib_uobject *uobj,
 118                                    struct uverbs_attr_bundle *attrs)
 119{
 120        rdma_alloc_abort_uobject(uobj, attrs);
 121}
 122
 123static inline struct ib_uobject *
 124__uobj_alloc(const struct uverbs_api_object *obj,
 125             struct uverbs_attr_bundle *attrs, struct ib_device **ib_dev)
 126{
 127        struct ib_uobject *uobj =
 128                rdma_alloc_begin_uobject(obj, attrs->ufile, attrs);
 129
 130        if (!IS_ERR(uobj))
 131                *ib_dev = attrs->context->device;
 132        return uobj;
 133}
 134
 135#define uobj_alloc(_type, _attrs, _ib_dev)                                     \
 136        __uobj_alloc(uobj_get_type(_attrs, _type), _attrs, _ib_dev)
 137
 138static inline void uverbs_flow_action_fill_action(struct ib_flow_action *action,
 139                                                  struct ib_uobject *uobj,
 140                                                  struct ib_device *ib_dev,
 141                                                  enum ib_flow_action_type type)
 142{
 143        atomic_set(&action->usecnt, 0);
 144        action->device = ib_dev;
 145        action->type = type;
 146        action->uobject = uobj;
 147        uobj->object = action;
 148}
 149
 150struct ib_uflow_resources {
 151        size_t                  max;
 152        size_t                  num;
 153        size_t                  collection_num;
 154        size_t                  counters_num;
 155        struct ib_counters      **counters;
 156        struct ib_flow_action   **collection;
 157};
 158
 159struct ib_uflow_object {
 160        struct ib_uobject               uobject;
 161        struct ib_uflow_resources       *resources;
 162};
 163
 164struct ib_uflow_resources *flow_resources_alloc(size_t num_specs);
 165void flow_resources_add(struct ib_uflow_resources *uflow_res,
 166                        enum ib_flow_spec_type type,
 167                        void *ibobj);
 168void ib_uverbs_flow_resources_free(struct ib_uflow_resources *uflow_res);
 169
 170static inline void ib_set_flow(struct ib_uobject *uobj, struct ib_flow *ibflow,
 171                               struct ib_qp *qp, struct ib_device *device,
 172                               struct ib_uflow_resources *uflow_res)
 173{
 174        struct ib_uflow_object *uflow;
 175
 176        uobj->object = ibflow;
 177        ibflow->uobject = uobj;
 178
 179        if (qp) {
 180                atomic_inc(&qp->usecnt);
 181                ibflow->qp = qp;
 182        }
 183
 184        ibflow->device = device;
 185        uflow = container_of(uobj, typeof(*uflow), uobject);
 186        uflow->resources = uflow_res;
 187}
 188
 189struct uverbs_api_object {
 190        const struct uverbs_obj_type *type_attrs;
 191        const struct uverbs_obj_type_class *type_class;
 192        u8 disabled:1;
 193        u32 id;
 194};
 195
 196static inline u32 uobj_get_object_id(struct ib_uobject *uobj)
 197{
 198        return uobj->uapi_object->id;
 199}
 200
 201#endif
 202
 203