IB/uverbs: Do not pass struct ib_device to the ioctl methods
authorJason Gunthorpe <jgg@mellanox.com>
Thu, 26 Jul 2018 03:40:18 +0000 (21:40 -0600)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 1 Aug 2018 20:55:48 +0000 (14:55 -0600)
This does the same as the patch before, except for ioctl. The rules are
the same, but for the ioctl methods the core code handles setting up the
uobject.

- Retrieve the ib_dev from the uobject->context->device. This is
  safe under ioctl as the core has already done rdma_alloc_begin_uobject
  and so CREATE calls are entirely protected by the rwsem.
- Retrieve the ib_dev from uobject->object
- Call ib_uverbs_get_ucontext()

Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/uverbs_ioctl.c
drivers/infiniband/core/uverbs_std_types.c
drivers/infiniband/core/uverbs_std_types_counters.c
drivers/infiniband/core/uverbs_std_types_cq.c
drivers/infiniband/core/uverbs_std_types_dm.c
drivers/infiniband/core/uverbs_std_types_flow_action.c
drivers/infiniband/core/uverbs_std_types_mr.c
drivers/infiniband/hw/mlx5/devx.c
drivers/infiniband/hw/mlx5/flow.c
include/rdma/ib_verbs.h
include/rdma/uverbs_ioctl.h

index f3776f9..f0655a8 100644 (file)
@@ -354,7 +354,7 @@ static int uverbs_handle_method(struct ib_uverbs_attr __user *uattr_ptr,
                        goto cleanup;
        }
 
-       ret = method_spec->handler(ibdev, ufile, attr_bundle);
+       ret = method_spec->handler(ufile, attr_bundle);
 
        if (destroy_attr) {
                uobj_put_destroy(destroy_attr->uobject);
index c1e0492..3aa7c7d 100644 (file)
@@ -210,8 +210,7 @@ static int uverbs_hot_unplug_completion_event_file(struct ib_uobject *uobj,
        return 0;
 };
 
-int uverbs_destroy_def_handler(struct ib_device *ib_dev,
-                              struct ib_uverbs_file *file,
+int uverbs_destroy_def_handler(struct ib_uverbs_file *file,
                               struct uverbs_attr_bundle *attrs)
 {
        return 0;
index 3458979..dfacc9e 100644 (file)
@@ -47,12 +47,13 @@ static int uverbs_free_counters(struct ib_uobject *uobject,
        return counters->device->destroy_counters(counters);
 }
 
-static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_CREATE)(struct ib_device *ib_dev,
-                                                        struct ib_uverbs_file *file,
-                                                        struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_CREATE)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
+       struct ib_uobject *uobj = uverbs_attr_get_uobject(
+               attrs, UVERBS_ATTR_CREATE_COUNTERS_HANDLE);
+       struct ib_device *ib_dev = uobj->context->device;
        struct ib_counters *counters;
-       struct ib_uobject *uobj;
        int ret;
 
        /*
@@ -63,7 +64,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_CREATE)(struct ib_device *ib_de
        if (!ib_dev->create_counters)
                return -EOPNOTSUPP;
 
-       uobj = uverbs_attr_get_uobject(attrs, UVERBS_ATTR_CREATE_COUNTERS_HANDLE);
        counters = ib_dev->create_counters(ib_dev, attrs);
        if (IS_ERR(counters)) {
                ret = PTR_ERR(counters);
@@ -81,9 +81,8 @@ err_create_counters:
        return ret;
 }
 
-static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_READ)(struct ib_device *ib_dev,
-                                                      struct ib_uverbs_file *file,
-                                                      struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_READ)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct ib_counters_read_attr read_attr = {};
        const struct uverbs_attr *uattr;
@@ -91,7 +90,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_READ)(struct ib_device *ib_dev,
                uverbs_attr_get_obj(attrs, UVERBS_ATTR_READ_COUNTERS_HANDLE);
        int ret;
 
-       if (!ib_dev->read_counters)
+       if (!counters->device->read_counters)
                return -EOPNOTSUPP;
 
        if (!atomic_read(&counters->usecnt))
@@ -110,9 +109,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_READ)(struct ib_device *ib_dev,
        if (!read_attr.counters_buff)
                return -ENOMEM;
 
-       ret = ib_dev->read_counters(counters,
-                                   &read_attr,
-                                   attrs);
+       ret = counters->device->read_counters(counters, &read_attr, attrs);
        if (ret)
                goto err_read;
 
index 68c86e6..5b5f205 100644 (file)
@@ -57,11 +57,13 @@ static int uverbs_free_cq(struct ib_uobject *uobject,
        return ret;
 }
 
-static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(struct ib_device *ib_dev,
-                                                  struct ib_uverbs_file *file,
-                                                  struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
-       struct ib_ucq_object           *obj;
+       struct ib_ucq_object *obj = container_of(
+               uverbs_attr_get_uobject(attrs, UVERBS_ATTR_CREATE_CQ_HANDLE),
+               typeof(*obj), uobject);
+       struct ib_device *ib_dev = obj->uobject.context->device;
        struct ib_udata uhw;
        int ret;
        u64 user_handle;
@@ -104,9 +106,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(struct ib_device *ib_dev,
                goto err_event_file;
        }
 
-       obj = container_of(uverbs_attr_get_uobject(attrs,
-                                                  UVERBS_ATTR_CREATE_CQ_HANDLE),
-                          typeof(*obj), uobject);
        obj->comp_events_reported  = 0;
        obj->async_events_reported = 0;
        INIT_LIST_HEAD(&obj->comp_list);
@@ -173,9 +172,8 @@ DECLARE_UVERBS_NAMED_METHOD(
                            UA_MANDATORY),
        UVERBS_ATTR_UHW());
 
-static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)(struct ib_device *ib_dev,
-                                                   struct ib_uverbs_file *file,
-                                                   struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct ib_uobject *uobj =
                uverbs_attr_get_uobject(attrs, UVERBS_ATTR_DESTROY_CQ_HANDLE);
index c90efa4..edc3ff7 100644 (file)
@@ -46,12 +46,15 @@ static int uverbs_free_dm(struct ib_uobject *uobject,
        return dm->device->dealloc_dm(dm);
 }
 
-static int UVERBS_HANDLER(UVERBS_METHOD_DM_ALLOC)(struct ib_device *ib_dev,
-                                                 struct ib_uverbs_file *file,
-                                                 struct uverbs_attr_bundle *attrs)
+static int
+UVERBS_HANDLER(UVERBS_METHOD_DM_ALLOC)(struct ib_uverbs_file *file,
+                                      struct uverbs_attr_bundle *attrs)
 {
        struct ib_dm_alloc_attr attr = {};
-       struct ib_uobject *uobj;
+       struct ib_uobject *uobj =
+               uverbs_attr_get(attrs, UVERBS_ATTR_ALLOC_DM_HANDLE)
+                       ->obj_attr.uobject;
+       struct ib_device *ib_dev = uobj->context->device;
        struct ib_dm *dm;
        int ret;
 
@@ -68,8 +71,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_ALLOC)(struct ib_device *ib_dev,
        if (ret)
                return ret;
 
-       uobj = uverbs_attr_get(attrs, UVERBS_ATTR_ALLOC_DM_HANDLE)->obj_attr.uobject;
-
        dm = ib_dev->alloc_dm(ib_dev, uobj->context, &attr, attrs);
        if (IS_ERR(dm))
                return PTR_ERR(dm);
index adb9209..d8cfafe 100644 (file)
@@ -304,12 +304,13 @@ static int parse_flow_action_esp(struct ib_device *ib_dev,
        return 0;
 }
 
-static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE)(struct ib_device *ib_dev,
-                                                               struct ib_uverbs_file *file,
-                                                               struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
+       struct ib_uobject *uobj = uverbs_attr_get_uobject(
+               attrs, UVERBS_ATTR_CREATE_FLOW_ACTION_ESP_HANDLE);
+       struct ib_device *ib_dev = uobj->context->device;
        int                               ret;
-       struct ib_uobject                 *uobj;
        struct ib_flow_action             *action;
        struct ib_flow_action_esp_attr    esp_attr = {};
 
@@ -321,8 +322,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE)(struct ib_device
                return ret;
 
        /* No need to check as this attribute is marked as MANDATORY */
-       uobj = uverbs_attr_get_uobject(
-               attrs, UVERBS_ATTR_CREATE_FLOW_ACTION_ESP_HANDLE);
        action = ib_dev->create_flow_action_esp(ib_dev, &esp_attr.hdr, attrs);
        if (IS_ERR(action))
                return PTR_ERR(action);
@@ -336,32 +335,28 @@ static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_CREATE)(struct ib_device
        return 0;
 }
 
-static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY)(struct ib_device *ib_dev,
-                                                               struct ib_uverbs_file *file,
-                                                               struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
+       struct ib_uobject *uobj = uverbs_attr_get_uobject(
+               attrs, UVERBS_ATTR_MODIFY_FLOW_ACTION_ESP_HANDLE);
+       struct ib_flow_action *action = uobj->object;
        int                               ret;
-       struct ib_uobject                 *uobj;
-       struct ib_flow_action             *action;
        struct ib_flow_action_esp_attr    esp_attr = {};
 
-       if (!ib_dev->modify_flow_action_esp)
+       if (!action->device->modify_flow_action_esp)
                return -EOPNOTSUPP;
 
-       ret = parse_flow_action_esp(ib_dev, file, attrs, &esp_attr, true);
+       ret = parse_flow_action_esp(action->device, file, attrs, &esp_attr,
+                                   true);
        if (ret)
                return ret;
 
-       uobj = uverbs_attr_get_uobject(
-               attrs, UVERBS_ATTR_MODIFY_FLOW_ACTION_ESP_HANDLE);
-       action = uobj->object;
-
        if (action->type != IB_FLOW_ACTION_ESP)
                return -EINVAL;
 
-       return ib_dev->modify_flow_action_esp(action,
-                                             &esp_attr.hdr,
-                                             attrs);
+       return action->device->modify_flow_action_esp(action, &esp_attr.hdr,
+                                                     attrs);
 }
 
 static const struct uverbs_attr_spec uverbs_flow_action_esp_keymat[] = {
index d63da0c..cf02e77 100644 (file)
@@ -39,14 +39,18 @@ static int uverbs_free_mr(struct ib_uobject *uobject,
        return ib_dereg_mr((struct ib_mr *)uobject->object);
 }
 
-static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)(struct ib_device *ib_dev,
-                                                  struct ib_uverbs_file *file,
-                                                  struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct ib_dm_mr_attr attr = {};
-       struct ib_uobject *uobj;
-       struct ib_dm *dm;
-       struct ib_pd *pd;
+       struct ib_uobject *uobj =
+               uverbs_attr_get_uobject(attrs, UVERBS_ATTR_REG_DM_MR_HANDLE);
+       struct ib_dm *dm =
+               uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DM_MR_DM_HANDLE);
+       struct ib_pd *pd =
+               uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DM_MR_PD_HANDLE);
+       struct ib_device *ib_dev = pd->device;
+
        struct ib_mr *mr;
        int ret;
 
@@ -75,12 +79,6 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)(struct ib_device *ib_dev,
        if (ret)
                return ret;
 
-       pd = uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DM_MR_PD_HANDLE);
-
-       dm = uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DM_MR_DM_HANDLE);
-
-       uobj = uverbs_attr_get(attrs, UVERBS_ATTR_REG_DM_MR_HANDLE)->obj_attr.uobject;
-
        if (attr.offset > dm->length || attr.length > dm->length ||
            attr.length > dm->length - attr.offset)
                return -EINVAL;
index c9a7a12..29c6883 100644 (file)
@@ -409,11 +409,11 @@ static bool devx_is_general_cmd(void *in)
        }
 }
 
-static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(struct ib_device *ib_dev,
-                                 struct ib_uverbs_file *file,
-                                 struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
-       struct mlx5_ib_dev *dev = to_mdev(ib_dev);
+       struct mlx5_ib_ucontext *c;
+       struct mlx5_ib_dev *dev;
        int user_vector;
        int dev_eqn;
        unsigned int irqn;
@@ -423,6 +423,11 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(struct ib_device *ib_de
                             MLX5_IB_ATTR_DEVX_QUERY_EQN_USER_VEC))
                return -EFAULT;
 
+       c = devx_ufile2uctx(file);
+       if (IS_ERR(c))
+               return PTR_ERR(c);
+       dev = to_mdev(c->ibucontext.device);
+
        err = mlx5_vector2eqn(dev->mdev, user_vector, &dev_eqn, &irqn);
        if (err < 0)
                return err;
@@ -454,9 +459,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(struct ib_device *ib_de
  * of the buggy user for execution (just insert it to the hardware schedule
  * queue or arm its CQ for event generation), no further harm is expected.
  */
-static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_UAR)(struct ib_device *ib_dev,
-                                 struct ib_uverbs_file *file,
-                                 struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_UAR)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct mlx5_ib_ucontext *c;
        struct mlx5_ib_dev *dev;
@@ -483,9 +487,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_UAR)(struct ib_device *ib_de
        return 0;
 }
 
-static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(struct ib_device *ib_dev,
-                                 struct ib_uverbs_file *file,
-                                 struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct mlx5_ib_ucontext *c;
        struct mlx5_ib_dev *dev;
@@ -712,9 +715,8 @@ static int devx_obj_cleanup(struct ib_uobject *uobject,
        return ret;
 }
 
-static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(struct ib_device *ib_dev,
-                                  struct ib_uverbs_file *file,
-                                  struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN);
        int cmd_out_len =  uverbs_attr_get_len(attrs,
@@ -769,9 +771,8 @@ obj_free:
        return err;
 }
 
-static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(struct ib_device *ib_dev,
-                                  struct ib_uverbs_file *file,
-                                  struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN);
        int cmd_out_len = uverbs_attr_get_len(attrs,
@@ -811,9 +812,8 @@ other_cmd_free:
        return err;
 }
 
-static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(struct ib_device *ib_dev,
-                                  struct ib_uverbs_file *file,
-                                  struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        void *cmd_in = uverbs_attr_get_alloced_ptr(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN);
        int cmd_out_len = uverbs_attr_get_len(attrs,
@@ -931,9 +931,8 @@ static void devx_umem_reg_cmd_build(struct mlx5_ib_dev *dev,
                             MLX5_IB_MTT_READ);
 }
 
-static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(struct ib_device *ib_dev,
-                                struct ib_uverbs_file *file,
-                                struct uverbs_attr_bundle *attrs)
+static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct devx_umem_reg_cmd cmd;
        struct devx_umem *obj;
index ee398a9..1a29f47 100644 (file)
@@ -39,8 +39,7 @@ static const struct uverbs_attr_spec mlx5_ib_flow_type[] = {
 };
 
 static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
-       struct ib_device *ib_dev, struct ib_uverbs_file *file,
-       struct uverbs_attr_bundle *attrs)
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct mlx5_ib_flow_handler *flow_handler;
        struct mlx5_ib_flow_matcher *fs_matcher;
@@ -109,7 +108,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
        if (IS_ERR(flow_handler))
                return PTR_ERR(flow_handler);
 
-       ib_set_flow(uobj, &flow_handler->ibflow, qp, ib_dev);
+       ib_set_flow(uobj, &flow_handler->ibflow, qp, &dev->ib_dev);
 
        return 0;
 }
@@ -129,8 +128,7 @@ static int flow_matcher_cleanup(struct ib_uobject *uobject,
 }
 
 static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
-       struct ib_device *ib_dev, struct ib_uverbs_file *file,
-       struct uverbs_attr_bundle *attrs)
+       struct ib_uverbs_file *file, struct uverbs_attr_bundle *attrs)
 {
        struct ib_uobject *uobj = uverbs_attr_get_uobject(
                attrs, MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE);
index be20842..dea770e 100644 (file)
@@ -4170,7 +4170,6 @@ void rdma_roce_rescan_device(struct ib_device *ibdev);
 
 struct ib_ucontext *ib_uverbs_get_ucontext(struct ib_uverbs_file *ufile);
 
-int uverbs_destroy_def_handler(struct ib_device *ib_dev,
-                              struct ib_uverbs_file *file,
+int uverbs_destroy_def_handler(struct ib_uverbs_file *file,
                               struct uverbs_attr_bundle *attrs);
 #endif /* IB_VERBS_H */
index 5e6d056..8d71b7a 100644 (file)
@@ -128,7 +128,7 @@ struct uverbs_method_spec {
        u32                                             flags;
        size_t                                          num_buckets;
        size_t                                          num_child_attrs;
-       int (*handler)(struct ib_device *ib_dev, struct ib_uverbs_file *ufile,
+       int (*handler)(struct ib_uverbs_file *ufile,
                       struct uverbs_attr_bundle *ctx);
        struct uverbs_attr_spec_hash            *attr_buckets[0];
 };
@@ -171,7 +171,7 @@ struct uverbs_method_def {
        u32                                  flags;
        size_t                               num_attrs;
        const struct uverbs_attr_def * const (*attrs)[];
-       int (*handler)(struct ib_device *ib_dev, struct ib_uverbs_file *ufile,
+       int (*handler)(struct ib_uverbs_file *ufile,
                       struct uverbs_attr_bundle *ctx);
 };