linux/include/rdma/uverbs_ioctl.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
   2/*
   3 * Copyright (c) 2017, Mellanox Technologies inc.  All rights reserved.
   4 */
   5
   6#ifndef _UVERBS_IOCTL_
   7#define _UVERBS_IOCTL_
   8
   9#include <rdma/uverbs_types.h>
  10#include <linux/uaccess.h>
  11#include <rdma/rdma_user_ioctl.h>
  12#include <rdma/ib_user_ioctl_verbs.h>
  13#include <rdma/ib_user_ioctl_cmds.h>
  14
  15/*
  16 * =======================================
  17 *      Verbs action specifications
  18 * =======================================
  19 */
  20
  21enum uverbs_attr_type {
  22        UVERBS_ATTR_TYPE_NA,
  23        UVERBS_ATTR_TYPE_PTR_IN,
  24        UVERBS_ATTR_TYPE_PTR_OUT,
  25        UVERBS_ATTR_TYPE_IDR,
  26        UVERBS_ATTR_TYPE_FD,
  27        UVERBS_ATTR_TYPE_ENUM_IN,
  28        UVERBS_ATTR_TYPE_IDRS_ARRAY,
  29};
  30
  31enum uverbs_obj_access {
  32        UVERBS_ACCESS_READ,
  33        UVERBS_ACCESS_WRITE,
  34        UVERBS_ACCESS_NEW,
  35        UVERBS_ACCESS_DESTROY
  36};
  37
  38/* Specification of a single attribute inside the ioctl message */
  39/* good size 16 */
  40struct uverbs_attr_spec {
  41        u8 type;
  42
  43        /*
  44         * Support extending attributes by length. Allow the user to provide
  45         * more bytes than ptr.len, but check that everything after is zero'd
  46         * by the user.
  47         */
  48        u8 zero_trailing:1;
  49        /*
  50         * Valid only for PTR_IN. Allocate and copy the data inside
  51         * the parser
  52         */
  53        u8 alloc_and_copy:1;
  54        u8 mandatory:1;
  55        /* True if this is from UVERBS_ATTR_UHW */
  56        u8 is_udata:1;
  57
  58        union {
  59                struct {
  60                        /* Current known size to kernel */
  61                        u16 len;
  62                        /* User isn't allowed to provide something < min_len */
  63                        u16 min_len;
  64                } ptr;
  65
  66                struct {
  67                        /*
  68                         * higher bits mean the namespace and lower bits mean
  69                         * the type id within the namespace.
  70                         */
  71                        u16 obj_type;
  72                        u8 access;
  73                } obj;
  74
  75                struct {
  76                        u8 num_elems;
  77                } enum_def;
  78        } u;
  79
  80        /* This weird split lets us remove some padding */
  81        union {
  82                struct {
  83                        /*
  84                         * The enum attribute can select one of the attributes
  85                         * contained in the ids array. Currently only PTR_IN
  86                         * attributes are supported in the ids array.
  87                         */
  88                        const struct uverbs_attr_spec *ids;
  89                } enum_def;
  90
  91                struct {
  92                        /*
  93                         * higher bits mean the namespace and lower bits mean
  94                         * the type id within the namespace.
  95                         */
  96                        u16                             obj_type;
  97                        u16                             min_len;
  98                        u16                             max_len;
  99                        u8                              access;
 100                } objs_arr;
 101        } u2;
 102};
 103
 104/*
 105 * Information about the API is loaded into a radix tree. For IOCTL we start
 106 * with a tuple of:
 107 *  object_id, attr_id, method_id
 108 *
 109 * Which is a 48 bit value, with most of the bits guaranteed to be zero. Based
 110 * on the current kernel support this is compressed into 16 bit key for the
 111 * radix tree. Since this compression is entirely internal to the kernel the
 112 * below limits can be revised if the kernel gains additional data.
 113 *
 114 * With 64 leafs per node this is a 3 level radix tree.
 115 *
 116 * The tree encodes multiple types, and uses a scheme where OBJ_ID,0,0 returns
 117 * the object slot, and OBJ_ID,METH_ID,0 and returns the method slot.
 118 *
 119 * This also encodes the tables for the write() and write() extended commands
 120 * using the coding
 121 *   OBJ_ID,UVERBS_API_METHOD_IS_WRITE,command #
 122 *   OBJ_ID,UVERBS_API_METHOD_IS_WRITE_EX,command_ex #
 123 * ie the WRITE path is treated as a special method type in the ioctl
 124 * framework.
 125 */
 126enum uapi_radix_data {
 127        UVERBS_API_NS_FLAG = 1U << UVERBS_ID_NS_SHIFT,
 128
 129        UVERBS_API_ATTR_KEY_BITS = 6,
 130        UVERBS_API_ATTR_KEY_MASK = GENMASK(UVERBS_API_ATTR_KEY_BITS - 1, 0),
 131        UVERBS_API_ATTR_BKEY_LEN = (1 << UVERBS_API_ATTR_KEY_BITS) - 1,
 132        UVERBS_API_WRITE_KEY_NUM = 1 << UVERBS_API_ATTR_KEY_BITS,
 133
 134        UVERBS_API_METHOD_KEY_BITS = 5,
 135        UVERBS_API_METHOD_KEY_SHIFT = UVERBS_API_ATTR_KEY_BITS,
 136        UVERBS_API_METHOD_KEY_NUM_CORE = 22,
 137        UVERBS_API_METHOD_IS_WRITE = 30 << UVERBS_API_METHOD_KEY_SHIFT,
 138        UVERBS_API_METHOD_IS_WRITE_EX = 31 << UVERBS_API_METHOD_KEY_SHIFT,
 139        UVERBS_API_METHOD_KEY_NUM_DRIVER =
 140                (UVERBS_API_METHOD_IS_WRITE >> UVERBS_API_METHOD_KEY_SHIFT) -
 141                UVERBS_API_METHOD_KEY_NUM_CORE,
 142        UVERBS_API_METHOD_KEY_MASK = GENMASK(
 143                UVERBS_API_METHOD_KEY_BITS + UVERBS_API_METHOD_KEY_SHIFT - 1,
 144                UVERBS_API_METHOD_KEY_SHIFT),
 145
 146        UVERBS_API_OBJ_KEY_BITS = 5,
 147        UVERBS_API_OBJ_KEY_SHIFT =
 148                UVERBS_API_METHOD_KEY_BITS + UVERBS_API_METHOD_KEY_SHIFT,
 149        UVERBS_API_OBJ_KEY_NUM_CORE = 20,
 150        UVERBS_API_OBJ_KEY_NUM_DRIVER =
 151                (1 << UVERBS_API_OBJ_KEY_BITS) - UVERBS_API_OBJ_KEY_NUM_CORE,
 152        UVERBS_API_OBJ_KEY_MASK = GENMASK(31, UVERBS_API_OBJ_KEY_SHIFT),
 153
 154        /* This id guaranteed to not exist in the radix tree */
 155        UVERBS_API_KEY_ERR = 0xFFFFFFFF,
 156};
 157
 158static inline __attribute_const__ u32 uapi_key_obj(u32 id)
 159{
 160        if (id & UVERBS_API_NS_FLAG) {
 161                id &= ~UVERBS_API_NS_FLAG;
 162                if (id >= UVERBS_API_OBJ_KEY_NUM_DRIVER)
 163                        return UVERBS_API_KEY_ERR;
 164                id = id + UVERBS_API_OBJ_KEY_NUM_CORE;
 165        } else {
 166                if (id >= UVERBS_API_OBJ_KEY_NUM_CORE)
 167                        return UVERBS_API_KEY_ERR;
 168        }
 169
 170        return id << UVERBS_API_OBJ_KEY_SHIFT;
 171}
 172
 173static inline __attribute_const__ bool uapi_key_is_object(u32 key)
 174{
 175        return (key & ~UVERBS_API_OBJ_KEY_MASK) == 0;
 176}
 177
 178static inline __attribute_const__ u32 uapi_key_ioctl_method(u32 id)
 179{
 180        if (id & UVERBS_API_NS_FLAG) {
 181                id &= ~UVERBS_API_NS_FLAG;
 182                if (id >= UVERBS_API_METHOD_KEY_NUM_DRIVER)
 183                        return UVERBS_API_KEY_ERR;
 184                id = id + UVERBS_API_METHOD_KEY_NUM_CORE;
 185        } else {
 186                id++;
 187                if (id >= UVERBS_API_METHOD_KEY_NUM_CORE)
 188                        return UVERBS_API_KEY_ERR;
 189        }
 190
 191        return id << UVERBS_API_METHOD_KEY_SHIFT;
 192}
 193
 194static inline __attribute_const__ u32 uapi_key_write_method(u32 id)
 195{
 196        if (id >= UVERBS_API_WRITE_KEY_NUM)
 197                return UVERBS_API_KEY_ERR;
 198        return UVERBS_API_METHOD_IS_WRITE | id;
 199}
 200
 201static inline __attribute_const__ u32 uapi_key_write_ex_method(u32 id)
 202{
 203        if (id >= UVERBS_API_WRITE_KEY_NUM)
 204                return UVERBS_API_KEY_ERR;
 205        return UVERBS_API_METHOD_IS_WRITE_EX | id;
 206}
 207
 208static inline __attribute_const__ u32
 209uapi_key_attr_to_ioctl_method(u32 attr_key)
 210{
 211        return attr_key &
 212               (UVERBS_API_OBJ_KEY_MASK | UVERBS_API_METHOD_KEY_MASK);
 213}
 214
 215static inline __attribute_const__ bool uapi_key_is_ioctl_method(u32 key)
 216{
 217        unsigned int method = key & UVERBS_API_METHOD_KEY_MASK;
 218
 219        return method != 0 && method < UVERBS_API_METHOD_IS_WRITE &&
 220               (key & UVERBS_API_ATTR_KEY_MASK) == 0;
 221}
 222
 223static inline __attribute_const__ bool uapi_key_is_write_method(u32 key)
 224{
 225        return (key & UVERBS_API_METHOD_KEY_MASK) == UVERBS_API_METHOD_IS_WRITE;
 226}
 227
 228static inline __attribute_const__ bool uapi_key_is_write_ex_method(u32 key)
 229{
 230        return (key & UVERBS_API_METHOD_KEY_MASK) ==
 231               UVERBS_API_METHOD_IS_WRITE_EX;
 232}
 233
 234static inline __attribute_const__ u32 uapi_key_attrs_start(u32 ioctl_method_key)
 235{
 236        /* 0 is the method slot itself */
 237        return ioctl_method_key + 1;
 238}
 239
 240static inline __attribute_const__ u32 uapi_key_attr(u32 id)
 241{
 242        /*
 243         * The attr is designed to fit in the typical single radix tree node
 244         * of 64 entries. Since allmost all methods have driver attributes we
 245         * organize things so that the driver and core attributes interleave to
 246         * reduce the length of the attributes array in typical cases.
 247         */
 248        if (id & UVERBS_API_NS_FLAG) {
 249                id &= ~UVERBS_API_NS_FLAG;
 250                id++;
 251                if (id >= 1 << (UVERBS_API_ATTR_KEY_BITS - 1))
 252                        return UVERBS_API_KEY_ERR;
 253                id = (id << 1) | 0;
 254        } else {
 255                if (id >= 1 << (UVERBS_API_ATTR_KEY_BITS - 1))
 256                        return UVERBS_API_KEY_ERR;
 257                id = (id << 1) | 1;
 258        }
 259
 260        return id;
 261}
 262
 263/* Only true for ioctl methods */
 264static inline __attribute_const__ bool uapi_key_is_attr(u32 key)
 265{
 266        unsigned int method = key & UVERBS_API_METHOD_KEY_MASK;
 267
 268        return method != 0 && method < UVERBS_API_METHOD_IS_WRITE &&
 269               (key & UVERBS_API_ATTR_KEY_MASK) != 0;
 270}
 271
 272/*
 273 * This returns a value in the range [0 to UVERBS_API_ATTR_BKEY_LEN),
 274 * basically it undoes the reservation of 0 in the ID numbering. attr_key
 275 * must already be masked with UVERBS_API_ATTR_KEY_MASK, or be the output of
 276 * uapi_key_attr().
 277 */
 278static inline __attribute_const__ u32 uapi_bkey_attr(u32 attr_key)
 279{
 280        return attr_key - 1;
 281}
 282
 283static inline __attribute_const__ u32 uapi_bkey_to_key_attr(u32 attr_bkey)
 284{
 285        return attr_bkey + 1;
 286}
 287
 288/*
 289 * =======================================
 290 *      Verbs definitions
 291 * =======================================
 292 */
 293
 294struct uverbs_attr_def {
 295        u16                           id;
 296        struct uverbs_attr_spec       attr;
 297};
 298
 299struct uverbs_method_def {
 300        u16                                  id;
 301        /* Combination of bits from enum UVERBS_ACTION_FLAG_XXXX */
 302        u32                                  flags;
 303        size_t                               num_attrs;
 304        const struct uverbs_attr_def * const (*attrs)[];
 305        int (*handler)(struct uverbs_attr_bundle *attrs);
 306};
 307
 308struct uverbs_object_def {
 309        u16                                      id;
 310        const struct uverbs_obj_type            *type_attrs;
 311        size_t                                   num_methods;
 312        const struct uverbs_method_def * const (*methods)[];
 313};
 314
 315enum uapi_definition_kind {
 316        UAPI_DEF_END = 0,
 317        UAPI_DEF_OBJECT_START,
 318        UAPI_DEF_WRITE,
 319        UAPI_DEF_CHAIN_OBJ_TREE,
 320        UAPI_DEF_CHAIN,
 321        UAPI_DEF_IS_SUPPORTED_FUNC,
 322        UAPI_DEF_IS_SUPPORTED_DEV_FN,
 323};
 324
 325enum uapi_definition_scope {
 326        UAPI_SCOPE_OBJECT = 1,
 327        UAPI_SCOPE_METHOD = 2,
 328};
 329
 330struct uapi_definition {
 331        u8 kind;
 332        u8 scope;
 333        union {
 334                struct {
 335                        u16 object_id;
 336                } object_start;
 337                struct {
 338                        u16 command_num;
 339                        u8 is_ex:1;
 340                        u8 has_udata:1;
 341                        u8 has_resp:1;
 342                        u8 req_size;
 343                        u8 resp_size;
 344                } write;
 345        };
 346
 347        union {
 348                bool (*func_is_supported)(struct ib_device *device);
 349                int (*func_write)(struct uverbs_attr_bundle *attrs);
 350                const struct uapi_definition *chain;
 351                const struct uverbs_object_def *chain_obj_tree;
 352                size_t needs_fn_offset;
 353        };
 354};
 355
 356/* Define things connected to object_id */
 357#define DECLARE_UVERBS_OBJECT(_object_id, ...)                                 \
 358        {                                                                      \
 359                .kind = UAPI_DEF_OBJECT_START,                                 \
 360                .object_start = { .object_id = _object_id },                   \
 361        },                                                                     \
 362                ##__VA_ARGS__
 363
 364/* Use in a var_args of DECLARE_UVERBS_OBJECT */
 365#define DECLARE_UVERBS_WRITE(_command_num, _func, _cmd_desc, ...)              \
 366        {                                                                      \
 367                .kind = UAPI_DEF_WRITE,                                        \
 368                .scope = UAPI_SCOPE_OBJECT,                                    \
 369                .write = { .is_ex = 0, .command_num = _command_num },          \
 370                .func_write = _func,                                           \
 371                _cmd_desc,                                                     \
 372        },                                                                     \
 373                ##__VA_ARGS__
 374
 375/* Use in a var_args of DECLARE_UVERBS_OBJECT */
 376#define DECLARE_UVERBS_WRITE_EX(_command_num, _func, _cmd_desc, ...)           \
 377        {                                                                      \
 378                .kind = UAPI_DEF_WRITE,                                        \
 379                .scope = UAPI_SCOPE_OBJECT,                                    \
 380                .write = { .is_ex = 1, .command_num = _command_num },          \
 381                .func_write = _func,                                           \
 382                _cmd_desc,                                                     \
 383        },                                                                     \
 384                ##__VA_ARGS__
 385
 386/*
 387 * Object is only supported if the function pointer named ibdev_fn in struct
 388 * ib_device is not NULL.
 389 */
 390#define UAPI_DEF_OBJ_NEEDS_FN(ibdev_fn)                                        \
 391        {                                                                      \
 392                .kind = UAPI_DEF_IS_SUPPORTED_DEV_FN,                          \
 393                .scope = UAPI_SCOPE_OBJECT,                                    \
 394                .needs_fn_offset =                                             \
 395                        offsetof(struct ib_device_ops, ibdev_fn) +             \
 396                        BUILD_BUG_ON_ZERO(sizeof_field(struct ib_device_ops,   \
 397                                                       ibdev_fn) !=            \
 398                                          sizeof(void *)),                     \
 399        }
 400
 401/*
 402 * Method is only supported if the function pointer named ibdev_fn in struct
 403 * ib_device is not NULL.
 404 */
 405#define UAPI_DEF_METHOD_NEEDS_FN(ibdev_fn)                                     \
 406        {                                                                      \
 407                .kind = UAPI_DEF_IS_SUPPORTED_DEV_FN,                          \
 408                .scope = UAPI_SCOPE_METHOD,                                    \
 409                .needs_fn_offset =                                             \
 410                        offsetof(struct ib_device_ops, ibdev_fn) +             \
 411                        BUILD_BUG_ON_ZERO(sizeof_field(struct ib_device_ops,   \
 412                                                       ibdev_fn) !=            \
 413                                          sizeof(void *)),                     \
 414        }
 415
 416/* Call a function to determine if the entire object is supported or not */
 417#define UAPI_DEF_IS_OBJ_SUPPORTED(_func)                                       \
 418        {                                                                      \
 419                .kind = UAPI_DEF_IS_SUPPORTED_FUNC,                            \
 420                .scope = UAPI_SCOPE_OBJECT, .func_is_supported = _func,        \
 421        }
 422
 423/* Include another struct uapi_definition in this one */
 424#define UAPI_DEF_CHAIN(_def_var)                                               \
 425        {                                                                      \
 426                .kind = UAPI_DEF_CHAIN, .chain = _def_var,                     \
 427        }
 428
 429/* Temporary until the tree base description is replaced */
 430#define UAPI_DEF_CHAIN_OBJ_TREE(_object_enum, _object_ptr, ...)                \
 431        {                                                                      \
 432                .kind = UAPI_DEF_CHAIN_OBJ_TREE,                               \
 433                .object_start = { .object_id = _object_enum },                 \
 434                .chain_obj_tree = _object_ptr,                                 \
 435        },                                                                     \
 436                ##__VA_ARGS__
 437#define UAPI_DEF_CHAIN_OBJ_TREE_NAMED(_object_enum, ...)                       \
 438        UAPI_DEF_CHAIN_OBJ_TREE(_object_enum, &UVERBS_OBJECT(_object_enum),    \
 439                                ##__VA_ARGS__)
 440
 441/*
 442 * =======================================
 443 *      Attribute Specifications
 444 * =======================================
 445 */
 446
 447#define UVERBS_ATTR_SIZE(_min_len, _len)                        \
 448        .u.ptr.min_len = _min_len, .u.ptr.len = _len
 449
 450#define UVERBS_ATTR_NO_DATA() UVERBS_ATTR_SIZE(0, 0)
 451
 452/*
 453 * Specifies a uapi structure that cannot be extended. The user must always
 454 * supply the whole structure and nothing more. The structure must be declared
 455 * in a header under include/uapi/rdma.
 456 */
 457#define UVERBS_ATTR_TYPE(_type)                                 \
 458        .u.ptr.min_len = sizeof(_type), .u.ptr.len = sizeof(_type)
 459/*
 460 * Specifies a uapi structure where the user must provide at least up to
 461 * member 'last'.  Anything after last and up until the end of the structure
 462 * can be non-zero, anything longer than the end of the structure must be
 463 * zero. The structure must be declared in a header under include/uapi/rdma.
 464 */
 465#define UVERBS_ATTR_STRUCT(_type, _last)                                       \
 466        .zero_trailing = 1,                                                    \
 467        UVERBS_ATTR_SIZE(offsetofend(_type, _last), sizeof(_type))
 468/*
 469 * Specifies at least min_len bytes must be passed in, but the amount can be
 470 * larger, up to the protocol maximum size. No check for zeroing is done.
 471 */
 472#define UVERBS_ATTR_MIN_SIZE(_min_len) UVERBS_ATTR_SIZE(_min_len, USHRT_MAX)
 473
 474/* Must be used in the '...' of any UVERBS_ATTR */
 475#define UA_ALLOC_AND_COPY .alloc_and_copy = 1
 476#define UA_MANDATORY .mandatory = 1
 477#define UA_OPTIONAL .mandatory = 0
 478
 479/*
 480 * min_len must be bigger than 0 and _max_len must be smaller than 4095.  Only
 481 * READ\WRITE accesses are supported.
 482 */
 483#define UVERBS_ATTR_IDRS_ARR(_attr_id, _idr_type, _access, _min_len, _max_len, \
 484                             ...)                                              \
 485        (&(const struct uverbs_attr_def){                                      \
 486                .id = (_attr_id) +                                             \
 487                      BUILD_BUG_ON_ZERO((_min_len) == 0 ||                     \
 488                                        (_max_len) >                           \
 489                                                PAGE_SIZE / sizeof(void *) ||  \
 490                                        (_min_len) > (_max_len) ||             \
 491                                        (_access) == UVERBS_ACCESS_NEW ||      \
 492                                        (_access) == UVERBS_ACCESS_DESTROY),   \
 493                .attr = { .type = UVERBS_ATTR_TYPE_IDRS_ARRAY,                 \
 494                          .u2.objs_arr.obj_type = _idr_type,                   \
 495                          .u2.objs_arr.access = _access,                       \
 496                          .u2.objs_arr.min_len = _min_len,                     \
 497                          .u2.objs_arr.max_len = _max_len,                     \
 498                          __VA_ARGS__ } })
 499
 500/*
 501 * Only for use with UVERBS_ATTR_IDR, allows any uobject type to be accepted,
 502 * the user must validate the type of the uobject instead.
 503 */
 504#define UVERBS_IDR_ANY_OBJECT 0xFFFF
 505
 506#define UVERBS_ATTR_IDR(_attr_id, _idr_type, _access, ...)                     \
 507        (&(const struct uverbs_attr_def){                                      \
 508                .id = _attr_id,                                                \
 509                .attr = { .type = UVERBS_ATTR_TYPE_IDR,                        \
 510                          .u.obj.obj_type = _idr_type,                         \
 511                          .u.obj.access = _access,                             \
 512                          __VA_ARGS__ } })
 513
 514#define UVERBS_ATTR_FD(_attr_id, _fd_type, _access, ...)                       \
 515        (&(const struct uverbs_attr_def){                                      \
 516                .id = (_attr_id) +                                             \
 517                      BUILD_BUG_ON_ZERO((_access) != UVERBS_ACCESS_NEW &&      \
 518                                        (_access) != UVERBS_ACCESS_READ),      \
 519                .attr = { .type = UVERBS_ATTR_TYPE_FD,                         \
 520                          .u.obj.obj_type = _fd_type,                          \
 521                          .u.obj.access = _access,                             \
 522                          __VA_ARGS__ } })
 523
 524#define UVERBS_ATTR_PTR_IN(_attr_id, _type, ...)                               \
 525        (&(const struct uverbs_attr_def){                                      \
 526                .id = _attr_id,                                                \
 527                .attr = { .type = UVERBS_ATTR_TYPE_PTR_IN,                     \
 528                          _type,                                               \
 529                          __VA_ARGS__ } })
 530
 531#define UVERBS_ATTR_PTR_OUT(_attr_id, _type, ...)                              \
 532        (&(const struct uverbs_attr_def){                                      \
 533                .id = _attr_id,                                                \
 534                .attr = { .type = UVERBS_ATTR_TYPE_PTR_OUT,                    \
 535                          _type,                                               \
 536                          __VA_ARGS__ } })
 537
 538/* _enum_arry should be a 'static const union uverbs_attr_spec[]' */
 539#define UVERBS_ATTR_ENUM_IN(_attr_id, _enum_arr, ...)                          \
 540        (&(const struct uverbs_attr_def){                                      \
 541                .id = _attr_id,                                                \
 542                .attr = { .type = UVERBS_ATTR_TYPE_ENUM_IN,                    \
 543                          .u2.enum_def.ids = _enum_arr,                        \
 544                          .u.enum_def.num_elems = ARRAY_SIZE(_enum_arr),       \
 545                          __VA_ARGS__ },                                       \
 546        })
 547
 548/* An input value that is a member in the enum _enum_type. */
 549#define UVERBS_ATTR_CONST_IN(_attr_id, _enum_type, ...)                        \
 550        UVERBS_ATTR_PTR_IN(                                                    \
 551                _attr_id,                                                      \
 552                UVERBS_ATTR_SIZE(                                              \
 553                        sizeof(u64) + BUILD_BUG_ON_ZERO(!sizeof(_enum_type)),  \
 554                        sizeof(u64)),                                          \
 555                __VA_ARGS__)
 556
 557/*
 558 * An input value that is a bitwise combination of values of _enum_type.
 559 * This permits the flag value to be passed as either a u32 or u64, it must
 560 * be retrieved via uverbs_get_flag().
 561 */
 562#define UVERBS_ATTR_FLAGS_IN(_attr_id, _enum_type, ...)                        \
 563        UVERBS_ATTR_PTR_IN(                                                    \
 564                _attr_id,                                                      \
 565                UVERBS_ATTR_SIZE(sizeof(u32) + BUILD_BUG_ON_ZERO(              \
 566                                                       !sizeof(_enum_type *)), \
 567                                 sizeof(u64)),                                 \
 568                __VA_ARGS__)
 569
 570/*
 571 * This spec is used in order to pass information to the hardware driver in a
 572 * legacy way. Every verb that could get driver specific data should get this
 573 * spec.
 574 */
 575#define UVERBS_ATTR_UHW()                                                      \
 576        UVERBS_ATTR_PTR_IN(UVERBS_ATTR_UHW_IN,                                 \
 577                           UVERBS_ATTR_MIN_SIZE(0),                            \
 578                           UA_OPTIONAL,                                        \
 579                           .is_udata = 1),                                     \
 580        UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_UHW_OUT,                               \
 581                            UVERBS_ATTR_MIN_SIZE(0),                           \
 582                            UA_OPTIONAL,                                       \
 583                            .is_udata = 1)
 584
 585/* =================================================
 586 *              Parsing infrastructure
 587 * =================================================
 588 */
 589
 590
 591struct uverbs_ptr_attr {
 592        /*
 593         * If UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY is set then the 'ptr' is
 594         * used.
 595         */
 596        union {
 597                void *ptr;
 598                u64 data;
 599        };
 600        u16             len;
 601        u16             uattr_idx;
 602        u8              enum_id;
 603};
 604
 605struct uverbs_obj_attr {
 606        struct ib_uobject               *uobject;
 607        const struct uverbs_api_attr    *attr_elm;
 608};
 609
 610struct uverbs_objs_arr_attr {
 611        struct ib_uobject **uobjects;
 612        u16 len;
 613};
 614
 615struct uverbs_attr {
 616        union {
 617                struct uverbs_ptr_attr  ptr_attr;
 618                struct uverbs_obj_attr  obj_attr;
 619                struct uverbs_objs_arr_attr objs_arr_attr;
 620        };
 621};
 622
 623struct uverbs_attr_bundle {
 624        struct ib_udata driver_udata;
 625        struct ib_udata ucore;
 626        struct ib_uverbs_file *ufile;
 627        struct ib_ucontext *context;
 628        struct ib_uobject *uobject;
 629        DECLARE_BITMAP(attr_present, UVERBS_API_ATTR_BKEY_LEN);
 630        struct uverbs_attr attrs[];
 631};
 632
 633static inline bool uverbs_attr_is_valid(const struct uverbs_attr_bundle *attrs_bundle,
 634                                        unsigned int idx)
 635{
 636        return test_bit(uapi_bkey_attr(uapi_key_attr(idx)),
 637                        attrs_bundle->attr_present);
 638}
 639
 640/**
 641 * rdma_udata_to_drv_context - Helper macro to get the driver's context out of
 642 *                             ib_udata which is embedded in uverbs_attr_bundle.
 643 *
 644 * If udata is not NULL this cannot fail. Otherwise a NULL udata will result
 645 * in a NULL ucontext pointer, as a safety precaution. Callers should be using
 646 * 'udata' to determine if the driver call is in user or kernel mode, not
 647 * 'ucontext'.
 648 *
 649 */
 650static inline struct uverbs_attr_bundle *
 651rdma_udata_to_uverbs_attr_bundle(struct ib_udata *udata)
 652{
 653        return container_of(udata, struct uverbs_attr_bundle, driver_udata);
 654}
 655
 656#define rdma_udata_to_drv_context(udata, drv_dev_struct, member)                \
 657        (udata ? container_of(rdma_udata_to_uverbs_attr_bundle(udata)->context, \
 658                              drv_dev_struct, member) : (drv_dev_struct *)NULL)
 659
 660#define IS_UVERBS_COPY_ERR(_ret)                ((_ret) && (_ret) != -ENOENT)
 661
 662static inline const struct uverbs_attr *uverbs_attr_get(const struct uverbs_attr_bundle *attrs_bundle,
 663                                                        u16 idx)
 664{
 665        if (!uverbs_attr_is_valid(attrs_bundle, idx))
 666                return ERR_PTR(-ENOENT);
 667
 668        return &attrs_bundle->attrs[uapi_bkey_attr(uapi_key_attr(idx))];
 669}
 670
 671static inline int uverbs_attr_get_enum_id(const struct uverbs_attr_bundle *attrs_bundle,
 672                                          u16 idx)
 673{
 674        const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
 675
 676        if (IS_ERR(attr))
 677                return PTR_ERR(attr);
 678
 679        return attr->ptr_attr.enum_id;
 680}
 681
 682static inline void *uverbs_attr_get_obj(const struct uverbs_attr_bundle *attrs_bundle,
 683                                        u16 idx)
 684{
 685        const struct uverbs_attr *attr;
 686
 687        attr = uverbs_attr_get(attrs_bundle, idx);
 688        if (IS_ERR(attr))
 689                return ERR_CAST(attr);
 690
 691        return attr->obj_attr.uobject->object;
 692}
 693
 694static inline struct ib_uobject *uverbs_attr_get_uobject(const struct uverbs_attr_bundle *attrs_bundle,
 695                                                         u16 idx)
 696{
 697        const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
 698
 699        if (IS_ERR(attr))
 700                return ERR_CAST(attr);
 701
 702        return attr->obj_attr.uobject;
 703}
 704
 705static inline int
 706uverbs_attr_get_len(const struct uverbs_attr_bundle *attrs_bundle, u16 idx)
 707{
 708        const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
 709
 710        if (IS_ERR(attr))
 711                return PTR_ERR(attr);
 712
 713        return attr->ptr_attr.len;
 714}
 715
 716void uverbs_finalize_uobj_create(const struct uverbs_attr_bundle *attrs_bundle,
 717                                 u16 idx);
 718
 719/*
 720 * uverbs_attr_ptr_get_array_size() - Get array size pointer by a ptr
 721 * attribute.
 722 * @attrs: The attribute bundle
 723 * @idx: The ID of the attribute
 724 * @elem_size: The size of the element in the array
 725 */
 726static inline int
 727uverbs_attr_ptr_get_array_size(struct uverbs_attr_bundle *attrs, u16 idx,
 728                               size_t elem_size)
 729{
 730        int size = uverbs_attr_get_len(attrs, idx);
 731
 732        if (size < 0)
 733                return size;
 734
 735        if (size % elem_size)
 736                return -EINVAL;
 737
 738        return size / elem_size;
 739}
 740
 741/**
 742 * uverbs_attr_get_uobjs_arr() - Provides array's properties for attribute for
 743 * UVERBS_ATTR_TYPE_IDRS_ARRAY.
 744 * @arr: Returned pointer to array of pointers for uobjects or NULL if
 745 *       the attribute isn't provided.
 746 *
 747 * Return: The array length or 0 if no attribute was provided.
 748 */
 749static inline int uverbs_attr_get_uobjs_arr(
 750        const struct uverbs_attr_bundle *attrs_bundle, u16 attr_idx,
 751        struct ib_uobject ***arr)
 752{
 753        const struct uverbs_attr *attr =
 754                        uverbs_attr_get(attrs_bundle, attr_idx);
 755
 756        if (IS_ERR(attr)) {
 757                *arr = NULL;
 758                return 0;
 759        }
 760
 761        *arr = attr->objs_arr_attr.uobjects;
 762
 763        return attr->objs_arr_attr.len;
 764}
 765
 766static inline bool uverbs_attr_ptr_is_inline(const struct uverbs_attr *attr)
 767{
 768        return attr->ptr_attr.len <= sizeof(attr->ptr_attr.data);
 769}
 770
 771static inline void *uverbs_attr_get_alloced_ptr(
 772        const struct uverbs_attr_bundle *attrs_bundle, u16 idx)
 773{
 774        const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
 775
 776        if (IS_ERR(attr))
 777                return (void *)attr;
 778
 779        return uverbs_attr_ptr_is_inline(attr) ? (void *)&attr->ptr_attr.data :
 780                                                 attr->ptr_attr.ptr;
 781}
 782
 783static inline int _uverbs_copy_from(void *to,
 784                                    const struct uverbs_attr_bundle *attrs_bundle,
 785                                    size_t idx,
 786                                    size_t size)
 787{
 788        const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
 789
 790        if (IS_ERR(attr))
 791                return PTR_ERR(attr);
 792
 793        /*
 794         * Validation ensures attr->ptr_attr.len >= size. If the caller is
 795         * using UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO then it must call
 796         * uverbs_copy_from_or_zero.
 797         */
 798        if (unlikely(size < attr->ptr_attr.len))
 799                return -EINVAL;
 800
 801        if (uverbs_attr_ptr_is_inline(attr))
 802                memcpy(to, &attr->ptr_attr.data, attr->ptr_attr.len);
 803        else if (copy_from_user(to, u64_to_user_ptr(attr->ptr_attr.data),
 804                                attr->ptr_attr.len))
 805                return -EFAULT;
 806
 807        return 0;
 808}
 809
 810static inline int _uverbs_copy_from_or_zero(void *to,
 811                                            const struct uverbs_attr_bundle *attrs_bundle,
 812                                            size_t idx,
 813                                            size_t size)
 814{
 815        const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
 816        size_t min_size;
 817
 818        if (IS_ERR(attr))
 819                return PTR_ERR(attr);
 820
 821        min_size = min_t(size_t, size, attr->ptr_attr.len);
 822
 823        if (uverbs_attr_ptr_is_inline(attr))
 824                memcpy(to, &attr->ptr_attr.data, min_size);
 825        else if (copy_from_user(to, u64_to_user_ptr(attr->ptr_attr.data),
 826                                min_size))
 827                return -EFAULT;
 828
 829        if (size > min_size)
 830                memset(to + min_size, 0, size - min_size);
 831
 832        return 0;
 833}
 834
 835#define uverbs_copy_from(to, attrs_bundle, idx)                               \
 836        _uverbs_copy_from(to, attrs_bundle, idx, sizeof(*to))
 837
 838#define uverbs_copy_from_or_zero(to, attrs_bundle, idx)                       \
 839        _uverbs_copy_from_or_zero(to, attrs_bundle, idx, sizeof(*to))
 840
 841static inline struct ib_ucontext *
 842ib_uverbs_get_ucontext(const struct uverbs_attr_bundle *attrs)
 843{
 844        return ib_uverbs_get_ucontext_file(attrs->ufile);
 845}
 846
 847#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
 848int uverbs_get_flags64(u64 *to, const struct uverbs_attr_bundle *attrs_bundle,
 849                       size_t idx, u64 allowed_bits);
 850int uverbs_get_flags32(u32 *to, const struct uverbs_attr_bundle *attrs_bundle,
 851                       size_t idx, u64 allowed_bits);
 852int uverbs_copy_to(const struct uverbs_attr_bundle *attrs_bundle, size_t idx,
 853                   const void *from, size_t size);
 854__malloc void *_uverbs_alloc(struct uverbs_attr_bundle *bundle, size_t size,
 855                             gfp_t flags);
 856
 857static inline __malloc void *uverbs_alloc(struct uverbs_attr_bundle *bundle,
 858                                          size_t size)
 859{
 860        return _uverbs_alloc(bundle, size, GFP_KERNEL);
 861}
 862
 863static inline __malloc void *uverbs_zalloc(struct uverbs_attr_bundle *bundle,
 864                                           size_t size)
 865{
 866        return _uverbs_alloc(bundle, size, GFP_KERNEL | __GFP_ZERO);
 867}
 868
 869static inline __malloc void *uverbs_kcalloc(struct uverbs_attr_bundle *bundle,
 870                                            size_t n, size_t size)
 871{
 872        size_t bytes;
 873
 874        if (unlikely(check_mul_overflow(n, size, &bytes)))
 875                return ERR_PTR(-EOVERFLOW);
 876        return uverbs_zalloc(bundle, bytes);
 877}
 878
 879int _uverbs_get_const_signed(s64 *to,
 880                             const struct uverbs_attr_bundle *attrs_bundle,
 881                             size_t idx, s64 lower_bound, u64 upper_bound,
 882                             s64 *def_val);
 883int _uverbs_get_const_unsigned(u64 *to,
 884                               const struct uverbs_attr_bundle *attrs_bundle,
 885                               size_t idx, u64 upper_bound, u64 *def_val);
 886int uverbs_copy_to_struct_or_zero(const struct uverbs_attr_bundle *bundle,
 887                                  size_t idx, const void *from, size_t size);
 888#else
 889static inline int
 890uverbs_get_flags64(u64 *to, const struct uverbs_attr_bundle *attrs_bundle,
 891                   size_t idx, u64 allowed_bits)
 892{
 893        return -EINVAL;
 894}
 895static inline int
 896uverbs_get_flags32(u32 *to, const struct uverbs_attr_bundle *attrs_bundle,
 897                   size_t idx, u64 allowed_bits)
 898{
 899        return -EINVAL;
 900}
 901static inline int uverbs_copy_to(const struct uverbs_attr_bundle *attrs_bundle,
 902                                 size_t idx, const void *from, size_t size)
 903{
 904        return -EINVAL;
 905}
 906static inline __malloc void *uverbs_alloc(struct uverbs_attr_bundle *bundle,
 907                                          size_t size)
 908{
 909        return ERR_PTR(-EINVAL);
 910}
 911static inline __malloc void *uverbs_zalloc(struct uverbs_attr_bundle *bundle,
 912                                           size_t size)
 913{
 914        return ERR_PTR(-EINVAL);
 915}
 916static inline int
 917_uverbs_get_const(s64 *to, const struct uverbs_attr_bundle *attrs_bundle,
 918                  size_t idx, s64 lower_bound, u64 upper_bound,
 919                  s64 *def_val)
 920{
 921        return -EINVAL;
 922}
 923static inline int
 924uverbs_copy_to_struct_or_zero(const struct uverbs_attr_bundle *bundle,
 925                              size_t idx, const void *from, size_t size)
 926{
 927        return -EINVAL;
 928}
 929static inline int
 930_uverbs_get_const_signed(s64 *to,
 931                         const struct uverbs_attr_bundle *attrs_bundle,
 932                         size_t idx, s64 lower_bound, u64 upper_bound,
 933                         s64 *def_val)
 934{
 935        return -EINVAL;
 936}
 937static inline int
 938_uverbs_get_const_unsigned(u64 *to,
 939                           const struct uverbs_attr_bundle *attrs_bundle,
 940                           size_t idx, u64 upper_bound, u64 *def_val)
 941{
 942        return -EINVAL;
 943}
 944#endif
 945
 946#define uverbs_get_const_signed(_to, _attrs_bundle, _idx)                      \
 947        ({                                                                     \
 948                s64 _val;                                                      \
 949                int _ret =                                                     \
 950                        _uverbs_get_const_signed(&_val, _attrs_bundle, _idx,   \
 951                                          type_min(typeof(*(_to))),            \
 952                                          type_max(typeof(*(_to))), NULL);     \
 953                (*(_to)) = _val;                                               \
 954                _ret;                                                          \
 955        })
 956
 957#define uverbs_get_const_unsigned(_to, _attrs_bundle, _idx)                    \
 958        ({                                                                     \
 959                u64 _val;                                                      \
 960                int _ret =                                                     \
 961                        _uverbs_get_const_unsigned(&_val, _attrs_bundle, _idx, \
 962                                          type_max(typeof(*(_to))), NULL);     \
 963                (*(_to)) = _val;                                               \
 964                _ret;                                                          \
 965        })
 966
 967#define uverbs_get_const_default_signed(_to, _attrs_bundle, _idx, _default)    \
 968        ({                                                                     \
 969                s64 _val;                                                      \
 970                s64 _def_val = _default;                                       \
 971                int _ret =                                                     \
 972                        _uverbs_get_const_signed(&_val, _attrs_bundle, _idx,   \
 973                                type_min(typeof(*(_to))),                      \
 974                                type_max(typeof(*(_to))), &_def_val);          \
 975                (*(_to)) = _val;                                               \
 976                _ret;                                                          \
 977        })
 978
 979#define uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx, _default)  \
 980        ({                                                                     \
 981                u64 _val;                                                      \
 982                u64 _def_val = _default;                                       \
 983                int _ret =                                                     \
 984                        _uverbs_get_const_unsigned(&_val, _attrs_bundle, _idx, \
 985                                type_max(typeof(*(_to))), &_def_val);          \
 986                (*(_to)) = _val;                                               \
 987                _ret;                                                          \
 988        })
 989
 990#define uverbs_get_const(_to, _attrs_bundle, _idx)                             \
 991        (is_signed_type(typeof(*(_to))) ?                                      \
 992                 uverbs_get_const_signed(_to, _attrs_bundle, _idx) :           \
 993                 uverbs_get_const_unsigned(_to, _attrs_bundle, _idx))          \
 994
 995#define uverbs_get_const_default(_to, _attrs_bundle, _idx, _default)           \
 996        (is_signed_type(typeof(*(_to))) ?                                      \
 997                 uverbs_get_const_default_signed(_to, _attrs_bundle, _idx,     \
 998                                                  _default) :                  \
 999                 uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx,   \
1000                                                    _default))
1001
1002#endif
1003