OSDN Git Service

IB/uverbs: Refactor uverbs_finalize_objects
authorMatan Barak <matanb@mellanox.com>
Sun, 17 Jun 2018 09:59:51 +0000 (12:59 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 19 Jun 2018 16:53:02 +0000 (10:53 -0600)
uverbs_finalize_objects is currently used only to commit or abort
objects. Since we want to add automatic allocation/free of PTR_IN
attributes, moving it to uverbs_ioctl.c and renamit it to
uverbs_finalize_attrs.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/rdma_core.c
drivers/infiniband/core/rdma_core.h
drivers/infiniband/core/uverbs_ioctl.c

index 8035a0a..df3c405 100644 (file)
@@ -779,43 +779,3 @@ int uverbs_finalize_object(struct ib_uobject *uobj,
 
        return ret;
 }
-
-int uverbs_finalize_objects(struct uverbs_attr_bundle *attrs_bundle,
-                           struct uverbs_attr_spec_hash * const *spec_hash,
-                           size_t num,
-                           bool commit)
-{
-       unsigned int i;
-       int ret = 0;
-
-       for (i = 0; i < num; i++) {
-               struct uverbs_attr_bundle_hash *curr_bundle =
-                       &attrs_bundle->hash[i];
-               const struct uverbs_attr_spec_hash *curr_spec_bucket =
-                       spec_hash[i];
-               unsigned int j;
-
-               for (j = 0; j < curr_bundle->num_attrs; j++) {
-                       struct uverbs_attr *attr;
-                       const struct uverbs_attr_spec *spec;
-
-                       if (!uverbs_attr_is_valid_in_hash(curr_bundle, j))
-                               continue;
-
-                       attr = &curr_bundle->attrs[j];
-                       spec = &curr_spec_bucket->attrs[j];
-
-                       if (spec->type == UVERBS_ATTR_TYPE_IDR ||
-                           spec->type == UVERBS_ATTR_TYPE_FD) {
-                               int current_ret;
-
-                               current_ret = uverbs_finalize_object(attr->obj_attr.uobject,
-                                                                    spec->obj.access,
-                                                                    commit);
-                               if (!ret)
-                                       ret = current_ret;
-                       }
-               }
-       }
-       return ret;
-}
index 1efcf93..a243cc2 100644 (file)
@@ -94,9 +94,6 @@ struct ib_uobject *uverbs_get_uobject_from_context(const struct uverbs_obj_type
                                                   struct ib_ucontext *ucontext,
                                                   enum uverbs_obj_access access,
                                                   int id);
-int uverbs_finalize_object(struct ib_uobject *uobj,
-                          enum uverbs_obj_access access,
-                          bool commit);
 /*
  * Note that certain finalize stages could return a status:
  *   (a) alloc_commit could return a failure if the object is committed at the
@@ -112,9 +109,8 @@ int uverbs_finalize_object(struct ib_uobject *uobj,
  * function. For example, this could happen when we couldn't destroy an
  * object.
  */
-int uverbs_finalize_objects(struct uverbs_attr_bundle *attrs_bundle,
-                           struct uverbs_attr_spec_hash * const *spec_hash,
-                           size_t num,
-                           bool commit);
+int uverbs_finalize_object(struct ib_uobject *uobj,
+                          enum uverbs_obj_access access,
+                          bool commit);
 
 #endif /* RDMA_CORE_H */
index 8d32c4a..6759d59 100644 (file)
@@ -167,6 +167,45 @@ static int uverbs_process_attr(struct ib_device *ibdev,
        return 0;
 }
 
+static int uverbs_finalize_attrs(struct uverbs_attr_bundle *attrs_bundle,
+                                struct uverbs_attr_spec_hash *const *spec_hash,
+                                size_t num, bool commit)
+{
+       unsigned int i;
+       int ret = 0;
+
+       for (i = 0; i < num; i++) {
+               struct uverbs_attr_bundle_hash *curr_bundle =
+                       &attrs_bundle->hash[i];
+               const struct uverbs_attr_spec_hash *curr_spec_bucket =
+                       spec_hash[i];
+               unsigned int j;
+
+               for (j = 0; j < curr_bundle->num_attrs; j++) {
+                       struct uverbs_attr *attr;
+                       const struct uverbs_attr_spec *spec;
+
+                       if (!uverbs_attr_is_valid_in_hash(curr_bundle, j))
+                               continue;
+
+                       attr = &curr_bundle->attrs[j];
+                       spec = &curr_spec_bucket->attrs[j];
+
+                       if (spec->type == UVERBS_ATTR_TYPE_IDR ||
+                           spec->type == UVERBS_ATTR_TYPE_FD) {
+                               int current_ret;
+
+                               current_ret = uverbs_finalize_object(
+                                       attr->obj_attr.uobject,
+                                       spec->obj.access, commit);
+                               if (!ret)
+                                       ret = current_ret;
+                       }
+               }
+       }
+       return ret;
+}
+
 static int uverbs_uattrs_process(struct ib_device *ibdev,
                                 struct ib_ucontext *ucontext,
                                 const struct ib_uverbs_attr *uattrs,
@@ -187,10 +226,10 @@ static int uverbs_uattrs_process(struct ib_device *ibdev,
                ret = uverbs_ns_idx(&attr_id, method->num_buckets);
                if (ret < 0) {
                        if (uattr->flags & UVERBS_ATTR_F_MANDATORY) {
-                               uverbs_finalize_objects(attr_bundle,
-                                                       method->attr_buckets,
-                                                       num_given_buckets,
-                                                       false);
+                               uverbs_finalize_attrs(attr_bundle,
+                                                     method->attr_buckets,
+                                                     num_given_buckets,
+                                                     false);
                                return ret;
                        }
                        continue;
@@ -208,10 +247,10 @@ static int uverbs_uattrs_process(struct ib_device *ibdev,
                                          attr_spec_bucket, &attr_bundle->hash[ret],
                                          uattr_ptr++);
                if (ret) {
-                       uverbs_finalize_objects(attr_bundle,
-                                               method->attr_buckets,
-                                               num_given_buckets,
-                                               false);
+                       uverbs_finalize_attrs(attr_bundle,
+                                             method->attr_buckets,
+                                             num_given_buckets,
+                                             false);
                        return ret;
                }
        }
@@ -271,10 +310,10 @@ static int uverbs_handle_method(struct ib_uverbs_attr __user *uattr_ptr,
 
        ret = method_spec->handler(ibdev, ufile, attr_bundle);
 cleanup:
-       finalize_ret = uverbs_finalize_objects(attr_bundle,
-                                              method_spec->attr_buckets,
-                                              attr_bundle->num_buckets,
-                                              !ret);
+       finalize_ret = uverbs_finalize_attrs(attr_bundle,
+                                            method_spec->attr_buckets,
+                                            attr_bundle->num_buckets,
+                                            !ret);
 
        return ret ? ret : finalize_ret;
 }