Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 18 Mar 2024 22:34:03 +0000 (15:34 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 18 Mar 2024 22:34:03 +0000 (15:34 -0700)
Pull rdma updates from Jason Gunthorpe:
 "Very small update this cycle:

   - Minor code improvements in fi, rxe, ipoib, mana, cxgb4, mlx5,
     irdma, rxe, rtrs, mana

   - Simplify the hns hem mechanism

   - Fix EFA's MSI-X allocation in resource constrained configurations

   - Fix a KASN splat in srpt

   - Narrow hns's congestion control selection to QPs granularity and
     allow userspace to select it

   - Solve a parallel module loading race between the CM module and a
     driver module

   - Flexible array cleanup

   - Dump hns's SCC Conext to 'rdma res' for debugging

   - Make mana build page lists for HW objects that require a 0 offset
     correctly

   - Stuck CM ID debugging"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (29 commits)
  RDMA/cm: add timeout to cm_destroy_id wait
  RDMA/mana_ib: Use virtual address in dma regions for MRs
  RDMA/mana_ib: Fix bug in creation of dma regions
  RDMA/hns: Append SCC context to the raw dump of QPC
  RDMA/uverbs: Avoid -Wflex-array-member-not-at-end warnings
  RDMA/hns: Support userspace configuring congestion control algorithm with QP granularity
  RDMA/rtrs-clt: Check strnlen return len in sysfs mpath_policy_store()
  RDMA/uverbs: Remove flexible arrays from struct *_filter
  RDMA/device: Fix a race between mad_client and cm_client init
  RDMA/hns: Fix mis-modifying default congestion control algorithm
  RDMA/rxe: Remove unused 'iova' parameter from rxe_mr_init_user
  RDMA/srpt: Do not register event handler until srpt device is fully setup
  RDMA/irdma: Remove duplicate assignment
  RDMA/efa: Limit EQs to available MSI-X vectors
  RDMA/mlx5: Delete unused mlx5_ib_copy_pas prototype
  RDMA/cxgb4: Delete unused c4iw_ep_redirect prototype
  RDMA/mana_ib: Introduce mana_ib_install_cq_cb helper function
  RDMA/mana_ib: Introduce mana_ib_get_netdev helper function
  RDMA/mana_ib: Introduce mdev_to_gc helper function
  RDMA/hns: Simplify 'struct hns_roce_hem' allocation
  ...

44 files changed:
drivers/infiniband/core/cm.c
drivers/infiniband/core/device.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_ioctl.c
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/efa/efa.h
drivers/infiniband/hw/efa/efa_main.c
drivers/infiniband/hw/hfi1/tid_rdma.c
drivers/infiniband/hw/hns/hns_roce_cmd.h
drivers/infiniband/hw/hns/hns_roce_cq.c
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hem.c
drivers/infiniband/hw/hns/hns_roce_hem.h
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
drivers/infiniband/hw/hns/hns_roce_hw_v2.h
drivers/infiniband/hw/hns/hns_roce_main.c
drivers/infiniband/hw/hns/hns_roce_mr.c
drivers/infiniband/hw/hns/hns_roce_qp.c
drivers/infiniband/hw/hns/hns_roce_restrack.c
drivers/infiniband/hw/irdma/verbs.c
drivers/infiniband/hw/mana/cq.c
drivers/infiniband/hw/mana/main.c
drivers/infiniband/hw/mana/mana_ib.h
drivers/infiniband/hw/mana/mr.c
drivers/infiniband/hw/mana/qp.c
drivers/infiniband/hw/mana/wq.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/sw/rxe/rxe.c
drivers/infiniband/sw/rxe/rxe.h
drivers/infiniband/sw/rxe/rxe_comp.c
drivers/infiniband/sw/rxe/rxe_cq.c
drivers/infiniband/sw/rxe/rxe_loc.h
drivers/infiniband/sw/rxe/rxe_mr.c
drivers/infiniband/sw/rxe/rxe_mw.c
drivers/infiniband/sw/rxe/rxe_qp.c
drivers/infiniband/sw/rxe/rxe_resp.c
drivers/infiniband/sw/rxe/rxe_task.c
drivers/infiniband/sw/rxe/rxe_verbs.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c
drivers/infiniband/ulp/srpt/ib_srpt.c
include/rdma/ib_verbs.h
include/rdma/uverbs_ioctl.h
include/uapi/rdma/hns-abi.h

index ff58058aeadca7f61f018d3a5a09cf9833c95a67..bf0df6ee4f7857b4ac8d9ca1c9789b7ef3e4afa9 100644 (file)
@@ -34,6 +34,7 @@ MODULE_AUTHOR("Sean Hefty");
 MODULE_DESCRIPTION("InfiniBand CM");
 MODULE_LICENSE("Dual BSD/GPL");
 
+#define CM_DESTROY_ID_WAIT_TIMEOUT 10000 /* msecs */
 static const char * const ibcm_rej_reason_strs[] = {
        [IB_CM_REJ_NO_QP]                       = "no QP",
        [IB_CM_REJ_NO_EEC]                      = "no EEC",
@@ -1025,10 +1026,20 @@ static void cm_reset_to_idle(struct cm_id_private *cm_id_priv)
        }
 }
 
+static noinline void cm_destroy_id_wait_timeout(struct ib_cm_id *cm_id)
+{
+       struct cm_id_private *cm_id_priv;
+
+       cm_id_priv = container_of(cm_id, struct cm_id_private, id);
+       pr_err("%s: cm_id=%p timed out. state=%d refcnt=%d\n", __func__,
+              cm_id, cm_id->state, refcount_read(&cm_id_priv->refcount));
+}
+
 static void cm_destroy_id(struct ib_cm_id *cm_id, int err)
 {
        struct cm_id_private *cm_id_priv;
        struct cm_work *work;
+       int ret;
 
        cm_id_priv = container_of(cm_id, struct cm_id_private, id);
        spin_lock_irq(&cm_id_priv->lock);
@@ -1135,7 +1146,14 @@ retest:
 
        xa_erase(&cm.local_id_table, cm_local_id(cm_id->local_id));
        cm_deref_id(cm_id_priv);
-       wait_for_completion(&cm_id_priv->comp);
+       do {
+               ret = wait_for_completion_timeout(&cm_id_priv->comp,
+                                                 msecs_to_jiffies(
+                                                 CM_DESTROY_ID_WAIT_TIMEOUT));
+               if (!ret) /* timeout happened */
+                       cm_destroy_id_wait_timeout(cm_id);
+       } while (!ret);
+
        while ((work = cm_dequeue_work(cm_id_priv)) != NULL)
                cm_free_work(work);
 
index 67bcea7a153c6a1c59054882ee3cd086417a833f..07cb6c5ffda0008fa035e7df7489b3aa097b7477 100644 (file)
@@ -1730,7 +1730,7 @@ static int assign_client_id(struct ib_client *client)
 {
        int ret;
 
-       down_write(&clients_rwsem);
+       lockdep_assert_held(&clients_rwsem);
        /*
         * The add/remove callbacks must be called in FIFO/LIFO order. To
         * achieve this we assign client_ids so they are sorted in
@@ -1739,14 +1739,11 @@ static int assign_client_id(struct ib_client *client)
        client->client_id = highest_client_id;
        ret = xa_insert(&clients, client->client_id, client, GFP_KERNEL);
        if (ret)
-               goto out;
+               return ret;
 
        highest_client_id++;
        xa_set_mark(&clients, client->client_id, CLIENT_REGISTERED);
-
-out:
-       up_write(&clients_rwsem);
-       return ret;
+       return 0;
 }
 
 static void remove_client_id(struct ib_client *client)
@@ -1776,25 +1773,35 @@ int ib_register_client(struct ib_client *client)
 {
        struct ib_device *device;
        unsigned long index;
+       bool need_unreg = false;
        int ret;
 
        refcount_set(&client->uses, 1);
        init_completion(&client->uses_zero);
+
+       /*
+        * The devices_rwsem is held in write mode to ensure that a racing
+        * ib_register_device() sees a consisent view of clients and devices.
+        */
+       down_write(&devices_rwsem);
+       down_write(&clients_rwsem);
        ret = assign_client_id(client);
        if (ret)
-               return ret;
+               goto out;
 
-       down_read(&devices_rwsem);
+       need_unreg = true;
        xa_for_each_marked (&devices, index, device, DEVICE_REGISTERED) {
                ret = add_client_context(device, client);
-               if (ret) {
-                       up_read(&devices_rwsem);
-                       ib_unregister_client(client);
-                       return ret;
-               }
+               if (ret)
+                       goto out;
        }
-       up_read(&devices_rwsem);
-       return 0;
+       ret = 0;
+out:
+       up_write(&clients_rwsem);
+       up_write(&devices_rwsem);
+       if (need_unreg && ret)
+               ib_unregister_client(client);
+       return ret;
 }
 EXPORT_SYMBOL(ib_register_client);
 
index 6de05ade2ba94c213fd906c1703889ba83615d75..3d3ee3eca98306184d891801b67bf01b24cf212c 100644 (file)
@@ -2737,7 +2737,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
 
        switch (ib_spec->type & ~IB_FLOW_SPEC_INNER) {
        case IB_FLOW_SPEC_ETH:
-               ib_filter_sz = offsetof(struct ib_flow_eth_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_eth_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
@@ -2748,7 +2748,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                memcpy(&ib_spec->eth.mask, kern_spec_mask, actual_filter_sz);
                break;
        case IB_FLOW_SPEC_IPV4:
-               ib_filter_sz = offsetof(struct ib_flow_ipv4_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_ipv4_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
@@ -2759,7 +2759,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                memcpy(&ib_spec->ipv4.mask, kern_spec_mask, actual_filter_sz);
                break;
        case IB_FLOW_SPEC_IPV6:
-               ib_filter_sz = offsetof(struct ib_flow_ipv6_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_ipv6_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
@@ -2775,7 +2775,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                break;
        case IB_FLOW_SPEC_TCP:
        case IB_FLOW_SPEC_UDP:
-               ib_filter_sz = offsetof(struct ib_flow_tcp_udp_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_tcp_udp_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
@@ -2786,7 +2786,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                memcpy(&ib_spec->tcp_udp.mask, kern_spec_mask, actual_filter_sz);
                break;
        case IB_FLOW_SPEC_VXLAN_TUNNEL:
-               ib_filter_sz = offsetof(struct ib_flow_tunnel_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_tunnel_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
@@ -2801,7 +2801,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                        return -EINVAL;
                break;
        case IB_FLOW_SPEC_ESP:
-               ib_filter_sz = offsetof(struct ib_flow_esp_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_esp_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
@@ -2812,7 +2812,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                memcpy(&ib_spec->esp.mask, kern_spec_mask, actual_filter_sz);
                break;
        case IB_FLOW_SPEC_GRE:
-               ib_filter_sz = offsetof(struct ib_flow_gre_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_gre_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
@@ -2823,7 +2823,7 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                memcpy(&ib_spec->gre.mask, kern_spec_mask, actual_filter_sz);
                break;
        case IB_FLOW_SPEC_MPLS:
-               ib_filter_sz = offsetof(struct ib_flow_mpls_filter, real_sz);
+               ib_filter_sz = sizeof(struct ib_flow_mpls_filter);
                actual_filter_sz = spec_filter_size(kern_spec_mask,
                                                    kern_filter_sz,
                                                    ib_filter_sz);
index d9799706c58e997c225b1e661307eb7e21afd420..f80da6a67e24e482a3aa8f068775e47c91eb7c3b 100644 (file)
 #include "uverbs.h"
 
 struct bundle_alloc_head {
-       struct bundle_alloc_head *next;
+       struct_group_tagged(bundle_alloc_head_hdr, hdr,
+               struct bundle_alloc_head *next;
+       );
        u8 data[];
 };
 
 struct bundle_priv {
        /* Must be first */
-       struct bundle_alloc_head alloc_head;
+       struct bundle_alloc_head_hdr alloc_head;
        struct bundle_alloc_head *allocated_mem;
        size_t internal_avail;
        size_t internal_used;
@@ -64,7 +66,7 @@ struct bundle_priv {
         * Must be last. bundle ends in a flex array which overlaps
         * internal_buffer.
         */
-       struct uverbs_attr_bundle bundle;
+       struct uverbs_attr_bundle_hdr bundle;
        u64 internal_buffer[32];
 };
 
@@ -77,9 +79,10 @@ void uapi_compute_bundle_size(struct uverbs_api_ioctl_method *method_elm,
                              unsigned int num_attrs)
 {
        struct bundle_priv *pbundle;
+       struct uverbs_attr_bundle *bundle;
        size_t bundle_size =
                offsetof(struct bundle_priv, internal_buffer) +
-               sizeof(*pbundle->bundle.attrs) * method_elm->key_bitmap_len +
+               sizeof(*bundle->attrs) * method_elm->key_bitmap_len +
                sizeof(*pbundle->uattrs) * num_attrs;
 
        method_elm->use_stack = bundle_size <= sizeof(*pbundle);
@@ -107,7 +110,7 @@ __malloc void *_uverbs_alloc(struct uverbs_attr_bundle *bundle, size_t size,
                             gfp_t flags)
 {
        struct bundle_priv *pbundle =
-               container_of(bundle, struct bundle_priv, bundle);
+               container_of(&bundle->hdr, struct bundle_priv, bundle);
        size_t new_used;
        void *res;
 
@@ -149,7 +152,7 @@ static int uverbs_set_output(const struct uverbs_attr_bundle *bundle,
                             const struct uverbs_attr *attr)
 {
        struct bundle_priv *pbundle =
-               container_of(bundle, struct bundle_priv, bundle);
+               container_of(&bundle->hdr, struct bundle_priv, bundle);
        u16 flags;
 
        flags = pbundle->uattrs[attr->ptr_attr.uattr_idx].flags |
@@ -166,6 +169,8 @@ static int uverbs_process_idrs_array(struct bundle_priv *pbundle,
                                     struct ib_uverbs_attr *uattr,
                                     u32 attr_bkey)
 {
+       struct uverbs_attr_bundle *bundle =
+               container_of(&pbundle->bundle, struct uverbs_attr_bundle, hdr);
        const struct uverbs_attr_spec *spec = &attr_uapi->spec;
        size_t array_len;
        u32 *idr_vals;
@@ -184,7 +189,7 @@ static int uverbs_process_idrs_array(struct bundle_priv *pbundle,
                return -EINVAL;
 
        attr->uobjects =
-               uverbs_alloc(&pbundle->bundle,
+               uverbs_alloc(bundle,
                             array_size(array_len, sizeof(*attr->uobjects)));
        if (IS_ERR(attr->uobjects))
                return PTR_ERR(attr->uobjects);
@@ -209,7 +214,7 @@ static int uverbs_process_idrs_array(struct bundle_priv *pbundle,
        for (i = 0; i != array_len; i++) {
                attr->uobjects[i] = uverbs_get_uobject_from_file(
                        spec->u2.objs_arr.obj_type, spec->u2.objs_arr.access,
-                       idr_vals[i], &pbundle->bundle);
+                       idr_vals[i], bundle);
                if (IS_ERR(attr->uobjects[i])) {
                        ret = PTR_ERR(attr->uobjects[i]);
                        break;
@@ -240,7 +245,9 @@ static int uverbs_process_attr(struct bundle_priv *pbundle,
                               struct ib_uverbs_attr *uattr, u32 attr_bkey)
 {
        const struct uverbs_attr_spec *spec = &attr_uapi->spec;
-       struct uverbs_attr *e = &pbundle->bundle.attrs[attr_bkey];
+       struct uverbs_attr_bundle *bundle =
+               container_of(&pbundle->bundle, struct uverbs_attr_bundle, hdr);
+       struct uverbs_attr *e = &bundle->attrs[attr_bkey];
        const struct uverbs_attr_spec *val_spec = spec;
        struct uverbs_obj_attr *o_attr;
 
@@ -288,7 +295,7 @@ static int uverbs_process_attr(struct bundle_priv *pbundle,
                if (val_spec->alloc_and_copy && !uverbs_attr_ptr_is_inline(e)) {
                        void *p;
 
-                       p = uverbs_alloc(&pbundle->bundle, uattr->len);
+                       p = uverbs_alloc(bundle, uattr->len);
                        if (IS_ERR(p))
                                return PTR_ERR(p);
 
@@ -321,7 +328,7 @@ static int uverbs_process_attr(struct bundle_priv *pbundle,
                 */
                o_attr->uobject = uverbs_get_uobject_from_file(
                        spec->u.obj.obj_type, spec->u.obj.access,
-                       uattr->data_s64, &pbundle->bundle);
+                       uattr->data_s64, bundle);
                if (IS_ERR(o_attr->uobject))
                        return PTR_ERR(o_attr->uobject);
                __set_bit(attr_bkey, pbundle->uobj_finalize);
@@ -422,6 +429,8 @@ static int ib_uverbs_run_method(struct bundle_priv *pbundle,
                                unsigned int num_attrs)
 {
        int (*handler)(struct uverbs_attr_bundle *attrs);
+       struct uverbs_attr_bundle *bundle =
+               container_of(&pbundle->bundle, struct uverbs_attr_bundle, hdr);
        size_t uattrs_size = array_size(sizeof(*pbundle->uattrs), num_attrs);
        unsigned int destroy_bkey = pbundle->method_elm->destroy_bkey;
        unsigned int i;
@@ -434,7 +443,7 @@ static int ib_uverbs_run_method(struct bundle_priv *pbundle,
        if (!handler)
                return -EIO;
 
-       pbundle->uattrs = uverbs_alloc(&pbundle->bundle, uattrs_size);
+       pbundle->uattrs = uverbs_alloc(bundle, uattrs_size);
        if (IS_ERR(pbundle->uattrs))
                return PTR_ERR(pbundle->uattrs);
        if (copy_from_user(pbundle->uattrs, pbundle->user_attrs, uattrs_size))
@@ -453,25 +462,23 @@ static int ib_uverbs_run_method(struct bundle_priv *pbundle,
                return -EINVAL;
 
        if (pbundle->method_elm->has_udata)
-               uverbs_fill_udata(&pbundle->bundle,
-                                 &pbundle->bundle.driver_udata,
+               uverbs_fill_udata(bundle, &pbundle->bundle.driver_udata,
                                  UVERBS_ATTR_UHW_IN, UVERBS_ATTR_UHW_OUT);
        else
                pbundle->bundle.driver_udata = (struct ib_udata){};
 
        if (destroy_bkey != UVERBS_API_ATTR_BKEY_LEN) {
-               struct uverbs_obj_attr *destroy_attr =
-                       &pbundle->bundle.attrs[destroy_bkey].obj_attr;
+               struct uverbs_obj_attr *destroy_attr = &bundle->attrs[destroy_bkey].obj_attr;
 
-               ret = uobj_destroy(destroy_attr->uobject, &pbundle->bundle);
+               ret = uobj_destroy(destroy_attr->uobject, bundle);
                if (ret)
                        return ret;
                __clear_bit(destroy_bkey, pbundle->uobj_finalize);
 
-               ret = handler(&pbundle->bundle);
+               ret = handler(bundle);
                uobj_put_destroy(destroy_attr->uobject);
        } else {
-               ret = handler(&pbundle->bundle);
+               ret = handler(bundle);
        }
 
        /*
@@ -481,10 +488,10 @@ static int ib_uverbs_run_method(struct bundle_priv *pbundle,
         */
        if (!ret && pbundle->method_elm->has_udata) {
                const struct uverbs_attr *attr =
-                       uverbs_attr_get(&pbundle->bundle, UVERBS_ATTR_UHW_OUT);
+                       uverbs_attr_get(bundle, UVERBS_ATTR_UHW_OUT);
 
                if (!IS_ERR(attr))
-                       ret = uverbs_set_output(&pbundle->bundle, attr);
+                       ret = uverbs_set_output(bundle, attr);
        }
 
        /*
@@ -501,6 +508,8 @@ static int ib_uverbs_run_method(struct bundle_priv *pbundle,
 static void bundle_destroy(struct bundle_priv *pbundle, bool commit)
 {
        unsigned int key_bitmap_len = pbundle->method_elm->key_bitmap_len;
+       struct uverbs_attr_bundle *bundle =
+               container_of(&pbundle->bundle, struct uverbs_attr_bundle, hdr);
        struct bundle_alloc_head *memblock;
        unsigned int i;
 
@@ -508,20 +517,19 @@ static void bundle_destroy(struct bundle_priv *pbundle, bool commit)
        i = -1;
        while ((i = find_next_bit(pbundle->uobj_finalize, key_bitmap_len,
                                  i + 1)) < key_bitmap_len) {
-               struct uverbs_attr *attr = &pbundle->bundle.attrs[i];
+               struct uverbs_attr *attr = &bundle->attrs[i];
 
                uverbs_finalize_object(
                        attr->obj_attr.uobject,
                        attr->obj_attr.attr_elm->spec.u.obj.access,
                        test_bit(i, pbundle->uobj_hw_obj_valid),
-                       commit,
-                       &pbundle->bundle);
+                       commit, bundle);
        }
 
        i = -1;
        while ((i = find_next_bit(pbundle->spec_finalize, key_bitmap_len,
                                  i + 1)) < key_bitmap_len) {
-               struct uverbs_attr *attr = &pbundle->bundle.attrs[i];
+               struct uverbs_attr *attr = &bundle->attrs[i];
                const struct uverbs_api_attr *attr_uapi;
                void __rcu **slot;
 
@@ -535,7 +543,7 @@ static void bundle_destroy(struct bundle_priv *pbundle, bool commit)
 
                if (attr_uapi->spec.type == UVERBS_ATTR_TYPE_IDRS_ARRAY) {
                        uverbs_free_idrs_array(attr_uapi, &attr->objs_arr_attr,
-                                              commit, &pbundle->bundle);
+                                              commit, bundle);
                }
        }
 
@@ -578,7 +586,8 @@ static int ib_uverbs_cmd_verbs(struct ib_uverbs_file *ufile,
                        method_elm->bundle_size -
                        offsetof(struct bundle_priv, internal_buffer);
                pbundle->alloc_head.next = NULL;
-               pbundle->allocated_mem = &pbundle->alloc_head;
+               pbundle->allocated_mem = container_of(&pbundle->alloc_head,
+                                               struct bundle_alloc_head, hdr);
        } else {
                pbundle = &onstack;
                pbundle->internal_avail = sizeof(pbundle->internal_buffer);
@@ -596,8 +605,9 @@ static int ib_uverbs_cmd_verbs(struct ib_uverbs_file *ufile,
        pbundle->user_attrs = user_attrs;
 
        pbundle->internal_used = ALIGN(pbundle->method_elm->key_bitmap_len *
-                                              sizeof(*pbundle->bundle.attrs),
-                                      sizeof(*pbundle->internal_buffer));
+                                              sizeof(*container_of(&pbundle->bundle,
+                                                       struct uverbs_attr_bundle, hdr)->attrs),
+                                              sizeof(*pbundle->internal_buffer));
        memset(pbundle->bundle.attr_present, 0,
               sizeof(pbundle->bundle.attr_present));
        memset(pbundle->uobj_finalize, 0, sizeof(pbundle->uobj_finalize));
@@ -700,11 +710,13 @@ void uverbs_fill_udata(struct uverbs_attr_bundle *bundle,
                       unsigned int attr_out)
 {
        struct bundle_priv *pbundle =
-               container_of(bundle, struct bundle_priv, bundle);
+               container_of(&bundle->hdr, struct bundle_priv, bundle);
+       struct uverbs_attr_bundle *bundle_aux =
+               container_of(&pbundle->bundle, struct uverbs_attr_bundle, hdr);
        const struct uverbs_attr *in =
-               uverbs_attr_get(&pbundle->bundle, attr_in);
+               uverbs_attr_get(bundle_aux, attr_in);
        const struct uverbs_attr *out =
-               uverbs_attr_get(&pbundle->bundle, attr_out);
+               uverbs_attr_get(bundle_aux, attr_out);
 
        if (!IS_ERR(in)) {
                udata->inlen = in->ptr_attr.len;
@@ -829,7 +841,7 @@ void uverbs_finalize_uobj_create(const struct uverbs_attr_bundle *bundle,
                                 u16 idx)
 {
        struct bundle_priv *pbundle =
-               container_of(bundle, struct bundle_priv, bundle);
+               container_of(&bundle->hdr, struct bundle_priv, bundle);
 
        __set_bit(uapi_bkey_attr(uapi_key_attr(idx)),
                  pbundle->uobj_hw_obj_valid);
index 50cb2259bf874396f1117233e9b30d99d67e6d3b..fb8a0c2488667ebc66a901a9df429e7213345c9a 100644 (file)
@@ -930,8 +930,6 @@ void c4iw_id_table_free(struct c4iw_id_table *alloc);
 
 typedef int (*c4iw_handler_func)(struct c4iw_dev *dev, struct sk_buff *skb);
 
-int c4iw_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new,
-                    struct l2t_entry *l2t);
 void c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qpid,
                   struct c4iw_dev_ucontext *uctx);
 u32 c4iw_get_resource(struct c4iw_id_table *id_table);
index e2bdec32ae80539011a88c41b1f5db1ba595a131..926f9ff1f60fda6df21e58f948b5243be7960c16 100644 (file)
@@ -57,6 +57,7 @@ struct efa_dev {
        u64 db_bar_addr;
        u64 db_bar_len;
 
+       unsigned int num_irq_vectors;
        int admin_msix_vector_idx;
        struct efa_irq admin_irq;
 
index 7b1910a862164599ef95bdd07f11868672440885..5fa3603c80d82f83416f9cc8f514ee32f841b38b 100644 (file)
@@ -322,7 +322,9 @@ static int efa_create_eqs(struct efa_dev *dev)
        int err;
        int i;
 
-       neqs = min_t(unsigned int, neqs, num_online_cpus());
+       neqs = min_t(unsigned int, neqs,
+                    dev->num_irq_vectors - EFA_COMP_EQS_VEC_BASE);
+
        dev->neqs = neqs;
        dev->eqs = kcalloc(neqs, sizeof(*dev->eqs), GFP_KERNEL);
        if (!dev->eqs)
@@ -468,34 +470,30 @@ static void efa_disable_msix(struct efa_dev *dev)
 
 static int efa_enable_msix(struct efa_dev *dev)
 {
-       int msix_vecs, irq_num;
+       int max_vecs, num_vecs;
 
        /*
         * Reserve the max msix vectors we might need, one vector is reserved
         * for admin.
         */
-       msix_vecs = min_t(int, pci_msix_vec_count(dev->pdev),
-                         num_online_cpus() + 1);
+       max_vecs = min_t(int, pci_msix_vec_count(dev->pdev),
+                        num_online_cpus() + 1);
        dev_dbg(&dev->pdev->dev, "Trying to enable MSI-X, vectors %d\n",
-               msix_vecs);
+               max_vecs);
 
        dev->admin_msix_vector_idx = EFA_MGMNT_MSIX_VEC_IDX;
-       irq_num = pci_alloc_irq_vectors(dev->pdev, msix_vecs,
-                                       msix_vecs, PCI_IRQ_MSIX);
+       num_vecs = pci_alloc_irq_vectors(dev->pdev, 1,
+                                        max_vecs, PCI_IRQ_MSIX);
 
-       if (irq_num < 0) {
-               dev_err(&dev->pdev->dev, "Failed to enable MSI-X. irq_num %d\n",
-                       irq_num);
+       if (num_vecs < 0) {
+               dev_err(&dev->pdev->dev, "Failed to enable MSI-X. error %d\n",
+                       num_vecs);
                return -ENOSPC;
        }
 
-       if (irq_num != msix_vecs) {
-               efa_disable_msix(dev);
-               dev_err(&dev->pdev->dev,
-                       "Allocated %d MSI-X (out of %d requested)\n",
-                       irq_num, msix_vecs);
-               return -ENOSPC;
-       }
+       dev_dbg(&dev->pdev->dev, "Allocated %d MSI-X vectors\n", num_vecs);
+
+       dev->num_irq_vectors = num_vecs;
 
        return 0;
 }
index 18b05ffb415a3050586f08db1d6f020de60766ca..c465966a1d9c9d19d2daff9c9ded56feeb211a79 100644 (file)
@@ -315,7 +315,7 @@ int hfi1_kern_exp_rcv_init(struct hfi1_ctxtdata *rcd, int reinit)
  * This routine returns the receive context associated
  * with a a qp's qpn.
  *
- * Returns the context.
+ * Return: the context.
  */
 static struct hfi1_ctxtdata *qp_to_rcd(struct rvt_dev_info *rdi,
                                       struct rvt_qp *qp)
@@ -710,7 +710,7 @@ void hfi1_tid_rdma_flush_wait(struct rvt_qp *qp)
  * The exp_lock must be held.
  *
  * Return:
- * On success: a value postive value between 0 and RXE_NUM_TID_FLOWS - 1
+ * On success: a value positive value between 0 and RXE_NUM_TID_FLOWS - 1
  * On failure: -EAGAIN
  */
 static int kern_reserve_flow(struct hfi1_ctxtdata *rcd, int last)
@@ -1007,7 +1007,7 @@ static u32 tid_flush_pages(struct tid_rdma_pageset *list,
  * pages are tested two at a time, i, i + 1 for contiguous
  * pages and i - 1 and i contiguous pages.
  *
- * If any condition is false, any accumlated pages are flushed and
+ * If any condition is false, any accumulated pages are flushed and
  * v0,v1 are emitted as separate PAGE_SIZE pagesets
  *
  * Otherwise, the current 8k is totaled for a future flush.
@@ -1434,7 +1434,7 @@ static void kern_program_rcvarray(struct tid_rdma_flow *flow)
  * (5) computes a tidarray with formatted TID entries which can be sent
  *     to the sender
  * (6) Reserves and programs HW flows.
- * (7) It also manages queing the QP when TID/flow resources are not
+ * (7) It also manages queueing the QP when TID/flow resources are not
  *     available.
  *
  * @req points to struct tid_rdma_request of which the segments are a part. The
@@ -1604,7 +1604,7 @@ void hfi1_kern_exp_rcv_clear_all(struct tid_rdma_request *req)
 }
 
 /**
- * hfi1_kern_exp_rcv_free_flows - free priviously allocated flow information
+ * hfi1_kern_exp_rcv_free_flows - free previously allocated flow information
  * @req: the tid rdma request to be cleaned
  */
 static void hfi1_kern_exp_rcv_free_flows(struct tid_rdma_request *req)
@@ -2055,7 +2055,7 @@ static int tid_rdma_rcv_error(struct hfi1_packet *packet,
                 * req->clear_tail is advanced). However, when an earlier
                 * request is received, this request will not be complete any
                 * more (qp->s_tail_ack_queue is moved back, see below).
-                * Consequently, we need to update the TID flow info everytime
+                * Consequently, we need to update the TID flow info every time
                 * a duplicate request is received.
                 */
                bth0 = be32_to_cpu(ohdr->bth[0]);
@@ -2219,7 +2219,7 @@ void hfi1_rc_rcv_tid_rdma_read_req(struct hfi1_packet *packet)
        /*
         * 1. Verify TID RDMA READ REQ as per IB_OPCODE_RC_RDMA_READ
         *    (see hfi1_rc_rcv())
-        * 2. Put TID RDMA READ REQ into the response queueu (s_ack_queue)
+        * 2. Put TID RDMA READ REQ into the response queue (s_ack_queue)
         *     - Setup struct tid_rdma_req with request info
         *     - Initialize struct tid_rdma_flow info;
         *     - Copy TID entries;
@@ -2439,7 +2439,7 @@ find_tid_request(struct rvt_qp *qp, u32 psn, enum ib_wr_opcode opcode)
 
 void hfi1_rc_rcv_tid_rdma_read_resp(struct hfi1_packet *packet)
 {
-       /* HANDLER FOR TID RDMA READ RESPONSE packet (Requestor side */
+       /* HANDLER FOR TID RDMA READ RESPONSE packet (Requester side) */
 
        /*
         * 1. Find matching SWQE
@@ -3649,7 +3649,7 @@ void hfi1_rc_rcv_tid_rdma_write_req(struct hfi1_packet *packet)
         * 1. Verify TID RDMA WRITE REQ as per IB_OPCODE_RC_RDMA_WRITE_FIRST
         *    (see hfi1_rc_rcv())
         *     - Don't allow 0-length requests.
-        * 2. Put TID RDMA WRITE REQ into the response queueu (s_ack_queue)
+        * 2. Put TID RDMA WRITE REQ into the response queue (s_ack_queue)
         *     - Setup struct tid_rdma_req with request info
         *     - Prepare struct tid_rdma_flow array?
         * 3. Set the qp->s_ack_state as state diagram in design doc.
@@ -4026,7 +4026,7 @@ unlock_r_lock:
 
 void hfi1_rc_rcv_tid_rdma_write_resp(struct hfi1_packet *packet)
 {
-       /* HANDLER FOR TID RDMA WRITE RESPONSE packet (Requestor side */
+       /* HANDLER FOR TID RDMA WRITE RESPONSE packet (Requester side) */
 
        /*
         * 1. Find matching SWQE
@@ -5440,8 +5440,9 @@ static bool _hfi1_schedule_tid_send(struct rvt_qp *qp)
  * the two state machines can step on each other with respect to the
  * RVT_S_BUSY flag.
  * Therefore, a modified test is used.
- * @return true if the second leg is scheduled;
- *  false if the second leg is not scheduled.
+ *
+ * Return: %true if the second leg is scheduled;
+ *  %false if the second leg is not scheduled.
  */
 bool hfi1_schedule_tid_send(struct rvt_qp *qp)
 {
index 052a3d60905aa3063f00596c529d6facf52de74e..11dbbabebdc908db409e52e546cfa95ded0fef39 100644 (file)
@@ -108,6 +108,9 @@ enum {
        HNS_ROCE_CMD_QUERY_CEQC         = 0x92,
        HNS_ROCE_CMD_DESTROY_CEQC       = 0x93,
 
+       /* SCC CTX commands */
+       HNS_ROCE_CMD_QUERY_SCCC         = 0xa2,
+
        /* SCC CTX BT commands */
        HNS_ROCE_CMD_READ_SCCC_BT0      = 0xa4,
        HNS_ROCE_CMD_WRITE_SCCC_BT0     = 0xa5,
index 1b6d16af8c12beec30b77f779784f4bdd24f4f03..7250d0643b5c5dd9baaa6e95388dc447d36c7ad0 100644 (file)
@@ -133,14 +133,12 @@ static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
        struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
        struct ib_device *ibdev = &hr_dev->ib_dev;
        u64 mtts[MTT_MIN_COUNT] = {};
-       dma_addr_t dma_handle;
        int ret;
 
-       ret = hns_roce_mtr_find(hr_dev, &hr_cq->mtr, 0, mtts, ARRAY_SIZE(mtts),
-                               &dma_handle);
-       if (!ret) {
+       ret = hns_roce_mtr_find(hr_dev, &hr_cq->mtr, 0, mtts, ARRAY_SIZE(mtts));
+       if (ret) {
                ibdev_err(ibdev, "failed to find CQ mtr, ret = %d.\n", ret);
-               return -EINVAL;
+               return ret;
        }
 
        /* Get CQC memory HEM(Hardware Entry Memory) table */
@@ -157,7 +155,8 @@ static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
                goto err_put;
        }
 
-       ret = hns_roce_create_cqc(hr_dev, hr_cq, mtts, dma_handle);
+       ret = hns_roce_create_cqc(hr_dev, hr_cq, mtts,
+                                 hns_roce_get_mtr_ba(&hr_cq->mtr));
        if (ret)
                goto err_xa;
 
index b1fce5ddf6316c743f3cb634da79e1d83d3f2685..c3cbd0a494bfd8e573aa30595782801011839c72 100644 (file)
@@ -179,6 +179,7 @@ enum {
 
 #define HNS_ROCE_CMD_SUCCESS                   1
 
+#define HNS_ROCE_MAX_HOP_NUM                   3
 /* The minimum page size is 4K for hardware */
 #define HNS_HW_PAGE_SHIFT                      12
 #define HNS_HW_PAGE_SIZE                       (1 << HNS_HW_PAGE_SHIFT)
@@ -269,6 +270,11 @@ struct hns_roce_hem_list {
        dma_addr_t root_ba; /* pointer to the root ba table */
 };
 
+enum mtr_type {
+       MTR_DEFAULT = 0,
+       MTR_PBL,
+};
+
 struct hns_roce_buf_attr {
        struct {
                size_t  size;  /* region size */
@@ -277,7 +283,10 @@ struct hns_roce_buf_attr {
        unsigned int region_count; /* valid region count */
        unsigned int page_shift;  /* buffer page shift */
        unsigned int user_access; /* umem access flag */
+       u64 iova;
+       enum mtr_type type;
        bool mtt_only; /* only alloc buffer-required MTT memory */
+       bool adaptive; /* adaptive for page_shift and hopnum */
 };
 
 struct hns_roce_hem_cfg {
@@ -585,6 +594,13 @@ struct hns_roce_work {
        u32 queue_num;
 };
 
+enum hns_roce_cong_type {
+       CONG_TYPE_DCQCN,
+       CONG_TYPE_LDCP,
+       CONG_TYPE_HC3,
+       CONG_TYPE_DIP,
+};
+
 struct hns_roce_qp {
        struct ib_qp            ibqp;
        struct hns_roce_wq      rq;
@@ -628,6 +644,7 @@ struct hns_roce_qp {
        struct list_head        sq_node; /* all send qps are on a list */
        struct hns_user_mmap_entry *dwqe_mmap_entry;
        u32                     config;
+       enum hns_roce_cong_type cong_type;
 };
 
 struct hns_roce_ib_iboe {
@@ -699,13 +716,6 @@ struct hns_roce_eq_table {
        struct hns_roce_eq      *eq;
 };
 
-enum cong_type {
-       CONG_TYPE_DCQCN,
-       CONG_TYPE_LDCP,
-       CONG_TYPE_HC3,
-       CONG_TYPE_DIP,
-};
-
 struct hns_roce_caps {
        u64             fw_ver;
        u8              num_ports;
@@ -835,7 +845,8 @@ struct hns_roce_caps {
        u16             default_aeq_period;
        u16             default_aeq_arm_st;
        u16             default_ceq_arm_st;
-       enum cong_type  cong_type;
+       u8              cong_cap;
+       enum hns_roce_cong_type default_cong_type;
 };
 
 enum hns_roce_device_state {
@@ -936,6 +947,7 @@ struct hns_roce_hw {
        int (*query_qpc)(struct hns_roce_dev *hr_dev, u32 qpn, void *buffer);
        int (*query_mpt)(struct hns_roce_dev *hr_dev, u32 key, void *buffer);
        int (*query_srqc)(struct hns_roce_dev *hr_dev, u32 srqn, void *buffer);
+       int (*query_sccc)(struct hns_roce_dev *hr_dev, u32 qpn, void *buffer);
        int (*query_hw_counter)(struct hns_roce_dev *hr_dev,
                                u64 *stats, u32 port, int *hw_counters);
        const struct ib_device_ops *hns_roce_dev_ops;
@@ -1152,8 +1164,13 @@ void hns_roce_cmd_use_polling(struct hns_roce_dev *hr_dev);
 
 /* hns roce hw need current block and next block addr from mtt */
 #define MTT_MIN_COUNT   2
+static inline dma_addr_t hns_roce_get_mtr_ba(struct hns_roce_mtr *mtr)
+{
+       return mtr->hem_cfg.root_ba;
+}
+
 int hns_roce_mtr_find(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
-                     u32 offset, u64 *mtt_buf, int mtt_max, u64 *base_addr);
+                     u32 offset, u64 *mtt_buf, int mtt_max);
 int hns_roce_mtr_create(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
                        struct hns_roce_buf_attr *buf_attr,
                        unsigned int page_shift, struct ib_udata *udata,
index c4ac06a338696910939656703a308342832f5ba0..a4b3f19161dc1309f919b345e4ad8c88f4bd1038 100644 (file)
@@ -249,61 +249,34 @@ int hns_roce_calc_hem_mhop(struct hns_roce_dev *hr_dev,
 }
 
 static struct hns_roce_hem *hns_roce_alloc_hem(struct hns_roce_dev *hr_dev,
-                                              int npages,
                                               unsigned long hem_alloc_size,
                                               gfp_t gfp_mask)
 {
-       struct hns_roce_hem_chunk *chunk = NULL;
        struct hns_roce_hem *hem;
-       struct scatterlist *mem;
        int order;
        void *buf;
 
        WARN_ON(gfp_mask & __GFP_HIGHMEM);
 
+       order = get_order(hem_alloc_size);
+       if (PAGE_SIZE << order != hem_alloc_size) {
+               dev_err(hr_dev->dev, "invalid hem_alloc_size: %lu!\n",
+                       hem_alloc_size);
+               return NULL;
+       }
+
        hem = kmalloc(sizeof(*hem),
                      gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN));
        if (!hem)
                return NULL;
 
-       INIT_LIST_HEAD(&hem->chunk_list);
-
-       order = get_order(hem_alloc_size);
-
-       while (npages > 0) {
-               if (!chunk) {
-                       chunk = kmalloc(sizeof(*chunk),
-                               gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN));
-                       if (!chunk)
-                               goto fail;
-
-                       sg_init_table(chunk->mem, HNS_ROCE_HEM_CHUNK_LEN);
-                       chunk->npages = 0;
-                       chunk->nsg = 0;
-                       memset(chunk->buf, 0, sizeof(chunk->buf));
-                       list_add_tail(&chunk->list, &hem->chunk_list);
-               }
+       buf = dma_alloc_coherent(hr_dev->dev, hem_alloc_size,
+                                &hem->dma, gfp_mask);
+       if (!buf)
+               goto fail;
 
-               while (1 << order > npages)
-                       --order;
-
-               /*
-                * Alloc memory one time. If failed, don't alloc small block
-                * memory, directly return fail.
-                */
-               mem = &chunk->mem[chunk->npages];
-               buf = dma_alloc_coherent(hr_dev->dev, PAGE_SIZE << order,
-                               &sg_dma_address(mem), gfp_mask);
-               if (!buf)
-                       goto fail;
-
-               chunk->buf[chunk->npages] = buf;
-               sg_dma_len(mem) = PAGE_SIZE << order;
-
-               ++chunk->npages;
-               ++chunk->nsg;
-               npages -= 1 << order;
-       }
+       hem->buf = buf;
+       hem->size = hem_alloc_size;
 
        return hem;
 
@@ -314,20 +287,10 @@ fail:
 
 void hns_roce_free_hem(struct hns_roce_dev *hr_dev, struct hns_roce_hem *hem)
 {
-       struct hns_roce_hem_chunk *chunk, *tmp;
-       int i;
-
        if (!hem)
                return;
 
-       list_for_each_entry_safe(chunk, tmp, &hem->chunk_list, list) {
-               for (i = 0; i < chunk->npages; ++i)
-                       dma_free_coherent(hr_dev->dev,
-                                  sg_dma_len(&chunk->mem[i]),
-                                  chunk->buf[i],
-                                  sg_dma_address(&chunk->mem[i]));
-               kfree(chunk);
-       }
+       dma_free_coherent(hr_dev->dev, hem->size, hem->buf, hem->dma);
 
        kfree(hem);
 }
@@ -415,7 +378,6 @@ static int alloc_mhop_hem(struct hns_roce_dev *hr_dev,
 {
        u32 bt_size = mhop->bt_chunk_size;
        struct device *dev = hr_dev->dev;
-       struct hns_roce_hem_iter iter;
        gfp_t flag;
        u64 bt_ba;
        u32 size;
@@ -456,16 +418,15 @@ static int alloc_mhop_hem(struct hns_roce_dev *hr_dev,
         */
        size = table->type < HEM_TYPE_MTT ? mhop->buf_chunk_size : bt_size;
        flag = GFP_KERNEL | __GFP_NOWARN;
-       table->hem[index->buf] = hns_roce_alloc_hem(hr_dev, size >> PAGE_SHIFT,
-                                                   size, flag);
+       table->hem[index->buf] = hns_roce_alloc_hem(hr_dev, size, flag);
        if (!table->hem[index->buf]) {
                ret = -ENOMEM;
                goto err_alloc_hem;
        }
 
        index->inited |= HEM_INDEX_BUF;
-       hns_roce_hem_first(table->hem[index->buf], &iter);
-       bt_ba = hns_roce_hem_addr(&iter);
+       bt_ba = table->hem[index->buf]->dma;
+
        if (table->type < HEM_TYPE_MTT) {
                if (mhop->hop_num == 2)
                        *(table->bt_l1[index->l1] + mhop->l2_idx) = bt_ba;
@@ -586,7 +547,6 @@ int hns_roce_table_get(struct hns_roce_dev *hr_dev,
        }
 
        table->hem[i] = hns_roce_alloc_hem(hr_dev,
-                                      table->table_chunk_size >> PAGE_SHIFT,
                                       table->table_chunk_size,
                                       GFP_KERNEL | __GFP_NOWARN);
        if (!table->hem[i]) {
@@ -725,7 +685,6 @@ void *hns_roce_table_find(struct hns_roce_dev *hr_dev,
                          struct hns_roce_hem_table *table,
                          unsigned long obj, dma_addr_t *dma_handle)
 {
-       struct hns_roce_hem_chunk *chunk;
        struct hns_roce_hem_mhop mhop;
        struct hns_roce_hem *hem;
        unsigned long mhop_obj = obj;
@@ -734,7 +693,6 @@ void *hns_roce_table_find(struct hns_roce_dev *hr_dev,
        int offset, dma_offset;
        void *addr = NULL;
        u32 hem_idx = 0;
-       int length;
        int i, j;
 
        mutex_lock(&table->mutex);
@@ -767,23 +725,8 @@ void *hns_roce_table_find(struct hns_roce_dev *hr_dev,
        if (!hem)
                goto out;
 
-       list_for_each_entry(chunk, &hem->chunk_list, list) {
-               for (i = 0; i < chunk->npages; ++i) {
-                       length = sg_dma_len(&chunk->mem[i]);
-                       if (dma_handle && dma_offset >= 0) {
-                               if (length > (u32)dma_offset)
-                                       *dma_handle = sg_dma_address(
-                                               &chunk->mem[i]) + dma_offset;
-                               dma_offset -= length;
-                       }
-
-                       if (length > (u32)offset) {
-                               addr = chunk->buf[i] + offset;
-                               goto out;
-                       }
-                       offset -= length;
-               }
-       }
+       *dma_handle = hem->dma + dma_offset;
+       addr = hem->buf + offset;
 
 out:
        mutex_unlock(&table->mutex);
index 7d23d3c51da46b177f44a9c9f06ee9dcb5282116..6fb51db9682b8f2647172749bb3c28cfd544dbb8 100644 (file)
@@ -56,10 +56,6 @@ enum {
        HEM_TYPE_TRRL,
 };
 
-#define HNS_ROCE_HEM_CHUNK_LEN \
-        ((256 - sizeof(struct list_head) - 2 * sizeof(int)) /   \
-        (sizeof(struct scatterlist) + sizeof(void *)))
-
 #define check_whether_bt_num_3(type, hop_num) \
        (type < HEM_TYPE_MTT && hop_num == 2)
 
@@ -72,25 +68,13 @@ enum {
        (type >= HEM_TYPE_MTT && hop_num == 1) || \
        (type >= HEM_TYPE_MTT && hop_num == HNS_ROCE_HOP_NUM_0))
 
-struct hns_roce_hem_chunk {
-       struct list_head         list;
-       int                      npages;
-       int                      nsg;
-       struct scatterlist       mem[HNS_ROCE_HEM_CHUNK_LEN];
-       void                     *buf[HNS_ROCE_HEM_CHUNK_LEN];
-};
-
 struct hns_roce_hem {
-       struct list_head chunk_list;
+       void *buf;
+       dma_addr_t dma;
+       unsigned long size;
        refcount_t refcount;
 };
 
-struct hns_roce_hem_iter {
-       struct hns_roce_hem              *hem;
-       struct hns_roce_hem_chunk        *chunk;
-       int                              page_idx;
-};
-
 struct hns_roce_hem_mhop {
        u32     hop_num;
        u32     buf_chunk_size;
@@ -133,38 +117,4 @@ void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev,
                                 struct hns_roce_hem_list *hem_list,
                                 int offset, int *mtt_cnt);
 
-static inline void hns_roce_hem_first(struct hns_roce_hem *hem,
-                                     struct hns_roce_hem_iter *iter)
-{
-       iter->hem = hem;
-       iter->chunk = list_empty(&hem->chunk_list) ? NULL :
-                                list_entry(hem->chunk_list.next,
-                                           struct hns_roce_hem_chunk, list);
-       iter->page_idx = 0;
-}
-
-static inline int hns_roce_hem_last(struct hns_roce_hem_iter *iter)
-{
-       return !iter->chunk;
-}
-
-static inline void hns_roce_hem_next(struct hns_roce_hem_iter *iter)
-{
-       if (++iter->page_idx >= iter->chunk->nsg) {
-               if (iter->chunk->list.next == &iter->hem->chunk_list) {
-                       iter->chunk = NULL;
-                       return;
-               }
-
-               iter->chunk = list_entry(iter->chunk->list.next,
-                                        struct hns_roce_hem_chunk, list);
-               iter->page_idx = 0;
-       }
-}
-
-static inline dma_addr_t hns_roce_hem_addr(struct hns_roce_hem_iter *iter)
-{
-       return sg_dma_address(&iter->chunk->mem[iter->page_idx]);
-}
-
 #endif /* _HNS_ROCE_HEM_H */
index 8206daea6767df60731feac8ed9f7b52256ed7af..ba7ae792d279d462e0b79b27e4f3bf92432f572e 100644 (file)
@@ -2209,11 +2209,12 @@ static int hns_roce_query_caps(struct hns_roce_dev *hr_dev)
        caps->max_wqes = 1 << le16_to_cpu(resp_c->sq_depth);
 
        caps->num_srqs = 1 << hr_reg_read(resp_d, PF_CAPS_D_NUM_SRQS);
-       caps->cong_type = hr_reg_read(resp_d, PF_CAPS_D_CONG_TYPE);
+       caps->cong_cap = hr_reg_read(resp_d, PF_CAPS_D_CONG_CAP);
        caps->max_srq_wrs = 1 << le16_to_cpu(resp_d->srq_depth);
        caps->ceqe_depth = 1 << hr_reg_read(resp_d, PF_CAPS_D_CEQ_DEPTH);
        caps->num_comp_vectors = hr_reg_read(resp_d, PF_CAPS_D_NUM_CEQS);
        caps->aeqe_depth = 1 << hr_reg_read(resp_d, PF_CAPS_D_AEQ_DEPTH);
+       caps->default_cong_type = hr_reg_read(resp_d, PF_CAPS_D_DEFAULT_ALG);
        caps->reserved_pds = hr_reg_read(resp_d, PF_CAPS_D_RSV_PDS);
        caps->num_uars = 1 << hr_reg_read(resp_d, PF_CAPS_D_NUM_UARS);
        caps->reserved_qps = hr_reg_read(resp_d, PF_CAPS_D_RSV_QPS);
@@ -3195,21 +3196,22 @@ static int set_mtpt_pbl(struct hns_roce_dev *hr_dev,
        u64 pages[HNS_ROCE_V2_MAX_INNER_MTPT_NUM] = { 0 };
        struct ib_device *ibdev = &hr_dev->ib_dev;
        dma_addr_t pbl_ba;
-       int i, count;
+       int ret;
+       int i;
 
-       count = hns_roce_mtr_find(hr_dev, &mr->pbl_mtr, 0, pages,
-                                 min_t(int, ARRAY_SIZE(pages), mr->npages),
-                                 &pbl_ba);
-       if (count < 1) {
-               ibdev_err(ibdev, "failed to find PBL mtr, count = %d.\n",
-                         count);
-               return -ENOBUFS;
+       ret = hns_roce_mtr_find(hr_dev, &mr->pbl_mtr, 0, pages,
+                               min_t(int, ARRAY_SIZE(pages), mr->npages));
+       if (ret) {
+               ibdev_err(ibdev, "failed to find PBL mtr, ret = %d.\n", ret);
+               return ret;
        }
 
        /* Aligned to the hardware address access unit */
-       for (i = 0; i < count; i++)
+       for (i = 0; i < ARRAY_SIZE(pages); i++)
                pages[i] >>= 6;
 
+       pbl_ba = hns_roce_get_mtr_ba(&mr->pbl_mtr);
+
        mpt_entry->pbl_size = cpu_to_le32(mr->npages);
        mpt_entry->pbl_ba_l = cpu_to_le32(pbl_ba >> 3);
        hr_reg_write(mpt_entry, MPT_PBL_BA_H, upper_32_bits(pbl_ba >> 3));
@@ -3308,18 +3310,12 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,
 static int hns_roce_v2_frmr_write_mtpt(struct hns_roce_dev *hr_dev,
                                       void *mb_buf, struct hns_roce_mr *mr)
 {
-       struct ib_device *ibdev = &hr_dev->ib_dev;
+       dma_addr_t pbl_ba = hns_roce_get_mtr_ba(&mr->pbl_mtr);
        struct hns_roce_v2_mpt_entry *mpt_entry;
-       dma_addr_t pbl_ba = 0;
 
        mpt_entry = mb_buf;
        memset(mpt_entry, 0, sizeof(*mpt_entry));
 
-       if (hns_roce_mtr_find(hr_dev, &mr->pbl_mtr, 0, NULL, 0, &pbl_ba) < 0) {
-               ibdev_err(ibdev, "failed to find frmr mtr.\n");
-               return -ENOBUFS;
-       }
-
        hr_reg_write(mpt_entry, MPT_ST, V2_MPT_ST_FREE);
        hr_reg_write(mpt_entry, MPT_PD, mr->pd);
 
@@ -4063,7 +4059,6 @@ static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev,
                               struct hns_roce_hem_table *table, int obj,
                               u32 step_idx)
 {
-       struct hns_roce_hem_iter iter;
        struct hns_roce_hem_mhop mhop;
        struct hns_roce_hem *hem;
        unsigned long mhop_obj = obj;
@@ -4100,12 +4095,8 @@ static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev,
 
        if (check_whether_last_step(hop_num, step_idx)) {
                hem = table->hem[hem_idx];
-               for (hns_roce_hem_first(hem, &iter);
-                    !hns_roce_hem_last(&iter); hns_roce_hem_next(&iter)) {
-                       bt_ba = hns_roce_hem_addr(&iter);
-                       ret = set_hem_to_hw(hr_dev, obj, bt_ba, table->type,
-                                           step_idx);
-               }
+
+               ret = set_hem_to_hw(hr_dev, obj, hem->dma, table->type, step_idx);
        } else {
                if (step_idx == 0)
                        bt_ba = table->bt_l0_dma_addr[i];
@@ -4346,17 +4337,20 @@ static int config_qp_rq_buf(struct hns_roce_dev *hr_dev,
 {
        u64 mtts[MTT_MIN_COUNT] = { 0 };
        u64 wqe_sge_ba;
-       int count;
+       int ret;
 
        /* Search qp buf's mtts */
-       count = hns_roce_mtr_find(hr_dev, &hr_qp->mtr, hr_qp->rq.offset, mtts,
-                                 MTT_MIN_COUNT, &wqe_sge_ba);
-       if (hr_qp->rq.wqe_cnt && count < 1) {
+       ret = hns_roce_mtr_find(hr_dev, &hr_qp->mtr, hr_qp->rq.offset, mtts,
+                               MTT_MIN_COUNT);
+       if (hr_qp->rq.wqe_cnt && ret) {
                ibdev_err(&hr_dev->ib_dev,
-                         "failed to find RQ WQE, QPN = 0x%lx.\n", hr_qp->qpn);
-               return -EINVAL;
+                         "failed to find QP(0x%lx) RQ WQE buf, ret = %d.\n",
+                         hr_qp->qpn, ret);
+               return ret;
        }
 
+       wqe_sge_ba = hns_roce_get_mtr_ba(&hr_qp->mtr);
+
        context->wqe_sge_ba = cpu_to_le32(wqe_sge_ba >> 3);
        qpc_mask->wqe_sge_ba = 0;
 
@@ -4418,23 +4412,23 @@ static int config_qp_sq_buf(struct hns_roce_dev *hr_dev,
        struct ib_device *ibdev = &hr_dev->ib_dev;
        u64 sge_cur_blk = 0;
        u64 sq_cur_blk = 0;
-       int count;
+       int ret;
 
        /* search qp buf's mtts */
-       count = hns_roce_mtr_find(hr_dev, &hr_qp->mtr, 0, &sq_cur_blk, 1, NULL);
-       if (count < 1) {
-               ibdev_err(ibdev, "failed to find QP(0x%lx) SQ buf.\n",
-                         hr_qp->qpn);
-               return -EINVAL;
+       ret = hns_roce_mtr_find(hr_dev, &hr_qp->mtr, hr_qp->sq.offset,
+                               &sq_cur_blk, 1);
+       if (ret) {
+               ibdev_err(ibdev, "failed to find QP(0x%lx) SQ WQE buf, ret = %d.\n",
+                         hr_qp->qpn, ret);
+               return ret;
        }
        if (hr_qp->sge.sge_cnt > 0) {
-               count = hns_roce_mtr_find(hr_dev, &hr_qp->mtr,
-                                         hr_qp->sge.offset,
-                                         &sge_cur_blk, 1, NULL);
-               if (count < 1) {
-                       ibdev_err(ibdev, "failed to find QP(0x%lx) SGE buf.\n",
-                                 hr_qp->qpn);
-                       return -EINVAL;
+               ret = hns_roce_mtr_find(hr_dev, &hr_qp->mtr,
+                                       hr_qp->sge.offset, &sge_cur_blk, 1);
+               if (ret) {
+                       ibdev_err(ibdev, "failed to find QP(0x%lx) SGE buf, ret = %d.\n",
+                                 hr_qp->qpn, ret);
+                       return ret;
                }
        }
 
@@ -4744,13 +4738,10 @@ enum {
 static int check_cong_type(struct ib_qp *ibqp,
                           struct hns_roce_congestion_algorithm *cong_alg)
 {
-       struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
-
-       if (ibqp->qp_type == IB_QPT_UD)
-               hr_dev->caps.cong_type = CONG_TYPE_DCQCN;
+       struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
 
        /* different congestion types match different configurations */
-       switch (hr_dev->caps.cong_type) {
+       switch (hr_qp->cong_type) {
        case CONG_TYPE_DCQCN:
                cong_alg->alg_sel = CONG_DCQCN;
                cong_alg->alg_sub_sel = UNSUPPORT_CONG_LEVEL;
@@ -4776,10 +4767,7 @@ static int check_cong_type(struct ib_qp *ibqp,
                cong_alg->wnd_mode_sel = WND_LIMIT;
                break;
        default:
-               ibdev_warn(&hr_dev->ib_dev,
-                          "invalid type(%u) for congestion selection.\n",
-                          hr_dev->caps.cong_type);
-               hr_dev->caps.cong_type = CONG_TYPE_DCQCN;
+               hr_qp->cong_type = CONG_TYPE_DCQCN;
                cong_alg->alg_sel = CONG_DCQCN;
                cong_alg->alg_sub_sel = UNSUPPORT_CONG_LEVEL;
                cong_alg->dip_vld = DIP_INVALID;
@@ -4798,6 +4786,7 @@ static int fill_cong_field(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
        struct hns_roce_congestion_algorithm cong_field;
        struct ib_device *ibdev = ibqp->device;
        struct hns_roce_dev *hr_dev = to_hr_dev(ibdev);
+       struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
        u32 dip_idx = 0;
        int ret;
 
@@ -4810,7 +4799,7 @@ static int fill_cong_field(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
                return ret;
 
        hr_reg_write(context, QPC_CONG_ALGO_TMPL_ID, hr_dev->cong_algo_tmpl_id +
-                    hr_dev->caps.cong_type * HNS_ROCE_CONG_SIZE);
+                    hr_qp->cong_type * HNS_ROCE_CONG_SIZE);
        hr_reg_clear(qpc_mask, QPC_CONG_ALGO_TMPL_ID);
        hr_reg_write(&context->ext, QPCEX_CONG_ALG_SEL, cong_field.alg_sel);
        hr_reg_clear(&qpc_mask->ext, QPCEX_CONG_ALG_SEL);
@@ -5328,6 +5317,30 @@ out:
        return ret;
 }
 
+static int hns_roce_v2_query_sccc(struct hns_roce_dev *hr_dev, u32 qpn,
+                                 void *buffer)
+{
+       struct hns_roce_v2_scc_context *context;
+       struct hns_roce_cmd_mailbox *mailbox;
+       int ret;
+
+       mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
+       if (IS_ERR(mailbox))
+               return PTR_ERR(mailbox);
+
+       ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, HNS_ROCE_CMD_QUERY_SCCC,
+                               qpn);
+       if (ret)
+               goto out;
+
+       context = mailbox->buf;
+       memcpy(buffer, context, sizeof(*context));
+
+out:
+       hns_roce_free_cmd_mailbox(hr_dev, mailbox);
+       return ret;
+}
+
 static u8 get_qp_timeout_attr(struct hns_roce_dev *hr_dev,
                              struct hns_roce_v2_qp_context *context)
 {
@@ -5581,18 +5594,20 @@ static int hns_roce_v2_write_srqc_index_queue(struct hns_roce_srq *srq,
        struct ib_device *ibdev = srq->ibsrq.device;
        struct hns_roce_dev *hr_dev = to_hr_dev(ibdev);
        u64 mtts_idx[MTT_MIN_COUNT] = {};
-       dma_addr_t dma_handle_idx = 0;
+       dma_addr_t dma_handle_idx;
        int ret;
 
        /* Get physical address of idx que buf */
        ret = hns_roce_mtr_find(hr_dev, &idx_que->mtr, 0, mtts_idx,
-                               ARRAY_SIZE(mtts_idx), &dma_handle_idx);
-       if (ret < 1) {
+                               ARRAY_SIZE(mtts_idx));
+       if (ret) {
                ibdev_err(ibdev, "failed to find mtr for SRQ idx, ret = %d.\n",
                          ret);
-               return -ENOBUFS;
+               return ret;
        }
 
+       dma_handle_idx = hns_roce_get_mtr_ba(&idx_que->mtr);
+
        hr_reg_write(ctx, SRQC_IDX_HOP_NUM,
                     to_hr_hem_hopnum(hr_dev->caps.idx_hop_num, srq->wqe_cnt));
 
@@ -5624,20 +5639,22 @@ static int hns_roce_v2_write_srqc(struct hns_roce_srq *srq, void *mb_buf)
        struct hns_roce_dev *hr_dev = to_hr_dev(ibdev);
        struct hns_roce_srq_context *ctx = mb_buf;
        u64 mtts_wqe[MTT_MIN_COUNT] = {};
-       dma_addr_t dma_handle_wqe = 0;
+       dma_addr_t dma_handle_wqe;
        int ret;
 
        memset(ctx, 0, sizeof(*ctx));
 
        /* Get the physical address of srq buf */
        ret = hns_roce_mtr_find(hr_dev, &srq->buf_mtr, 0, mtts_wqe,
-                               ARRAY_SIZE(mtts_wqe), &dma_handle_wqe);
-       if (ret < 1) {
+                               ARRAY_SIZE(mtts_wqe));
+       if (ret) {
                ibdev_err(ibdev, "failed to find mtr for SRQ WQE, ret = %d.\n",
                          ret);
-               return -ENOBUFS;
+               return ret;
        }
 
+       dma_handle_wqe = hns_roce_get_mtr_ba(&srq->buf_mtr);
+
        hr_reg_write(ctx, SRQC_SRQ_ST, 1);
        hr_reg_write_bool(ctx, SRQC_SRQ_TYPE,
                          srq->ibsrq.srq_type == IB_SRQT_XRC);
@@ -6353,7 +6370,7 @@ static int config_eqc(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq,
        u64 eqe_ba[MTT_MIN_COUNT] = { 0 };
        struct hns_roce_eq_context *eqc;
        u64 bt_ba = 0;
-       int count;
+       int ret;
 
        eqc = mb_buf;
        memset(eqc, 0, sizeof(struct hns_roce_eq_context));
@@ -6361,13 +6378,15 @@ static int config_eqc(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq,
        init_eq_config(hr_dev, eq);
 
        /* if not multi-hop, eqe buffer only use one trunk */
-       count = hns_roce_mtr_find(hr_dev, &eq->mtr, 0, eqe_ba, MTT_MIN_COUNT,
-                                 &bt_ba);
-       if (count < 1) {
-               dev_err(hr_dev->dev, "failed to find EQE mtr\n");
-               return -ENOBUFS;
+       ret = hns_roce_mtr_find(hr_dev, &eq->mtr, 0, eqe_ba,
+                               ARRAY_SIZE(eqe_ba));
+       if (ret) {
+               dev_err(hr_dev->dev, "failed to find EQE mtr, ret = %d\n", ret);
+               return ret;
        }
 
+       bt_ba = hns_roce_get_mtr_ba(&eq->mtr);
+
        hr_reg_write(eqc, EQC_EQ_ST, HNS_ROCE_V2_EQ_STATE_VALID);
        hr_reg_write(eqc, EQC_EQE_HOP_NUM, eq->hop_num);
        hr_reg_write(eqc, EQC_OVER_IGNORE, eq->over_ignore);
@@ -6714,6 +6733,7 @@ static const struct hns_roce_hw hns_roce_hw_v2 = {
        .query_qpc = hns_roce_v2_query_qpc,
        .query_mpt = hns_roce_v2_query_mpt,
        .query_srqc = hns_roce_v2_query_srqc,
+       .query_sccc = hns_roce_v2_query_sccc,
        .query_hw_counter = hns_roce_hw_v2_query_counter,
        .hns_roce_dev_ops = &hns_roce_v2_dev_ops,
        .hns_roce_dev_srq_ops = &hns_roce_v2_dev_srq_ops,
index cd97cbee682a6a51a4290720881a7a3b89d26a42..df04bc8ede57b65db434586ad22926314c7df4b8 100644 (file)
@@ -646,6 +646,12 @@ struct hns_roce_v2_qp_context {
 #define QPCEX_SQ_RQ_NOT_FORBID_EN QPCEX_FIELD_LOC(23, 23)
 #define QPCEX_STASH QPCEX_FIELD_LOC(82, 82)
 
+#define SCC_CONTEXT_SIZE 16
+
+struct hns_roce_v2_scc_context {
+       __le32 data[SCC_CONTEXT_SIZE];
+};
+
 #define        V2_QP_RWE_S 1 /* rdma write enable */
 #define        V2_QP_RRE_S 2 /* rdma read enable */
 #define        V2_QP_ATE_S 3 /* rdma atomic enable */
@@ -1214,12 +1220,13 @@ struct hns_roce_query_pf_caps_d {
 #define PF_CAPS_D_RQWQE_HOP_NUM PF_CAPS_D_FIELD_LOC(21, 20)
 #define PF_CAPS_D_EX_SGE_HOP_NUM PF_CAPS_D_FIELD_LOC(23, 22)
 #define PF_CAPS_D_SQWQE_HOP_NUM PF_CAPS_D_FIELD_LOC(25, 24)
-#define PF_CAPS_D_CONG_TYPE PF_CAPS_D_FIELD_LOC(29, 26)
+#define PF_CAPS_D_CONG_CAP PF_CAPS_D_FIELD_LOC(29, 26)
 #define PF_CAPS_D_CEQ_DEPTH PF_CAPS_D_FIELD_LOC(85, 64)
 #define PF_CAPS_D_NUM_CEQS PF_CAPS_D_FIELD_LOC(95, 86)
 #define PF_CAPS_D_AEQ_DEPTH PF_CAPS_D_FIELD_LOC(117, 96)
 #define PF_CAPS_D_AEQ_ARM_ST PF_CAPS_D_FIELD_LOC(119, 118)
 #define PF_CAPS_D_CEQ_ARM_ST PF_CAPS_D_FIELD_LOC(121, 120)
+#define PF_CAPS_D_DEFAULT_ALG PF_CAPS_D_FIELD_LOC(127, 122)
 #define PF_CAPS_D_RSV_PDS PF_CAPS_D_FIELD_LOC(147, 128)
 #define PF_CAPS_D_NUM_UARS PF_CAPS_D_FIELD_LOC(155, 148)
 #define PF_CAPS_D_RSV_QPS PF_CAPS_D_FIELD_LOC(179, 160)
index b55fe6911f9f1a8230ace74475f2b0d2cd8937e6..1dc60c2b2b7ab841266a4e25da2af3a4ce8218b9 100644 (file)
@@ -394,6 +394,9 @@ static int hns_roce_alloc_ucontext(struct ib_ucontext *uctx,
                        resp.config |= HNS_ROCE_RSP_CQE_INLINE_FLAGS;
        }
 
+       if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
+               resp.congest_type = hr_dev->caps.cong_cap;
+
        ret = hns_roce_uar_alloc(hr_dev, &context->uar);
        if (ret)
                goto error_out;
index 91cd580480fe224c5a6e837ad9c0c5f9be511574..9e05b57a2d67d4bdf7d6c96c29f0cbcac4deb021 100644 (file)
@@ -32,6 +32,7 @@
  */
 
 #include <linux/vmalloc.h>
+#include <linux/count_zeros.h>
 #include <rdma/ib_umem.h>
 #include <linux/math.h>
 #include "hns_roce_device.h"
@@ -103,14 +104,21 @@ static int alloc_mr_pbl(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr,
        buf_attr.user_access = mr->access;
        /* fast MR's buffer is alloced before mapping, not at creation */
        buf_attr.mtt_only = is_fast;
+       buf_attr.iova = mr->iova;
+       /* pagesize and hopnum is fixed for fast MR */
+       buf_attr.adaptive = !is_fast;
+       buf_attr.type = MTR_PBL;
 
        err = hns_roce_mtr_create(hr_dev, &mr->pbl_mtr, &buf_attr,
                                  hr_dev->caps.pbl_ba_pg_sz + PAGE_SHIFT,
                                  udata, start);
-       if (err)
+       if (err) {
                ibdev_err(ibdev, "failed to alloc pbl mtr, ret = %d.\n", err);
-       else
-               mr->npages = mr->pbl_mtr.hem_cfg.buf_pg_count;
+               return err;
+       }
+
+       mr->npages = mr->pbl_mtr.hem_cfg.buf_pg_count;
+       mr->pbl_hop_num = buf_attr.region[0].hopnum;
 
        return err;
 }
@@ -695,7 +703,7 @@ static int mtr_alloc_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
                mtr->umem = NULL;
                mtr->kmem = hns_roce_buf_alloc(hr_dev, total_size,
                                               buf_attr->page_shift,
-                                              mtr->hem_cfg.is_direct ?
+                                              !mtr_has_mtt(buf_attr) ?
                                               HNS_ROCE_BUF_DIRECT : 0);
                if (IS_ERR(mtr->kmem)) {
                        ibdev_err(ibdev, "failed to alloc kmem, ret = %ld.\n",
@@ -707,14 +715,41 @@ static int mtr_alloc_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
        return 0;
 }
 
-static int mtr_map_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
-                       int page_count, unsigned int page_shift)
+static int cal_mtr_pg_cnt(struct hns_roce_mtr *mtr)
+{
+       struct hns_roce_buf_region *region;
+       int page_cnt = 0;
+       int i;
+
+       for (i = 0; i < mtr->hem_cfg.region_count; i++) {
+               region = &mtr->hem_cfg.region[i];
+               page_cnt += region->count;
+       }
+
+       return page_cnt;
+}
+
+static bool need_split_huge_page(struct hns_roce_mtr *mtr)
+{
+       /* When HEM buffer uses 0-level addressing, the page size is
+        * equal to the whole buffer size. If the current MTR has multiple
+        * regions, we split the buffer into small pages(4k, required by hns
+        * ROCEE). These pages will be used in multiple regions.
+        */
+       return mtr->hem_cfg.is_direct && mtr->hem_cfg.region_count > 1;
+}
+
+static int mtr_map_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr)
 {
        struct ib_device *ibdev = &hr_dev->ib_dev;
+       int page_count = cal_mtr_pg_cnt(mtr);
+       unsigned int page_shift;
        dma_addr_t *pages;
        int npage;
        int ret;
 
+       page_shift = need_split_huge_page(mtr) ? HNS_HW_PAGE_SHIFT :
+                                                mtr->hem_cfg.buf_pg_shift;
        /* alloc a tmp array to store buffer's dma address */
        pages = kvcalloc(page_count, sizeof(dma_addr_t), GFP_KERNEL);
        if (!pages)
@@ -734,7 +769,7 @@ static int mtr_map_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
                goto err_alloc_list;
        }
 
-       if (mtr->hem_cfg.is_direct && npage > 1) {
+       if (need_split_huge_page(mtr) && npage > 1) {
                ret = mtr_check_direct_pages(pages, npage, page_shift);
                if (ret) {
                        ibdev_err(ibdev, "failed to check %s page: %d / %d.\n",
@@ -809,47 +844,53 @@ int hns_roce_mtr_map(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
        return ret;
 }
 
-int hns_roce_mtr_find(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
-                     u32 offset, u64 *mtt_buf, int mtt_max, u64 *base_addr)
+static int hns_roce_get_direct_addr_mtt(struct hns_roce_hem_cfg *cfg,
+                                       u32 start_index, u64 *mtt_buf,
+                                       int mtt_cnt)
 {
-       struct hns_roce_hem_cfg *cfg = &mtr->hem_cfg;
-       int mtt_count, left;
-       u32 start_index;
+       int mtt_count;
        int total = 0;
-       __le64 *mtts;
        u32 npage;
        u64 addr;
 
-       if (!mtt_buf || mtt_max < 1)
-               goto done;
-
-       /* no mtt memory in direct mode, so just return the buffer address */
-       if (cfg->is_direct) {
-               start_index = offset >> HNS_HW_PAGE_SHIFT;
-               for (mtt_count = 0; mtt_count < cfg->region_count &&
-                    total < mtt_max; mtt_count++) {
-                       npage = cfg->region[mtt_count].offset;
-                       if (npage < start_index)
-                               continue;
+       if (mtt_cnt > cfg->region_count)
+               return -EINVAL;
 
-                       addr = cfg->root_ba + (npage << HNS_HW_PAGE_SHIFT);
-                       mtt_buf[total] = addr;
+       for (mtt_count = 0; mtt_count < cfg->region_count && total < mtt_cnt;
+            mtt_count++) {
+               npage = cfg->region[mtt_count].offset;
+               if (npage < start_index)
+                       continue;
 
-                       total++;
-               }
+               addr = cfg->root_ba + (npage << HNS_HW_PAGE_SHIFT);
+               mtt_buf[total] = addr;
 
-               goto done;
+               total++;
        }
 
-       start_index = offset >> cfg->buf_pg_shift;
-       left = mtt_max;
+       if (!total)
+               return -ENOENT;
+
+       return 0;
+}
+
+static int hns_roce_get_mhop_mtt(struct hns_roce_dev *hr_dev,
+                                struct hns_roce_mtr *mtr, u32 start_index,
+                                u64 *mtt_buf, int mtt_cnt)
+{
+       int left = mtt_cnt;
+       int total = 0;
+       int mtt_count;
+       __le64 *mtts;
+       u32 npage;
+
        while (left > 0) {
                mtt_count = 0;
                mtts = hns_roce_hem_list_find_mtt(hr_dev, &mtr->hem_list,
                                                  start_index + total,
                                                  &mtt_count);
                if (!mtts || !mtt_count)
-                       goto done;
+                       break;
 
                npage = min(mtt_count, left);
                left -= npage;
@@ -857,69 +898,165 @@ int hns_roce_mtr_find(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
                        mtt_buf[total++] = le64_to_cpu(mtts[mtt_count]);
        }
 
-done:
-       if (base_addr)
-               *base_addr = cfg->root_ba;
+       if (!total)
+               return -ENOENT;
+
+       return 0;
+}
+
+int hns_roce_mtr_find(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
+                     u32 offset, u64 *mtt_buf, int mtt_max)
+{
+       struct hns_roce_hem_cfg *cfg = &mtr->hem_cfg;
+       u32 start_index;
+       int ret;
+
+       if (!mtt_buf || mtt_max < 1)
+               return -EINVAL;
+
+       /* no mtt memory in direct mode, so just return the buffer address */
+       if (cfg->is_direct) {
+               start_index = offset >> HNS_HW_PAGE_SHIFT;
+               ret = hns_roce_get_direct_addr_mtt(cfg, start_index,
+                                                  mtt_buf, mtt_max);
+       } else {
+               start_index = offset >> cfg->buf_pg_shift;
+               ret = hns_roce_get_mhop_mtt(hr_dev, mtr, start_index,
+                                           mtt_buf, mtt_max);
+       }
+       return ret;
+}
+
+static int get_best_page_shift(struct hns_roce_dev *hr_dev,
+                              struct hns_roce_mtr *mtr,
+                              struct hns_roce_buf_attr *buf_attr)
+{
+       unsigned int page_sz;
+
+       if (!buf_attr->adaptive || buf_attr->type != MTR_PBL || !mtr->umem)
+               return 0;
+
+       page_sz = ib_umem_find_best_pgsz(mtr->umem,
+                                        hr_dev->caps.page_size_cap,
+                                        buf_attr->iova);
+       if (!page_sz)
+               return -EINVAL;
+
+       buf_attr->page_shift = order_base_2(page_sz);
+       return 0;
+}
+
+static int get_best_hop_num(struct hns_roce_dev *hr_dev,
+                           struct hns_roce_mtr *mtr,
+                           struct hns_roce_buf_attr *buf_attr,
+                           unsigned int ba_pg_shift)
+{
+#define INVALID_HOPNUM -1
+#define MIN_BA_CNT 1
+       size_t buf_pg_sz = 1 << buf_attr->page_shift;
+       struct ib_device *ibdev = &hr_dev->ib_dev;
+       size_t ba_pg_sz = 1 << ba_pg_shift;
+       int hop_num = INVALID_HOPNUM;
+       size_t unit = MIN_BA_CNT;
+       size_t ba_cnt;
+       int j;
+
+       if (!buf_attr->adaptive || buf_attr->type != MTR_PBL)
+               return 0;
+
+       /* Caculating the number of buf pages, each buf page need a BA */
+       if (mtr->umem)
+               ba_cnt = ib_umem_num_dma_blocks(mtr->umem, buf_pg_sz);
+       else
+               ba_cnt = DIV_ROUND_UP(buf_attr->region[0].size, buf_pg_sz);
+
+       for (j = 0; j <= HNS_ROCE_MAX_HOP_NUM; j++) {
+               if (ba_cnt <= unit) {
+                       hop_num = j;
+                       break;
+               }
+               /* Number of BAs can be represented at per hop */
+               unit *= ba_pg_sz / BA_BYTE_LEN;
+       }
+
+       if (hop_num < 0) {
+               ibdev_err(ibdev,
+                         "failed to calculate a valid hopnum.\n");
+               return -EINVAL;
+       }
 
-       return total;
+       buf_attr->region[0].hopnum = hop_num;
+
+       return 0;
+}
+
+static bool is_buf_attr_valid(struct hns_roce_dev *hr_dev,
+                             struct hns_roce_buf_attr *attr)
+{
+       struct ib_device *ibdev = &hr_dev->ib_dev;
+
+       if (attr->region_count > ARRAY_SIZE(attr->region) ||
+           attr->region_count < 1 || attr->page_shift < HNS_HW_PAGE_SHIFT) {
+               ibdev_err(ibdev,
+                         "invalid buf attr, region count %d, page shift %u.\n",
+                         attr->region_count, attr->page_shift);
+               return false;
+       }
+
+       return true;
 }
 
 static int mtr_init_buf_cfg(struct hns_roce_dev *hr_dev,
-                           struct hns_roce_buf_attr *attr,
-                           struct hns_roce_hem_cfg *cfg,
-                           unsigned int *buf_page_shift, u64 unalinged_size)
+                           struct hns_roce_mtr *mtr,
+                           struct hns_roce_buf_attr *attr)
 {
+       struct hns_roce_hem_cfg *cfg = &mtr->hem_cfg;
        struct hns_roce_buf_region *r;
-       u64 first_region_padding;
-       int page_cnt, region_cnt;
-       unsigned int page_shift;
+       size_t buf_pg_sz;
        size_t buf_size;
+       int page_cnt, i;
+       u64 pgoff = 0;
+
+       if (!is_buf_attr_valid(hr_dev, attr))
+               return -EINVAL;
 
        /* If mtt is disabled, all pages must be within a continuous range */
        cfg->is_direct = !mtr_has_mtt(attr);
+       cfg->region_count = attr->region_count;
        buf_size = mtr_bufs_size(attr);
-       if (cfg->is_direct) {
-               /* When HEM buffer uses 0-level addressing, the page size is
-                * equal to the whole buffer size, and we split the buffer into
-                * small pages which is used to check whether the adjacent
-                * units are in the continuous space and its size is fixed to
-                * 4K based on hns ROCEE's requirement.
-                */
-               page_shift = HNS_HW_PAGE_SHIFT;
-
-               /* The ROCEE requires the page size to be 4K * 2 ^ N. */
+       if (need_split_huge_page(mtr)) {
+               buf_pg_sz = HNS_HW_PAGE_SIZE;
                cfg->buf_pg_count = 1;
+               /* The ROCEE requires the page size to be 4K * 2 ^ N. */
                cfg->buf_pg_shift = HNS_HW_PAGE_SHIFT +
                        order_base_2(DIV_ROUND_UP(buf_size, HNS_HW_PAGE_SIZE));
-               first_region_padding = 0;
        } else {
-               page_shift = attr->page_shift;
-               cfg->buf_pg_count = DIV_ROUND_UP(buf_size + unalinged_size,
-                                                1 << page_shift);
-               cfg->buf_pg_shift = page_shift;
-               first_region_padding = unalinged_size;
+               buf_pg_sz = 1 << attr->page_shift;
+               cfg->buf_pg_count = mtr->umem ?
+                       ib_umem_num_dma_blocks(mtr->umem, buf_pg_sz) :
+                       DIV_ROUND_UP(buf_size, buf_pg_sz);
+               cfg->buf_pg_shift = attr->page_shift;
+               pgoff = mtr->umem ? mtr->umem->address & ~PAGE_MASK : 0;
        }
 
        /* Convert buffer size to page index and page count for each region and
         * the buffer's offset needs to be appended to the first region.
         */
-       for (page_cnt = 0, region_cnt = 0; region_cnt < attr->region_count &&
-            region_cnt < ARRAY_SIZE(cfg->region); region_cnt++) {
-               r = &cfg->region[region_cnt];
+       for (page_cnt = 0, i = 0; i < attr->region_count; i++) {
+               r = &cfg->region[i];
                r->offset = page_cnt;
-               buf_size = hr_hw_page_align(attr->region[region_cnt].size +
-                                           first_region_padding);
-               r->count = DIV_ROUND_UP(buf_size, 1 << page_shift);
-               first_region_padding = 0;
+               buf_size = hr_hw_page_align(attr->region[i].size + pgoff);
+               if (attr->type == MTR_PBL && mtr->umem)
+                       r->count = ib_umem_num_dma_blocks(mtr->umem, buf_pg_sz);
+               else
+                       r->count = DIV_ROUND_UP(buf_size, buf_pg_sz);
+
+               pgoff = 0;
                page_cnt += r->count;
-               r->hopnum = to_hr_hem_hopnum(attr->region[region_cnt].hopnum,
-                                            r->count);
+               r->hopnum = to_hr_hem_hopnum(attr->region[i].hopnum, r->count);
        }
 
-       cfg->region_count = region_cnt;
-       *buf_page_shift = page_shift;
-
-       return page_cnt;
+       return 0;
 }
 
 static u64 cal_pages_per_l1ba(unsigned int ba_per_bt, unsigned int hopnum)
@@ -1007,50 +1144,58 @@ int hns_roce_mtr_create(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
                        unsigned long user_addr)
 {
        struct ib_device *ibdev = &hr_dev->ib_dev;
-       unsigned int buf_page_shift = 0;
-       int buf_page_cnt;
        int ret;
 
-       buf_page_cnt = mtr_init_buf_cfg(hr_dev, buf_attr, &mtr->hem_cfg,
-                                       &buf_page_shift,
-                                       udata ? user_addr & ~PAGE_MASK : 0);
-       if (buf_page_cnt < 1 || buf_page_shift < HNS_HW_PAGE_SHIFT) {
-               ibdev_err(ibdev, "failed to init mtr cfg, count %d shift %u.\n",
-                         buf_page_cnt, buf_page_shift);
-               return -EINVAL;
-       }
-
-       ret = mtr_alloc_mtt(hr_dev, mtr, ba_page_shift);
-       if (ret) {
-               ibdev_err(ibdev, "failed to alloc mtr mtt, ret = %d.\n", ret);
-               return ret;
-       }
-
        /* The caller has its own buffer list and invokes the hns_roce_mtr_map()
         * to finish the MTT configuration.
         */
        if (buf_attr->mtt_only) {
                mtr->umem = NULL;
                mtr->kmem = NULL;
-               return 0;
+       } else {
+               ret = mtr_alloc_bufs(hr_dev, mtr, buf_attr, udata, user_addr);
+               if (ret) {
+                       ibdev_err(ibdev,
+                                 "failed to alloc mtr bufs, ret = %d.\n", ret);
+                       return ret;
+               }
+
+               ret = get_best_page_shift(hr_dev, mtr, buf_attr);
+               if (ret)
+                       goto err_init_buf;
+
+               ret = get_best_hop_num(hr_dev, mtr, buf_attr, ba_page_shift);
+               if (ret)
+                       goto err_init_buf;
        }
 
-       ret = mtr_alloc_bufs(hr_dev, mtr, buf_attr, udata, user_addr);
+       ret = mtr_init_buf_cfg(hr_dev, mtr, buf_attr);
+       if (ret)
+               goto err_init_buf;
+
+       ret = mtr_alloc_mtt(hr_dev, mtr, ba_page_shift);
        if (ret) {
-               ibdev_err(ibdev, "failed to alloc mtr bufs, ret = %d.\n", ret);
-               goto err_alloc_mtt;
+               ibdev_err(ibdev, "failed to alloc mtr mtt, ret = %d.\n", ret);
+               goto err_init_buf;
        }
 
+       if (buf_attr->mtt_only)
+               return 0;
+
        /* Write buffer's dma address to MTT */
-       ret = mtr_map_bufs(hr_dev, mtr, buf_page_cnt, buf_page_shift);
-       if (ret)
+       ret = mtr_map_bufs(hr_dev, mtr);
+       if (ret) {
                ibdev_err(ibdev, "failed to map mtr bufs, ret = %d.\n", ret);
-       else
-               return 0;
+               goto err_alloc_mtt;
+       }
+
+       return 0;
 
-       mtr_free_bufs(hr_dev, mtr);
 err_alloc_mtt:
        mtr_free_mtt(hr_dev, mtr);
+err_init_buf:
+       mtr_free_bufs(hr_dev, mtr);
+
        return ret;
 }
 
index 31b147210688ab6600d68124d063d78356b73fd0..f35a66325d9a6596b3425bac9676644fac675d4f 100644 (file)
@@ -1004,6 +1004,60 @@ static void free_kernel_wrid(struct hns_roce_qp *hr_qp)
        kfree(hr_qp->sq.wrid);
 }
 
+static void default_congest_type(struct hns_roce_dev *hr_dev,
+                                struct hns_roce_qp *hr_qp)
+{
+       if (hr_qp->ibqp.qp_type == IB_QPT_UD ||
+           hr_qp->ibqp.qp_type == IB_QPT_GSI)
+               hr_qp->cong_type = CONG_TYPE_DCQCN;
+       else
+               hr_qp->cong_type = hr_dev->caps.default_cong_type;
+}
+
+static int set_congest_type(struct hns_roce_qp *hr_qp,
+                           struct hns_roce_ib_create_qp *ucmd)
+{
+       struct hns_roce_dev *hr_dev = to_hr_dev(hr_qp->ibqp.device);
+
+       switch (ucmd->cong_type_flags) {
+       case HNS_ROCE_CREATE_QP_FLAGS_DCQCN:
+               hr_qp->cong_type = CONG_TYPE_DCQCN;
+               break;
+       case HNS_ROCE_CREATE_QP_FLAGS_LDCP:
+               hr_qp->cong_type = CONG_TYPE_LDCP;
+               break;
+       case HNS_ROCE_CREATE_QP_FLAGS_HC3:
+               hr_qp->cong_type = CONG_TYPE_HC3;
+               break;
+       case HNS_ROCE_CREATE_QP_FLAGS_DIP:
+               hr_qp->cong_type = CONG_TYPE_DIP;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (!test_bit(hr_qp->cong_type, (unsigned long *)&hr_dev->caps.cong_cap))
+               return -EOPNOTSUPP;
+
+       if (hr_qp->ibqp.qp_type == IB_QPT_UD &&
+           hr_qp->cong_type != CONG_TYPE_DCQCN)
+               return -EOPNOTSUPP;
+
+       return 0;
+}
+
+static int set_congest_param(struct hns_roce_dev *hr_dev,
+                            struct hns_roce_qp *hr_qp,
+                            struct hns_roce_ib_create_qp *ucmd)
+{
+       if (ucmd->comp_mask & HNS_ROCE_CREATE_QP_MASK_CONGEST_TYPE)
+               return set_congest_type(hr_qp, ucmd);
+
+       default_congest_type(hr_dev, hr_qp);
+
+       return 0;
+}
+
 static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
                        struct ib_qp_init_attr *init_attr,
                        struct ib_udata *udata,
@@ -1043,6 +1097,10 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
                        ibdev_err(ibdev,
                                  "failed to set user SQ size, ret = %d.\n",
                                  ret);
+
+               ret = set_congest_param(hr_dev, hr_qp, ucmd);
+               if (ret)
+                       return ret;
        } else {
                if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
                        hr_qp->config = HNS_ROCE_EXSGE_FLAGS;
@@ -1051,6 +1109,8 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
                        ibdev_err(ibdev,
                                  "failed to set kernel SQ size, ret = %d.\n",
                                  ret);
+
+               default_congest_type(hr_dev, hr_qp);
        }
 
        return ret;
index f7f3c4cc7426d642de01b0f783607a24b44fc37e..356d988169497385fe433ea113bb7c87344f8777 100644 (file)
@@ -97,16 +97,33 @@ int hns_roce_fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ib_qp)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ib_qp->device);
        struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp);
-       struct hns_roce_v2_qp_context context;
+       struct hns_roce_full_qp_ctx {
+               struct hns_roce_v2_qp_context qpc;
+               struct hns_roce_v2_scc_context sccc;
+       } context = {};
        int ret;
 
        if (!hr_dev->hw->query_qpc)
                return -EINVAL;
 
-       ret = hr_dev->hw->query_qpc(hr_dev, hr_qp->qpn, &context);
+       ret = hr_dev->hw->query_qpc(hr_dev, hr_qp->qpn, &context.qpc);
        if (ret)
-               return -EINVAL;
+               return ret;
+
+       /* If SCC is disabled or the query fails, the queried SCCC will
+        * be all 0.
+        */
+       if (!(hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL) ||
+           !hr_dev->hw->query_sccc)
+               goto out;
+
+       ret = hr_dev->hw->query_sccc(hr_dev, hr_qp->qpn, &context.sccc);
+       if (ret)
+               ibdev_warn_ratelimited(&hr_dev->ib_dev,
+                                      "failed to query SCCC, ret = %d.\n",
+                                      ret);
 
+out:
        ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context);
 
        return ret;
index 0b046c061742be140251785f60ac25cff73aa2ba..12704efb7b19a8e7bd5422638617a6cd7f8436eb 100644 (file)
@@ -719,7 +719,6 @@ static int irdma_setup_kmode_qp(struct irdma_device *iwdev,
                info->rq_pa + (ukinfo->rq_depth * IRDMA_QP_WQE_MIN_SIZE);
        ukinfo->sq_size = ukinfo->sq_depth >> ukinfo->sq_shift;
        ukinfo->rq_size = ukinfo->rq_depth >> ukinfo->rq_shift;
-       ukinfo->qp_id = iwqp->ibqp.qp_num;
 
        iwqp->max_send_wr = (ukinfo->sq_depth - IRDMA_SQ_RSVD) >> ukinfo->sq_shift;
        iwqp->max_recv_wr = (ukinfo->rq_depth - IRDMA_RQ_RSVD) >> ukinfo->rq_shift;
@@ -944,7 +943,7 @@ static int irdma_create_qp(struct ib_qp *ibqp,
        iwqp->host_ctx.size = IRDMA_QP_CTX_SIZE;
 
        init_info.pd = &iwpd->sc_pd;
-       init_info.qp_uk_init_info.qp_id = iwqp->ibqp.qp_num;
+       init_info.qp_uk_init_info.qp_id = qp_num;
        if (!rdma_protocol_roce(&iwdev->ibdev, 1))
                init_info.qp_uk_init_info.first_sq_wq = 1;
        iwqp->ctx_info.qp_compl_ctx = (uintptr_t)qp;
index 83ebd070535aba1d49f3cb217672ce18be4304ec..4a71e678d09c19c50d6f7d1d5105dec8a8cc38f7 100644 (file)
@@ -16,7 +16,7 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
        int err;
 
        mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
-       gc = mdev->gdma_dev->gdma_context;
+       gc = mdev_to_gc(mdev);
 
        if (udata->inlen < sizeof(ucmd))
                return -EINVAL;
@@ -48,7 +48,7 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
                return err;
        }
 
-       err = mana_ib_gd_create_dma_region(mdev, cq->umem, &cq->gdma_region);
+       err = mana_ib_create_zero_offset_dma_region(mdev, cq->umem, &cq->gdma_region);
        if (err) {
                ibdev_dbg(ibdev,
                          "Failed to create dma region for create cq, %d\n",
@@ -57,7 +57,7 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
        }
 
        ibdev_dbg(ibdev,
-                 "mana_ib_gd_create_dma_region ret %d gdma_region 0x%llx\n",
+                 "create_dma_region ret %d gdma_region 0x%llx\n",
                  err, cq->gdma_region);
 
        /*
@@ -81,7 +81,7 @@ int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
        int err;
 
        mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
-       gc = mdev->gdma_dev->gdma_context;
+       gc = mdev_to_gc(mdev);
 
        err = mana_ib_gd_destroy_dma_region(mdev, cq->gdma_region);
        if (err) {
@@ -100,10 +100,29 @@ int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
        return 0;
 }
 
-void mana_ib_cq_handler(void *ctx, struct gdma_queue *gdma_cq)
+static void mana_ib_cq_handler(void *ctx, struct gdma_queue *gdma_cq)
 {
        struct mana_ib_cq *cq = ctx;
 
        if (cq->ibcq.comp_handler)
                cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);
 }
+
+int mana_ib_install_cq_cb(struct mana_ib_dev *mdev, struct mana_ib_cq *cq)
+{
+       struct gdma_context *gc = mdev_to_gc(mdev);
+       struct gdma_queue *gdma_cq;
+
+       /* Create CQ table entry */
+       WARN_ON(gc->cq_table[cq->id]);
+       gdma_cq = kzalloc(sizeof(*gdma_cq), GFP_KERNEL);
+       if (!gdma_cq)
+               return -ENOMEM;
+
+       gdma_cq->cq.context = cq;
+       gdma_cq->type = GDMA_CQ;
+       gdma_cq->cq.callback = mana_ib_cq_handler;
+       gdma_cq->id = cq->id;
+       gc->cq_table[cq->id] = gdma_cq;
+       return 0;
+}
index faca092456fa3d692879979b40c75714ef2602fe..71e33feee61bb124ccabf510dda65eb0fb39fda9 100644 (file)
@@ -8,13 +8,10 @@
 void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd,
                         u32 port)
 {
-       struct gdma_dev *gd = &dev->gdma_dev->gdma_context->mana;
        struct mana_port_context *mpc;
        struct net_device *ndev;
-       struct mana_context *mc;
 
-       mc = gd->driver_data;
-       ndev = mc->ports[port];
+       ndev = mana_ib_get_netdev(&dev->ib_dev, port);
        mpc = netdev_priv(ndev);
 
        mutex_lock(&pd->vport_mutex);
@@ -31,14 +28,11 @@ void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd,
 int mana_ib_cfg_vport(struct mana_ib_dev *dev, u32 port, struct mana_ib_pd *pd,
                      u32 doorbell_id)
 {
-       struct gdma_dev *mdev = &dev->gdma_dev->gdma_context->mana;
        struct mana_port_context *mpc;
-       struct mana_context *mc;
        struct net_device *ndev;
        int err;
 
-       mc = mdev->driver_data;
-       ndev = mc->ports[port];
+       ndev = mana_ib_get_netdev(&dev->ib_dev, port);
        mpc = netdev_priv(ndev);
 
        mutex_lock(&pd->vport_mutex);
@@ -79,17 +73,17 @@ int mana_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
        struct gdma_create_pd_req req = {};
        enum gdma_pd_flags flags = 0;
        struct mana_ib_dev *dev;
-       struct gdma_dev *mdev;
+       struct gdma_context *gc;
        int err;
 
        dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
-       mdev = dev->gdma_dev;
+       gc = mdev_to_gc(dev);
 
        mana_gd_init_req_hdr(&req.hdr, GDMA_CREATE_PD, sizeof(req),
                             sizeof(resp));
 
        req.flags = flags;
-       err = mana_gd_send_request(mdev->gdma_context, sizeof(req), &req,
+       err = mana_gd_send_request(gc, sizeof(req), &req,
                                   sizeof(resp), &resp);
 
        if (err || resp.hdr.status) {
@@ -119,17 +113,17 @@ int mana_ib_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
        struct gdma_destory_pd_resp resp = {};
        struct gdma_destroy_pd_req req = {};
        struct mana_ib_dev *dev;
-       struct gdma_dev *mdev;
+       struct gdma_context *gc;
        int err;
 
        dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
-       mdev = dev->gdma_dev;
+       gc = mdev_to_gc(dev);
 
        mana_gd_init_req_hdr(&req.hdr, GDMA_DESTROY_PD, sizeof(req),
                             sizeof(resp));
 
        req.pd_handle = pd->pd_handle;
-       err = mana_gd_send_request(mdev->gdma_context, sizeof(req), &req,
+       err = mana_gd_send_request(gc, sizeof(req), &req,
                                   sizeof(resp), &resp);
 
        if (err || resp.hdr.status) {
@@ -206,13 +200,11 @@ int mana_ib_alloc_ucontext(struct ib_ucontext *ibcontext,
        struct ib_device *ibdev = ibcontext->device;
        struct mana_ib_dev *mdev;
        struct gdma_context *gc;
-       struct gdma_dev *dev;
        int doorbell_page;
        int ret;
 
        mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
-       dev = mdev->gdma_dev;
-       gc = dev->gdma_context;
+       gc = mdev_to_gc(mdev);
 
        /* Allocate a doorbell page index */
        ret = mana_gd_allocate_doorbell_page(gc, &doorbell_page);
@@ -238,7 +230,7 @@ void mana_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
        int ret;
 
        mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
-       gc = mdev->gdma_dev->gdma_context;
+       gc = mdev_to_gc(mdev);
 
        ret = mana_gd_destroy_doorbell_page(gc, mana_ucontext->doorbell);
        if (ret)
@@ -309,8 +301,8 @@ mana_ib_gd_add_dma_region(struct mana_ib_dev *dev, struct gdma_context *gc,
        return 0;
 }
 
-int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
-                                mana_handle_t *gdma_region)
+static int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
+                                       mana_handle_t *gdma_region, unsigned long page_sz)
 {
        struct gdma_dma_region_add_pages_req *add_req = NULL;
        size_t num_pages_processed = 0, num_pages_to_handle;
@@ -322,23 +314,14 @@ int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
        size_t max_pgs_create_cmd;
        struct gdma_context *gc;
        size_t num_pages_total;
-       struct gdma_dev *mdev;
-       unsigned long page_sz;
        unsigned int tail = 0;
        u64 *page_addr_list;
        void *request_buf;
        int err;
 
-       mdev = dev->gdma_dev;
-       gc = mdev->gdma_context;
+       gc = mdev_to_gc(dev);
        hwc = gc->hwc.driver_data;
 
-       /* Hardware requires dma region to align to chosen page size */
-       page_sz = ib_umem_find_best_pgsz(umem, PAGE_SZ_BM, 0);
-       if (!page_sz) {
-               ibdev_dbg(&dev->ib_dev, "failed to find page size.\n");
-               return -ENOMEM;
-       }
        num_pages_total = ib_umem_num_dma_blocks(umem, page_sz);
 
        max_pgs_create_cmd =
@@ -358,7 +341,7 @@ int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
                             sizeof(struct gdma_create_dma_region_resp));
 
        create_req->length = umem->length;
-       create_req->offset_in_page = umem->address & (page_sz - 1);
+       create_req->offset_in_page = ib_umem_dma_offset(umem, page_sz);
        create_req->gdma_page_type = order_base_2(page_sz) - PAGE_SHIFT;
        create_req->page_count = num_pages_total;
 
@@ -424,12 +407,39 @@ out:
        return err;
 }
 
+int mana_ib_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
+                             mana_handle_t *gdma_region, u64 virt)
+{
+       unsigned long page_sz;
+
+       page_sz = ib_umem_find_best_pgsz(umem, PAGE_SZ_BM, virt);
+       if (!page_sz) {
+               ibdev_dbg(&dev->ib_dev, "Failed to find page size.\n");
+               return -EINVAL;
+       }
+
+       return mana_ib_gd_create_dma_region(dev, umem, gdma_region, page_sz);
+}
+
+int mana_ib_create_zero_offset_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
+                                         mana_handle_t *gdma_region)
+{
+       unsigned long page_sz;
+
+       /* Hardware requires dma region to align to chosen page size */
+       page_sz = ib_umem_find_best_pgoff(umem, PAGE_SZ_BM, 0);
+       if (!page_sz) {
+               ibdev_dbg(&dev->ib_dev, "Failed to find page size.\n");
+               return -EINVAL;
+       }
+
+       return mana_ib_gd_create_dma_region(dev, umem, gdma_region, page_sz);
+}
+
 int mana_ib_gd_destroy_dma_region(struct mana_ib_dev *dev, u64 gdma_region)
 {
-       struct gdma_dev *mdev = dev->gdma_dev;
-       struct gdma_context *gc;
+       struct gdma_context *gc = mdev_to_gc(dev);
 
-       gc = mdev->gdma_context;
        ibdev_dbg(&dev->ib_dev, "destroy dma region 0x%llx\n", gdma_region);
 
        return mana_gd_destroy_dma_region(gc, gdma_region);
@@ -447,7 +457,7 @@ int mana_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vma)
        int ret;
 
        mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
-       gc = mdev->gdma_dev->gdma_context;
+       gc = mdev_to_gc(mdev);
 
        if (vma->vm_pgoff != 0) {
                ibdev_dbg(ibdev, "Unexpected vm_pgoff %lu\n", vma->vm_pgoff);
@@ -531,7 +541,7 @@ int mana_ib_gd_query_adapter_caps(struct mana_ib_dev *dev)
        req.hdr.resp.msg_version = GDMA_MESSAGE_V3;
        req.hdr.dev_id = dev->gdma_dev->dev_id;
 
-       err = mana_gd_send_request(dev->gdma_dev->gdma_context, sizeof(req),
+       err = mana_gd_send_request(mdev_to_gc(dev), sizeof(req),
                                   &req, sizeof(resp), &resp);
 
        if (err) {
index 6bdc0f5498d5bc148cd333a33bdb6192d8b53ee9..f83390eebb7d751d731c48f232dc03bfc6847baa 100644 (file)
@@ -142,8 +142,29 @@ struct mana_ib_query_adapter_caps_resp {
        u32 max_inline_data_size;
 }; /* HW Data */
 
-int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
-                                mana_handle_t *gdma_region);
+static inline struct gdma_context *mdev_to_gc(struct mana_ib_dev *mdev)
+{
+       return mdev->gdma_dev->gdma_context;
+}
+
+static inline struct net_device *mana_ib_get_netdev(struct ib_device *ibdev, u32 port)
+{
+       struct mana_ib_dev *mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
+       struct gdma_context *gc = mdev_to_gc(mdev);
+       struct mana_context *mc = gc->mana.driver_data;
+
+       if (port < 1 || port > mc->num_ports)
+               return NULL;
+       return mc->ports[port - 1];
+}
+
+int mana_ib_install_cq_cb(struct mana_ib_dev *mdev, struct mana_ib_cq *cq);
+
+int mana_ib_create_zero_offset_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
+                                         mana_handle_t *gdma_region);
+
+int mana_ib_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem,
+                             mana_handle_t *gdma_region, u64 virt);
 
 int mana_ib_gd_destroy_dma_region(struct mana_ib_dev *dev,
                                  mana_handle_t gdma_region);
@@ -210,6 +231,4 @@ int mana_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
 void mana_ib_disassociate_ucontext(struct ib_ucontext *ibcontext);
 
 int mana_ib_gd_query_adapter_caps(struct mana_ib_dev *mdev);
-
-void mana_ib_cq_handler(void *ctx, struct gdma_queue *gdma_cq);
 #endif
index 351207c60eb65da7505aeac271a310a79b346fc6..b70b13484f0974d19bf41ca4e0d1f6872e7756d1 100644 (file)
@@ -30,12 +30,9 @@ static int mana_ib_gd_create_mr(struct mana_ib_dev *dev, struct mana_ib_mr *mr,
 {
        struct gdma_create_mr_response resp = {};
        struct gdma_create_mr_request req = {};
-       struct gdma_dev *mdev = dev->gdma_dev;
-       struct gdma_context *gc;
+       struct gdma_context *gc = mdev_to_gc(dev);
        int err;
 
-       gc = mdev->gdma_context;
-
        mana_gd_init_req_hdr(&req.hdr, GDMA_CREATE_MR, sizeof(req),
                             sizeof(resp));
        req.pd_handle = mr_params->pd_handle;
@@ -77,12 +74,9 @@ static int mana_ib_gd_destroy_mr(struct mana_ib_dev *dev, u64 mr_handle)
 {
        struct gdma_destroy_mr_response resp = {};
        struct gdma_destroy_mr_request req = {};
-       struct gdma_dev *mdev = dev->gdma_dev;
-       struct gdma_context *gc;
+       struct gdma_context *gc = mdev_to_gc(dev);
        int err;
 
-       gc = mdev->gdma_context;
-
        mana_gd_init_req_hdr(&req.hdr, GDMA_DESTROY_MR, sizeof(req),
                             sizeof(resp));
 
@@ -133,7 +127,7 @@ struct ib_mr *mana_ib_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 length,
                goto err_free;
        }
 
-       err = mana_ib_gd_create_dma_region(dev, mr->umem, &dma_region_handle);
+       err = mana_ib_create_dma_region(dev, mr->umem, &dma_region_handle, iova);
        if (err) {
                ibdev_dbg(ibdev, "Failed create dma region for user-mr, %d\n",
                          err);
@@ -141,7 +135,7 @@ struct ib_mr *mana_ib_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 length,
        }
 
        ibdev_dbg(ibdev,
-                 "mana_ib_gd_create_dma_region ret %d gdma_region %llx\n", err,
+                 "create_dma_region ret %d gdma_region %llx\n", err,
                  dma_region_handle);
 
        mr_params.pd_handle = pd->pd_handle;
@@ -164,8 +158,7 @@ struct ib_mr *mana_ib_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 length,
        return &mr->ibmr;
 
 err_dma_region:
-       mana_gd_destroy_dma_region(dev->gdma_dev->gdma_context,
-                                  dma_region_handle);
+       mana_gd_destroy_dma_region(mdev_to_gc(dev), dma_region_handle);
 
 err_umem:
        ib_umem_release(mr->umem);
index 21ac9fcadf3f239863cd5215a529215ea694653f..6e7627745c9578eada23d5db93e79b38cfd6307b 100644 (file)
@@ -17,12 +17,10 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev *dev,
        struct mana_cfg_rx_steer_resp resp = {};
        mana_handle_t *req_indir_tab;
        struct gdma_context *gc;
-       struct gdma_dev *mdev;
        u32 req_buf_size;
        int i, err;
 
-       gc = dev->gdma_dev->gdma_context;
-       mdev = &gc->mana;
+       gc = mdev_to_gc(dev);
 
        req_buf_size =
                sizeof(*req) + sizeof(mana_handle_t) * MANA_INDIRECT_TABLE_SIZE;
@@ -39,7 +37,7 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev *dev,
        req->rx_enable = 1;
        req->update_default_rxobj = 1;
        req->default_rxobj = default_rxobj;
-       req->hdr.dev_id = mdev->dev_id;
+       req->hdr.dev_id = gc->mana.dev_id;
 
        /* If there are more than 1 entries in indirection table, enable RSS */
        if (log_ind_tbl_size)
@@ -99,20 +97,17 @@ static int mana_ib_create_qp_rss(struct ib_qp *ibqp, struct ib_pd *pd,
        struct mana_ib_qp *qp = container_of(ibqp, struct mana_ib_qp, ibqp);
        struct mana_ib_dev *mdev =
                container_of(pd->device, struct mana_ib_dev, ib_dev);
+       struct gdma_context *gc = mdev_to_gc(mdev);
        struct ib_rwq_ind_table *ind_tbl = attr->rwq_ind_tbl;
        struct mana_ib_create_qp_rss_resp resp = {};
        struct mana_ib_create_qp_rss ucmd = {};
        struct gdma_queue **gdma_cq_allocated;
        mana_handle_t *mana_ind_table;
        struct mana_port_context *mpc;
-       struct gdma_queue *gdma_cq;
        unsigned int ind_tbl_size;
-       struct mana_context *mc;
        struct net_device *ndev;
-       struct gdma_context *gc;
        struct mana_ib_cq *cq;
        struct mana_ib_wq *wq;
-       struct gdma_dev *gd;
        struct mana_eq *eq;
        struct ib_cq *ibcq;
        struct ib_wq *ibwq;
@@ -120,10 +115,6 @@ static int mana_ib_create_qp_rss(struct ib_qp *ibqp, struct ib_pd *pd,
        u32 port;
        int ret;
 
-       gc = mdev->gdma_dev->gdma_context;
-       gd = &gc->mana;
-       mc = gd->driver_data;
-
        if (!udata || udata->inlen < sizeof(ucmd))
                return -EINVAL;
 
@@ -166,12 +157,12 @@ static int mana_ib_create_qp_rss(struct ib_qp *ibqp, struct ib_pd *pd,
 
        /* IB ports start with 1, MANA start with 0 */
        port = ucmd.port;
-       if (port < 1 || port > mc->num_ports) {
+       ndev = mana_ib_get_netdev(pd->device, port);
+       if (!ndev) {
                ibdev_dbg(&mdev->ib_dev, "Invalid port %u in creating qp\n",
                          port);
                return -EINVAL;
        }
-       ndev = mc->ports[port - 1];
        mpc = netdev_priv(ndev);
 
        ibdev_dbg(&mdev->ib_dev, "rx_hash_function %d port %d\n",
@@ -209,7 +200,7 @@ static int mana_ib_create_qp_rss(struct ib_qp *ibqp, struct ib_pd *pd,
                cq_spec.gdma_region = cq->gdma_region;
                cq_spec.queue_size = cq->cqe * COMP_ENTRY_SIZE;
                cq_spec.modr_ctx_id = 0;
-               eq = &mc->eqs[cq->comp_vector % gc->max_num_queues];
+               eq = &mpc->ac->eqs[cq->comp_vector % gc->max_num_queues];
                cq_spec.attached_eq = eq->eq->id;
 
                ret = mana_create_wq_obj(mpc, mpc->port_handle, GDMA_RQ,
@@ -237,19 +228,11 @@ static int mana_ib_create_qp_rss(struct ib_qp *ibqp, struct ib_pd *pd,
                mana_ind_table[i] = wq->rx_object;
 
                /* Create CQ table entry */
-               WARN_ON(gc->cq_table[cq->id]);
-               gdma_cq = kzalloc(sizeof(*gdma_cq), GFP_KERNEL);
-               if (!gdma_cq) {
-                       ret = -ENOMEM;
+               ret = mana_ib_install_cq_cb(mdev, cq);
+               if (ret)
                        goto fail;
-               }
-               gdma_cq_allocated[i] = gdma_cq;
 
-               gdma_cq->cq.context = cq;
-               gdma_cq->type = GDMA_CQ;
-               gdma_cq->cq.callback = mana_ib_cq_handler;
-               gdma_cq->id = cq->id;
-               gc->cq_table[cq->id] = gdma_cq;
+               gdma_cq_allocated[i] = gc->cq_table[cq->id];
        }
        resp.num_entries = i;
 
@@ -306,14 +289,13 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
        struct mana_ib_ucontext *mana_ucontext =
                rdma_udata_to_drv_context(udata, struct mana_ib_ucontext,
                                          ibucontext);
-       struct gdma_dev *gd = &mdev->gdma_dev->gdma_context->mana;
+       struct gdma_context *gc = mdev_to_gc(mdev);
        struct mana_ib_create_qp_resp resp = {};
        struct mana_ib_create_qp ucmd = {};
        struct gdma_queue *gdma_cq = NULL;
        struct mana_obj_spec wq_spec = {};
        struct mana_obj_spec cq_spec = {};
        struct mana_port_context *mpc;
-       struct mana_context *mc;
        struct net_device *ndev;
        struct ib_umem *umem;
        struct mana_eq *eq;
@@ -321,8 +303,6 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
        u32 port;
        int err;
 
-       mc = gd->driver_data;
-
        if (!mana_ucontext || udata->inlen < sizeof(ucmd))
                return -EINVAL;
 
@@ -333,11 +313,6 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
                return err;
        }
 
-       /* IB ports start with 1, MANA Ethernet ports start with 0 */
-       port = ucmd.port;
-       if (port < 1 || port > mc->num_ports)
-               return -EINVAL;
-
        if (attr->cap.max_send_wr > mdev->adapter_caps.max_qp_wr) {
                ibdev_dbg(&mdev->ib_dev,
                          "Requested max_send_wr %d exceeding limit\n",
@@ -352,11 +327,17 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
                return -EINVAL;
        }
 
-       ndev = mc->ports[port - 1];
+       port = ucmd.port;
+       ndev = mana_ib_get_netdev(ibpd->device, port);
+       if (!ndev) {
+               ibdev_dbg(&mdev->ib_dev, "Invalid port %u in creating qp\n",
+                         port);
+               return -EINVAL;
+       }
        mpc = netdev_priv(ndev);
        ibdev_dbg(&mdev->ib_dev, "port %u ndev %p mpc %p\n", port, ndev, mpc);
 
-       err = mana_ib_cfg_vport(mdev, port - 1, pd, mana_ucontext->doorbell);
+       err = mana_ib_cfg_vport(mdev, port, pd, mana_ucontext->doorbell);
        if (err)
                return -ENODEV;
 
@@ -376,8 +357,8 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
        }
        qp->sq_umem = umem;
 
-       err = mana_ib_gd_create_dma_region(mdev, qp->sq_umem,
-                                          &qp->sq_gdma_region);
+       err = mana_ib_create_zero_offset_dma_region(mdev, qp->sq_umem,
+                                                   &qp->sq_gdma_region);
        if (err) {
                ibdev_dbg(&mdev->ib_dev,
                          "Failed to create dma region for create qp-raw, %d\n",
@@ -386,7 +367,7 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
        }
 
        ibdev_dbg(&mdev->ib_dev,
-                 "mana_ib_gd_create_dma_region ret %d gdma_region 0x%llx\n",
+                 "create_dma_region ret %d gdma_region 0x%llx\n",
                  err, qp->sq_gdma_region);
 
        /* Create a WQ on the same port handle used by the Ethernet */
@@ -396,8 +377,8 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
        cq_spec.gdma_region = send_cq->gdma_region;
        cq_spec.queue_size = send_cq->cqe * COMP_ENTRY_SIZE;
        cq_spec.modr_ctx_id = 0;
-       eq_vec = send_cq->comp_vector % gd->gdma_context->max_num_queues;
-       eq = &mc->eqs[eq_vec];
+       eq_vec = send_cq->comp_vector % gc->max_num_queues;
+       eq = &mpc->ac->eqs[eq_vec];
        cq_spec.attached_eq = eq->eq->id;
 
        err = mana_create_wq_obj(mpc, mpc->port_handle, GDMA_SQ, &wq_spec,
@@ -417,18 +398,9 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
        send_cq->id = cq_spec.queue_index;
 
        /* Create CQ table entry */
-       WARN_ON(gd->gdma_context->cq_table[send_cq->id]);
-       gdma_cq = kzalloc(sizeof(*gdma_cq), GFP_KERNEL);
-       if (!gdma_cq) {
-               err = -ENOMEM;
+       err = mana_ib_install_cq_cb(mdev, send_cq);
+       if (err)
                goto err_destroy_wq_obj;
-       }
-
-       gdma_cq->cq.context = send_cq;
-       gdma_cq->type = GDMA_CQ;
-       gdma_cq->cq.callback = mana_ib_cq_handler;
-       gdma_cq->id = send_cq->id;
-       gd->gdma_context->cq_table[send_cq->id] = gdma_cq;
 
        ibdev_dbg(&mdev->ib_dev,
                  "ret %d qp->tx_object 0x%llx sq id %llu cq id %llu\n", err,
@@ -450,7 +422,7 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
 
 err_release_gdma_cq:
        kfree(gdma_cq);
-       gd->gdma_context->cq_table[send_cq->id] = NULL;
+       gc->cq_table[send_cq->id] = NULL;
 
 err_destroy_wq_obj:
        mana_destroy_wq_obj(mpc, GDMA_SQ, qp->tx_object);
@@ -462,7 +434,7 @@ err_release_umem:
        ib_umem_release(umem);
 
 err_free_vport:
-       mana_ib_uncfg_vport(mdev, pd, port - 1);
+       mana_ib_uncfg_vport(mdev, pd, port);
 
        return err;
 }
@@ -500,16 +472,13 @@ static int mana_ib_destroy_qp_rss(struct mana_ib_qp *qp,
 {
        struct mana_ib_dev *mdev =
                container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
-       struct gdma_dev *gd = &mdev->gdma_dev->gdma_context->mana;
        struct mana_port_context *mpc;
-       struct mana_context *mc;
        struct net_device *ndev;
        struct mana_ib_wq *wq;
        struct ib_wq *ibwq;
        int i;
 
-       mc = gd->driver_data;
-       ndev = mc->ports[qp->port - 1];
+       ndev = mana_ib_get_netdev(qp->ibqp.device, qp->port);
        mpc = netdev_priv(ndev);
 
        for (i = 0; i < (1 << ind_tbl->log_ind_tbl_size); i++) {
@@ -527,15 +496,12 @@ static int mana_ib_destroy_qp_raw(struct mana_ib_qp *qp, struct ib_udata *udata)
 {
        struct mana_ib_dev *mdev =
                container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
-       struct gdma_dev *gd = &mdev->gdma_dev->gdma_context->mana;
        struct ib_pd *ibpd = qp->ibqp.pd;
        struct mana_port_context *mpc;
-       struct mana_context *mc;
        struct net_device *ndev;
        struct mana_ib_pd *pd;
 
-       mc = gd->driver_data;
-       ndev = mc->ports[qp->port - 1];
+       ndev = mana_ib_get_netdev(qp->ibqp.device, qp->port);
        mpc = netdev_priv(ndev);
        pd = container_of(ibpd, struct mana_ib_pd, ibpd);
 
@@ -546,7 +512,7 @@ static int mana_ib_destroy_qp_raw(struct mana_ib_qp *qp, struct ib_udata *udata)
                ib_umem_release(qp->sq_umem);
        }
 
-       mana_ib_uncfg_vport(mdev, pd, qp->port - 1);
+       mana_ib_uncfg_vport(mdev, pd, qp->port);
 
        return 0;
 }
index 372d361510e0ca0ea9060f5b53d1a517a72cb178..7c9c6996257344e8bb2832900aafad4a3db1ed23 100644 (file)
@@ -46,7 +46,7 @@ struct ib_wq *mana_ib_create_wq(struct ib_pd *pd,
        wq->wq_buf_size = ucmd.wq_buf_size;
        wq->rx_object = INVALID_MANA_HANDLE;
 
-       err = mana_ib_gd_create_dma_region(mdev, wq->umem, &wq->gdma_region);
+       err = mana_ib_create_zero_offset_dma_region(mdev, wq->umem, &wq->gdma_region);
        if (err) {
                ibdev_dbg(&mdev->ib_dev,
                          "Failed to create dma region for create wq, %d\n",
@@ -55,7 +55,7 @@ struct ib_wq *mana_ib_create_wq(struct ib_pd *pd,
        }
 
        ibdev_dbg(&mdev->ib_dev,
-                 "mana_ib_gd_create_dma_region ret %d gdma_region 0x%llx\n",
+                 "create_dma_region ret %d gdma_region 0x%llx\n",
                  err, wq->gdma_region);
 
        /* WQ ID is returned at wq_create time, doesn't know the value yet */
index bbe79b86c71789c0e18647fc881e775e752d89e5..a8de35c07c9efb47985f39bea2629e10cdb7a306 100644 (file)
@@ -1377,7 +1377,6 @@ int mlx5_ib_query_port(struct ib_device *ibdev, u32 port,
                       struct ib_port_attr *props);
 void mlx5_ib_populate_pas(struct ib_umem *umem, size_t page_size, __be64 *pas,
                          u64 access_flags);
-void mlx5_ib_copy_pas(u64 *old, u64 *new, int step, int num);
 int mlx5_ib_get_cqe_size(struct ib_cq *ibcq);
 int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev);
 void mlx5_mkey_cache_cleanup(struct mlx5_ib_dev *dev);
index 54c723a6eddacef625cccbc47184a46cb93fe9a3..ae466e72fc43b3811908cff9f92f6f94c3fb443e 100644 (file)
@@ -160,8 +160,6 @@ void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)
 
        port->attr.active_mtu = mtu;
        port->mtu_cap = ib_mtu_enum_to_int(mtu);
-
-       rxe_info_dev(rxe, "Set mtu to %d", port->mtu_cap);
 }
 
 /* called by ifc layer to create new rxe device.
@@ -181,7 +179,7 @@ static int rxe_newlink(const char *ibdev_name, struct net_device *ndev)
        int err = 0;
 
        if (is_vlan_dev(ndev)) {
-               rxe_err("rxe creation allowed on top of a real device only");
+               rxe_err("rxe creation allowed on top of a real device only\n");
                err = -EPERM;
                goto err;
        }
@@ -189,7 +187,7 @@ static int rxe_newlink(const char *ibdev_name, struct net_device *ndev)
        rxe = rxe_get_dev_from_net(ndev);
        if (rxe) {
                ib_device_put(&rxe->ib_dev);
-               rxe_err_dev(rxe, "already configured on %s", ndev->name);
+               rxe_err_dev(rxe, "already configured on %s\n", ndev->name);
                err = -EEXIST;
                goto err;
        }
index d33dd6cf83d377eb43bc180d8495da68b258d7e6..d8fb2c7af30a7ed3a709f045ca2a7cfbc716e202 100644 (file)
@@ -38,7 +38,7 @@
 
 #define RXE_ROCE_V2_SPORT              (0xc000)
 
-#define rxe_dbg(fmt, ...) pr_debug("%s: " fmt "\n", __func__, ##__VA_ARGS__)
+#define rxe_dbg(fmt, ...) pr_debug("%s: " fmt, __func__, ##__VA_ARGS__)
 #define rxe_dbg_dev(rxe, fmt, ...) ibdev_dbg(&(rxe)->ib_dev,           \
                "%s: " fmt, __func__, ##__VA_ARGS__)
 #define rxe_dbg_uc(uc, fmt, ...) ibdev_dbg((uc)->ibuc.device,          \
@@ -58,7 +58,7 @@
 #define rxe_dbg_mw(mw, fmt, ...) ibdev_dbg((mw)->ibmw.device,          \
                "mw#%d %s:  " fmt, (mw)->elem.index, __func__, ##__VA_ARGS__)
 
-#define rxe_err(fmt, ...) pr_err_ratelimited("%s: " fmt "\n", __func__, \
+#define rxe_err(fmt, ...) pr_err_ratelimited("%s: " fmt, __func__, \
                                        ##__VA_ARGS__)
 #define rxe_err_dev(rxe, fmt, ...) ibdev_err_ratelimited(&(rxe)->ib_dev, \
                "%s: " fmt, __func__, ##__VA_ARGS__)
@@ -79,7 +79,7 @@
 #define rxe_err_mw(mw, fmt, ...) ibdev_err_ratelimited((mw)->ibmw.device, \
                "mw#%d %s:  " fmt, (mw)->elem.index, __func__, ##__VA_ARGS__)
 
-#define rxe_info(fmt, ...) pr_info_ratelimited("%s: " fmt "\n", __func__, \
+#define rxe_info(fmt, ...) pr_info_ratelimited("%s: " fmt, __func__, \
                                        ##__VA_ARGS__)
 #define rxe_info_dev(rxe, fmt, ...) ibdev_info_ratelimited(&(rxe)->ib_dev, \
                "%s: " fmt, __func__, ##__VA_ARGS__)
index d0bdc2d8adc82430734a9335aa54dce553728ddd..b78b8c0856abdec8555678d72b919688ec4ddca4 100644 (file)
@@ -433,7 +433,7 @@ static void make_send_cqe(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
                }
        } else {
                if (wqe->status != IB_WC_WR_FLUSH_ERR)
-                       rxe_err_qp(qp, "non-flush error status = %d",
+                       rxe_err_qp(qp, "non-flush error status = %d\n",
                                wqe->status);
        }
 }
@@ -582,7 +582,7 @@ static int flush_send_wqe(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
 
        err = rxe_cq_post(qp->scq, &cqe, 0);
        if (err)
-               rxe_dbg_cq(qp->scq, "post cq failed, err = %d", err);
+               rxe_dbg_cq(qp->scq, "post cq failed, err = %d\n", err);
 
        return err;
 }
index d5486cbb3f100404808e1e1df5b68452239292cc..fec87c9030abdc9964598320e741c316eecae92d 100644 (file)
@@ -27,7 +27,7 @@ int rxe_cq_chk_attr(struct rxe_dev *rxe, struct rxe_cq *cq,
        if (cq) {
                count = queue_count(cq->queue, QUEUE_TYPE_TO_CLIENT);
                if (cqe < count) {
-                       rxe_dbg_cq(cq, "cqe(%d) < current # elements in queue (%d)",
+                       rxe_dbg_cq(cq, "cqe(%d) < current # elements in queue (%d)\n",
                                        cqe, count);
                        goto err1;
                }
@@ -96,7 +96,7 @@ int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited)
 
        full = queue_full(cq->queue, QUEUE_TYPE_TO_CLIENT);
        if (unlikely(full)) {
-               rxe_err_cq(cq, "queue full");
+               rxe_err_cq(cq, "queue full\n");
                spin_unlock_irqrestore(&cq->cq_lock, flags);
                if (cq->ibcq.event_handler) {
                        ev.device = cq->ibcq.device;
index 4d2a8ef52c8503ad7225adb01ca001ad369373b4..746110898a0e6198c19509d977681f0af4c64678 100644 (file)
@@ -59,7 +59,7 @@ int rxe_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
 /* rxe_mr.c */
 u8 rxe_get_next_key(u32 last_key);
 void rxe_mr_init_dma(int access, struct rxe_mr *mr);
-int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length, u64 iova,
+int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length,
                     int access, struct rxe_mr *mr);
 int rxe_mr_init_fast(int max_pages, struct rxe_mr *mr);
 int rxe_flush_pmem_iova(struct rxe_mr *mr, u64 iova, unsigned int length);
index f54042e9aeb2687c781aa142d621c44e687ccc4f..da3dee520876a3ab392637416524bf2c68450421 100644 (file)
@@ -34,7 +34,7 @@ int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length)
        case IB_MR_TYPE_MEM_REG:
                if (iova < mr->ibmr.iova ||
                    iova + length > mr->ibmr.iova + mr->ibmr.length) {
-                       rxe_dbg_mr(mr, "iova/length out of range");
+                       rxe_dbg_mr(mr, "iova/length out of range\n");
                        return -EINVAL;
                }
                return 0;
@@ -126,7 +126,7 @@ static int rxe_mr_fill_pages_from_sgt(struct rxe_mr *mr, struct sg_table *sgt)
        return xas_error(&xas);
 }
 
-int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length, u64 iova,
+int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length,
                     int access, struct rxe_mr *mr)
 {
        struct ib_umem *umem;
@@ -319,7 +319,7 @@ int rxe_mr_copy(struct rxe_mr *mr, u64 iova, void *addr,
 
        err = mr_check_range(mr, iova, length);
        if (unlikely(err)) {
-               rxe_dbg_mr(mr, "iova out of range");
+               rxe_dbg_mr(mr, "iova out of range\n");
                return err;
        }
 
@@ -477,7 +477,7 @@ int rxe_mr_do_atomic_op(struct rxe_mr *mr, u64 iova, int opcode,
        u64 *va;
 
        if (unlikely(mr->state != RXE_MR_STATE_VALID)) {
-               rxe_dbg_mr(mr, "mr not in valid state");
+               rxe_dbg_mr(mr, "mr not in valid state\n");
                return RESPST_ERR_RKEY_VIOLATION;
        }
 
@@ -490,7 +490,7 @@ int rxe_mr_do_atomic_op(struct rxe_mr *mr, u64 iova, int opcode,
 
                err = mr_check_range(mr, iova, sizeof(value));
                if (err) {
-                       rxe_dbg_mr(mr, "iova out of range");
+                       rxe_dbg_mr(mr, "iova out of range\n");
                        return RESPST_ERR_RKEY_VIOLATION;
                }
                page_offset = rxe_mr_iova_to_page_offset(mr, iova);
@@ -501,7 +501,7 @@ int rxe_mr_do_atomic_op(struct rxe_mr *mr, u64 iova, int opcode,
        }
 
        if (unlikely(page_offset & 0x7)) {
-               rxe_dbg_mr(mr, "iova not aligned");
+               rxe_dbg_mr(mr, "iova not aligned\n");
                return RESPST_ERR_MISALIGNED_ATOMIC;
        }
 
@@ -534,7 +534,7 @@ int rxe_mr_do_atomic_write(struct rxe_mr *mr, u64 iova, u64 value)
 
        /* See IBA oA19-28 */
        if (unlikely(mr->state != RXE_MR_STATE_VALID)) {
-               rxe_dbg_mr(mr, "mr not in valid state");
+               rxe_dbg_mr(mr, "mr not in valid state\n");
                return RESPST_ERR_RKEY_VIOLATION;
        }
 
@@ -548,7 +548,7 @@ int rxe_mr_do_atomic_write(struct rxe_mr *mr, u64 iova, u64 value)
                /* See IBA oA19-28 */
                err = mr_check_range(mr, iova, sizeof(value));
                if (unlikely(err)) {
-                       rxe_dbg_mr(mr, "iova out of range");
+                       rxe_dbg_mr(mr, "iova out of range\n");
                        return RESPST_ERR_RKEY_VIOLATION;
                }
                page_offset = rxe_mr_iova_to_page_offset(mr, iova);
@@ -560,7 +560,7 @@ int rxe_mr_do_atomic_write(struct rxe_mr *mr, u64 iova, u64 value)
 
        /* See IBA A19.4.2 */
        if (unlikely(page_offset & 0x7)) {
-               rxe_dbg_mr(mr, "misaligned address");
+               rxe_dbg_mr(mr, "misaligned address\n");
                return RESPST_ERR_MISALIGNED_ATOMIC;
        }
 
index d9312b5c9d207ea7864a6705896d6ddb26d8b969..379e65bfcd49af8f3d1389246adabe8763dad82f 100644 (file)
@@ -198,7 +198,7 @@ int rxe_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
        }
 
        if (access & ~RXE_ACCESS_SUPPORTED_MW) {
-               rxe_err_mw(mw, "access %#x not supported", access);
+               rxe_err_mw(mw, "access %#x not supported\n", access);
                ret = -EOPNOTSUPP;
                goto err_drop_mr;
        }
index 28e379c108bce0f63231a7f80d790b80e3ac83fe..e3589c02013ec5de4e183afc682d9818d707aafa 100644 (file)
@@ -201,7 +201,7 @@ static int rxe_init_sq(struct rxe_qp *qp, struct ib_qp_init_attr *init,
        qp->sq.queue = rxe_queue_init(rxe, &qp->sq.max_wr, wqe_size,
                                      QUEUE_TYPE_FROM_CLIENT);
        if (!qp->sq.queue) {
-               rxe_err_qp(qp, "Unable to allocate send queue");
+               rxe_err_qp(qp, "Unable to allocate send queue\n");
                err = -ENOMEM;
                goto err_out;
        }
@@ -211,7 +211,7 @@ static int rxe_init_sq(struct rxe_qp *qp, struct ib_qp_init_attr *init,
                           qp->sq.queue->buf, qp->sq.queue->buf_size,
                           &qp->sq.queue->ip);
        if (err) {
-               rxe_err_qp(qp, "do_mmap_info failed, err = %d", err);
+               rxe_err_qp(qp, "do_mmap_info failed, err = %d\n", err);
                goto err_free;
        }
 
@@ -292,7 +292,7 @@ static int rxe_init_rq(struct rxe_qp *qp, struct ib_qp_init_attr *init,
        qp->rq.queue = rxe_queue_init(rxe, &qp->rq.max_wr, wqe_size,
                                      QUEUE_TYPE_FROM_CLIENT);
        if (!qp->rq.queue) {
-               rxe_err_qp(qp, "Unable to allocate recv queue");
+               rxe_err_qp(qp, "Unable to allocate recv queue\n");
                err = -ENOMEM;
                goto err_out;
        }
@@ -302,7 +302,7 @@ static int rxe_init_rq(struct rxe_qp *qp, struct ib_qp_init_attr *init,
                           qp->rq.queue->buf, qp->rq.queue->buf_size,
                           &qp->rq.queue->ip);
        if (err) {
-               rxe_err_qp(qp, "do_mmap_info failed, err = %d", err);
+               rxe_err_qp(qp, "do_mmap_info failed, err = %d\n", err);
                goto err_free;
        }
 
index da470a925efc7bbbfc051e4855605ae7f4c31eb3..963382f625d7144aab89c5fcebdafe267380f922 100644 (file)
@@ -362,18 +362,18 @@ static enum resp_states rxe_resp_check_length(struct rxe_qp *qp,
                if ((pkt->mask & RXE_START_MASK) &&
                    (pkt->mask & RXE_END_MASK)) {
                        if (unlikely(payload > mtu)) {
-                               rxe_dbg_qp(qp, "only packet too long");
+                               rxe_dbg_qp(qp, "only packet too long\n");
                                return RESPST_ERR_LENGTH;
                        }
                } else if ((pkt->mask & RXE_START_MASK) ||
                           (pkt->mask & RXE_MIDDLE_MASK)) {
                        if (unlikely(payload != mtu)) {
-                               rxe_dbg_qp(qp, "first or middle packet not mtu");
+                               rxe_dbg_qp(qp, "first or middle packet not mtu\n");
                                return RESPST_ERR_LENGTH;
                        }
                } else if (pkt->mask & RXE_END_MASK) {
                        if (unlikely((payload == 0) || (payload > mtu))) {
-                               rxe_dbg_qp(qp, "last packet zero or too long");
+                               rxe_dbg_qp(qp, "last packet zero or too long\n");
                                return RESPST_ERR_LENGTH;
                        }
                }
@@ -382,7 +382,7 @@ static enum resp_states rxe_resp_check_length(struct rxe_qp *qp,
        /* See IBA C9-94 */
        if (pkt->mask & RXE_RETH_MASK) {
                if (reth_len(pkt) > (1U << 31)) {
-                       rxe_dbg_qp(qp, "dma length too long");
+                       rxe_dbg_qp(qp, "dma length too long\n");
                        return RESPST_ERR_LENGTH;
                }
        }
@@ -1133,7 +1133,7 @@ static enum resp_states do_complete(struct rxe_qp *qp,
                }
        } else {
                if (wc->status != IB_WC_WR_FLUSH_ERR)
-                       rxe_err_qp(qp, "non-flush error status = %d",
+                       rxe_err_qp(qp, "non-flush error status = %d\n",
                                wc->status);
        }
 
@@ -1442,7 +1442,7 @@ static int flush_recv_wqe(struct rxe_qp *qp, struct rxe_recv_wqe *wqe)
 
        err = rxe_cq_post(qp->rcq, &cqe, 0);
        if (err)
-               rxe_dbg_cq(qp->rcq, "post cq failed err = %d", err);
+               rxe_dbg_cq(qp->rcq, "post cq failed err = %d\n", err);
 
        return err;
 }
index 1501120d4f5241dcca89120c37cb90883811165c..80332638d9e3acf8f45f885defb20fb6c377a82b 100644 (file)
@@ -156,7 +156,7 @@ static void do_task(struct rxe_task *task)
 
                default:
                        WARN_ON(1);
-                       rxe_dbg_qp(task->qp, "unexpected task state = %d",
+                       rxe_dbg_qp(task->qp, "unexpected task state = %d\n",
                                   task->state);
                        task->state = TASK_STATE_IDLE;
                }
@@ -167,7 +167,7 @@ exit:
                        if (WARN_ON(task->num_done != task->num_sched))
                                rxe_dbg_qp(
                                        task->qp,
-                                       "%ld tasks scheduled, %ld tasks done",
+                                       "%ld tasks scheduled, %ld tasks done\n",
                                        task->num_sched, task->num_done);
                }
                spin_unlock_irqrestore(&task->lock, flags);
index 48f86839d36a8ebba67c5371f9f73d3064b04185..614581989b38160eaa5a3e49b148d6a63148e4b1 100644 (file)
@@ -23,7 +23,7 @@ static int rxe_query_device(struct ib_device *ibdev,
        int err;
 
        if (udata->inlen || udata->outlen) {
-               rxe_dbg_dev(rxe, "malformed udata");
+               rxe_dbg_dev(rxe, "malformed udata\n");
                err = -EINVAL;
                goto err_out;
        }
@@ -33,7 +33,7 @@ static int rxe_query_device(struct ib_device *ibdev,
        return 0;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -45,7 +45,7 @@ static int rxe_query_port(struct ib_device *ibdev,
 
        if (port_num != 1) {
                err = -EINVAL;
-               rxe_dbg_dev(rxe, "bad port_num = %d", port_num);
+               rxe_dbg_dev(rxe, "bad port_num = %d\n", port_num);
                goto err_out;
        }
 
@@ -67,7 +67,7 @@ static int rxe_query_port(struct ib_device *ibdev,
        return ret;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -79,7 +79,7 @@ static int rxe_query_pkey(struct ib_device *ibdev,
 
        if (index != 0) {
                err = -EINVAL;
-               rxe_dbg_dev(rxe, "bad pkey index = %d", index);
+               rxe_dbg_dev(rxe, "bad pkey index = %d\n", index);
                goto err_out;
        }
 
@@ -87,7 +87,7 @@ static int rxe_query_pkey(struct ib_device *ibdev,
        return 0;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -100,7 +100,7 @@ static int rxe_modify_device(struct ib_device *ibdev,
        if (mask & ~(IB_DEVICE_MODIFY_SYS_IMAGE_GUID |
                     IB_DEVICE_MODIFY_NODE_DESC)) {
                err = -EOPNOTSUPP;
-               rxe_dbg_dev(rxe, "unsupported mask = 0x%x", mask);
+               rxe_dbg_dev(rxe, "unsupported mask = 0x%x\n", mask);
                goto err_out;
        }
 
@@ -115,7 +115,7 @@ static int rxe_modify_device(struct ib_device *ibdev,
        return 0;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -128,14 +128,14 @@ static int rxe_modify_port(struct ib_device *ibdev, u32 port_num,
 
        if (port_num != 1) {
                err = -EINVAL;
-               rxe_dbg_dev(rxe, "bad port_num = %d", port_num);
+               rxe_dbg_dev(rxe, "bad port_num = %d\n", port_num);
                goto err_out;
        }
 
        //TODO is shutdown useful
        if (mask & ~(IB_PORT_RESET_QKEY_CNTR)) {
                err = -EOPNOTSUPP;
-               rxe_dbg_dev(rxe, "unsupported mask = 0x%x", mask);
+               rxe_dbg_dev(rxe, "unsupported mask = 0x%x\n", mask);
                goto err_out;
        }
 
@@ -149,7 +149,7 @@ static int rxe_modify_port(struct ib_device *ibdev, u32 port_num,
        return 0;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -161,14 +161,14 @@ static enum rdma_link_layer rxe_get_link_layer(struct ib_device *ibdev,
 
        if (port_num != 1) {
                err = -EINVAL;
-               rxe_dbg_dev(rxe, "bad port_num = %d", port_num);
+               rxe_dbg_dev(rxe, "bad port_num = %d\n", port_num);
                goto err_out;
        }
 
        return IB_LINK_LAYER_ETHERNET;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -181,7 +181,7 @@ static int rxe_port_immutable(struct ib_device *ibdev, u32 port_num,
 
        if (port_num != 1) {
                err = -EINVAL;
-               rxe_dbg_dev(rxe, "bad port_num = %d", port_num);
+               rxe_dbg_dev(rxe, "bad port_num = %d\n", port_num);
                goto err_out;
        }
 
@@ -197,7 +197,7 @@ static int rxe_port_immutable(struct ib_device *ibdev, u32 port_num,
        return 0;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -210,7 +210,7 @@ static int rxe_alloc_ucontext(struct ib_ucontext *ibuc, struct ib_udata *udata)
 
        err = rxe_add_to_pool(&rxe->uc_pool, uc);
        if (err)
-               rxe_err_dev(rxe, "unable to create uc");
+               rxe_err_dev(rxe, "unable to create uc\n");
 
        return err;
 }
@@ -222,7 +222,7 @@ static void rxe_dealloc_ucontext(struct ib_ucontext *ibuc)
 
        err = rxe_cleanup(uc);
        if (err)
-               rxe_err_uc(uc, "cleanup failed, err = %d", err);
+               rxe_err_uc(uc, "cleanup failed, err = %d\n", err);
 }
 
 /* pd */
@@ -234,14 +234,14 @@ static int rxe_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 
        err = rxe_add_to_pool(&rxe->pd_pool, pd);
        if (err) {
-               rxe_dbg_dev(rxe, "unable to alloc pd");
+               rxe_dbg_dev(rxe, "unable to alloc pd\n");
                goto err_out;
        }
 
        return 0;
 
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -252,7 +252,7 @@ static int rxe_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 
        err = rxe_cleanup(pd);
        if (err)
-               rxe_err_pd(pd, "cleanup failed, err = %d", err);
+               rxe_err_pd(pd, "cleanup failed, err = %d\n", err);
 
        return 0;
 }
@@ -279,7 +279,7 @@ static int rxe_create_ah(struct ib_ah *ibah,
        err = rxe_add_to_pool_ah(&rxe->ah_pool, ah,
                        init_attr->flags & RDMA_CREATE_AH_SLEEPABLE);
        if (err) {
-               rxe_dbg_dev(rxe, "unable to create ah");
+               rxe_dbg_dev(rxe, "unable to create ah\n");
                goto err_out;
        }
 
@@ -288,7 +288,7 @@ static int rxe_create_ah(struct ib_ah *ibah,
 
        err = rxe_ah_chk_attr(ah, init_attr->ah_attr);
        if (err) {
-               rxe_dbg_ah(ah, "bad attr");
+               rxe_dbg_ah(ah, "bad attr\n");
                goto err_cleanup;
        }
 
@@ -298,7 +298,7 @@ static int rxe_create_ah(struct ib_ah *ibah,
                                         sizeof(uresp->ah_num));
                if (err) {
                        err = -EFAULT;
-                       rxe_dbg_ah(ah, "unable to copy to user");
+                       rxe_dbg_ah(ah, "unable to copy to user\n");
                        goto err_cleanup;
                }
        } else if (ah->is_user) {
@@ -314,9 +314,9 @@ static int rxe_create_ah(struct ib_ah *ibah,
 err_cleanup:
        cleanup_err = rxe_cleanup(ah);
        if (cleanup_err)
-               rxe_err_ah(ah, "cleanup failed, err = %d", cleanup_err);
+               rxe_err_ah(ah, "cleanup failed, err = %d\n", cleanup_err);
 err_out:
-       rxe_err_ah(ah, "returned err = %d", err);
+       rxe_err_ah(ah, "returned err = %d\n", err);
        return err;
 }
 
@@ -327,7 +327,7 @@ static int rxe_modify_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr)
 
        err = rxe_ah_chk_attr(ah, attr);
        if (err) {
-               rxe_dbg_ah(ah, "bad attr");
+               rxe_dbg_ah(ah, "bad attr\n");
                goto err_out;
        }
 
@@ -336,7 +336,7 @@ static int rxe_modify_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr)
        return 0;
 
 err_out:
-       rxe_err_ah(ah, "returned err = %d", err);
+       rxe_err_ah(ah, "returned err = %d\n", err);
        return err;
 }
 
@@ -358,7 +358,7 @@ static int rxe_destroy_ah(struct ib_ah *ibah, u32 flags)
 
        err = rxe_cleanup_ah(ah, flags & RDMA_DESTROY_AH_SLEEPABLE);
        if (err)
-               rxe_err_ah(ah, "cleanup failed, err = %d", err);
+               rxe_err_ah(ah, "cleanup failed, err = %d\n", err);
 
        return 0;
 }
@@ -376,7 +376,7 @@ static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init,
        if (udata) {
                if (udata->outlen < sizeof(*uresp)) {
                        err = -EINVAL;
-                       rxe_err_dev(rxe, "malformed udata");
+                       rxe_err_dev(rxe, "malformed udata\n");
                        goto err_out;
                }
                uresp = udata->outbuf;
@@ -384,20 +384,20 @@ static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init,
 
        if (init->srq_type != IB_SRQT_BASIC) {
                err = -EOPNOTSUPP;
-               rxe_dbg_dev(rxe, "srq type = %d, not supported",
+               rxe_dbg_dev(rxe, "srq type = %d, not supported\n",
                                init->srq_type);
                goto err_out;
        }
 
        err = rxe_srq_chk_init(rxe, init);
        if (err) {
-               rxe_dbg_dev(rxe, "invalid init attributes");
+               rxe_dbg_dev(rxe, "invalid init attributes\n");
                goto err_out;
        }
 
        err = rxe_add_to_pool(&rxe->srq_pool, srq);
        if (err) {
-               rxe_dbg_dev(rxe, "unable to create srq, err = %d", err);
+               rxe_dbg_dev(rxe, "unable to create srq, err = %d\n", err);
                goto err_out;
        }
 
@@ -406,7 +406,7 @@ static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init,
 
        err = rxe_srq_from_init(rxe, srq, init, udata, uresp);
        if (err) {
-               rxe_dbg_srq(srq, "create srq failed, err = %d", err);
+               rxe_dbg_srq(srq, "create srq failed, err = %d\n", err);
                goto err_cleanup;
        }
 
@@ -415,9 +415,9 @@ static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init,
 err_cleanup:
        cleanup_err = rxe_cleanup(srq);
        if (cleanup_err)
-               rxe_err_srq(srq, "cleanup failed, err = %d", cleanup_err);
+               rxe_err_srq(srq, "cleanup failed, err = %d\n", cleanup_err);
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -433,34 +433,34 @@ static int rxe_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
        if (udata) {
                if (udata->inlen < sizeof(cmd)) {
                        err = -EINVAL;
-                       rxe_dbg_srq(srq, "malformed udata");
+                       rxe_dbg_srq(srq, "malformed udata\n");
                        goto err_out;
                }
 
                err = ib_copy_from_udata(&cmd, udata, sizeof(cmd));
                if (err) {
                        err = -EFAULT;
-                       rxe_dbg_srq(srq, "unable to read udata");
+                       rxe_dbg_srq(srq, "unable to read udata\n");
                        goto err_out;
                }
        }
 
        err = rxe_srq_chk_attr(rxe, srq, attr, mask);
        if (err) {
-               rxe_dbg_srq(srq, "bad init attributes");
+               rxe_dbg_srq(srq, "bad init attributes\n");
                goto err_out;
        }
 
        err = rxe_srq_from_attr(rxe, srq, attr, mask, &cmd, udata);
        if (err) {
-               rxe_dbg_srq(srq, "bad attr");
+               rxe_dbg_srq(srq, "bad attr\n");
                goto err_out;
        }
 
        return 0;
 
 err_out:
-       rxe_err_srq(srq, "returned err = %d", err);
+       rxe_err_srq(srq, "returned err = %d\n", err);
        return err;
 }
 
@@ -471,7 +471,7 @@ static int rxe_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
 
        if (srq->error) {
                err = -EINVAL;
-               rxe_dbg_srq(srq, "srq in error state");
+               rxe_dbg_srq(srq, "srq in error state\n");
                goto err_out;
        }
 
@@ -481,7 +481,7 @@ static int rxe_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
        return 0;
 
 err_out:
-       rxe_err_srq(srq, "returned err = %d", err);
+       rxe_err_srq(srq, "returned err = %d\n", err);
        return err;
 }
 
@@ -505,7 +505,7 @@ static int rxe_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
 
        if (err) {
                *bad_wr = wr;
-               rxe_err_srq(srq, "returned err = %d", err);
+               rxe_err_srq(srq, "returned err = %d\n", err);
        }
 
        return err;
@@ -518,7 +518,7 @@ static int rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 
        err = rxe_cleanup(srq);
        if (err)
-               rxe_err_srq(srq, "cleanup failed, err = %d", err);
+               rxe_err_srq(srq, "cleanup failed, err = %d\n", err);
 
        return 0;
 }
@@ -536,13 +536,13 @@ static int rxe_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init,
        if (udata) {
                if (udata->inlen) {
                        err = -EINVAL;
-                       rxe_dbg_dev(rxe, "malformed udata, err = %d", err);
+                       rxe_dbg_dev(rxe, "malformed udata, err = %d\n", err);
                        goto err_out;
                }
 
                if (udata->outlen < sizeof(*uresp)) {
                        err = -EINVAL;
-                       rxe_dbg_dev(rxe, "malformed udata, err = %d", err);
+                       rxe_dbg_dev(rxe, "malformed udata, err = %d\n", err);
                        goto err_out;
                }
 
@@ -554,25 +554,25 @@ static int rxe_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init,
 
        if (init->create_flags) {
                err = -EOPNOTSUPP;
-               rxe_dbg_dev(rxe, "unsupported create_flags, err = %d", err);
+               rxe_dbg_dev(rxe, "unsupported create_flags, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_qp_chk_init(rxe, init);
        if (err) {
-               rxe_dbg_dev(rxe, "bad init attr, err = %d", err);
+               rxe_dbg_dev(rxe, "bad init attr, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_add_to_pool(&rxe->qp_pool, qp);
        if (err) {
-               rxe_dbg_dev(rxe, "unable to create qp, err = %d", err);
+               rxe_dbg_dev(rxe, "unable to create qp, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_qp_from_init(rxe, qp, pd, init, uresp, ibqp->pd, udata);
        if (err) {
-               rxe_dbg_qp(qp, "create qp failed, err = %d", err);
+               rxe_dbg_qp(qp, "create qp failed, err = %d\n", err);
                goto err_cleanup;
        }
 
@@ -582,9 +582,9 @@ static int rxe_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init,
 err_cleanup:
        cleanup_err = rxe_cleanup(qp);
        if (cleanup_err)
-               rxe_err_qp(qp, "cleanup failed, err = %d", cleanup_err);
+               rxe_err_qp(qp, "cleanup failed, err = %d\n", cleanup_err);
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -597,20 +597,20 @@ static int rxe_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 
        if (mask & ~IB_QP_ATTR_STANDARD_BITS) {
                err = -EOPNOTSUPP;
-               rxe_dbg_qp(qp, "unsupported mask = 0x%x, err = %d",
+               rxe_dbg_qp(qp, "unsupported mask = 0x%x, err = %d\n",
                           mask, err);
                goto err_out;
        }
 
        err = rxe_qp_chk_attr(rxe, qp, attr, mask);
        if (err) {
-               rxe_dbg_qp(qp, "bad mask/attr, err = %d", err);
+               rxe_dbg_qp(qp, "bad mask/attr, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_qp_from_attr(qp, attr, mask, udata);
        if (err) {
-               rxe_dbg_qp(qp, "modify qp failed, err = %d", err);
+               rxe_dbg_qp(qp, "modify qp failed, err = %d\n", err);
                goto err_out;
        }
 
@@ -622,7 +622,7 @@ static int rxe_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
        return 0;
 
 err_out:
-       rxe_err_qp(qp, "returned err = %d", err);
+       rxe_err_qp(qp, "returned err = %d\n", err);
        return err;
 }
 
@@ -644,18 +644,18 @@ static int rxe_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
 
        err = rxe_qp_chk_destroy(qp);
        if (err) {
-               rxe_dbg_qp(qp, "unable to destroy qp, err = %d", err);
+               rxe_dbg_qp(qp, "unable to destroy qp, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_cleanup(qp);
        if (err)
-               rxe_err_qp(qp, "cleanup failed, err = %d", err);
+               rxe_err_qp(qp, "cleanup failed, err = %d\n", err);
 
        return 0;
 
 err_out:
-       rxe_err_qp(qp, "returned err = %d", err);
+       rxe_err_qp(qp, "returned err = %d\n", err);
        return err;
 }
 
@@ -675,12 +675,12 @@ static int validate_send_wr(struct rxe_qp *qp, const struct ib_send_wr *ibwr,
        do {
                mask = wr_opcode_mask(ibwr->opcode, qp);
                if (!mask) {
-                       rxe_err_qp(qp, "bad wr opcode for qp type");
+                       rxe_err_qp(qp, "bad wr opcode for qp type\n");
                        break;
                }
 
                if (num_sge > sq->max_sge) {
-                       rxe_err_qp(qp, "num_sge > max_sge");
+                       rxe_err_qp(qp, "num_sge > max_sge\n");
                        break;
                }
 
@@ -689,27 +689,27 @@ static int validate_send_wr(struct rxe_qp *qp, const struct ib_send_wr *ibwr,
                        length += ibwr->sg_list[i].length;
 
                if (length > (1UL << 31)) {
-                       rxe_err_qp(qp, "message length too long");
+                       rxe_err_qp(qp, "message length too long\n");
                        break;
                }
 
                if (mask & WR_ATOMIC_MASK) {
                        if (length != 8) {
-                               rxe_err_qp(qp, "atomic length != 8");
+                               rxe_err_qp(qp, "atomic length != 8\n");
                                break;
                        }
                        if (atomic_wr(ibwr)->remote_addr & 0x7) {
-                               rxe_err_qp(qp, "misaligned atomic address");
+                               rxe_err_qp(qp, "misaligned atomic address\n");
                                break;
                        }
                }
                if (ibwr->send_flags & IB_SEND_INLINE) {
                        if (!(mask & WR_INLINE_MASK)) {
-                               rxe_err_qp(qp, "opcode doesn't support inline data");
+                               rxe_err_qp(qp, "opcode doesn't support inline data\n");
                                break;
                        }
                        if (length > sq->max_inline) {
-                               rxe_err_qp(qp, "inline length too big");
+                               rxe_err_qp(qp, "inline length too big\n");
                                break;
                        }
                }
@@ -747,7 +747,7 @@ static int init_send_wr(struct rxe_qp *qp, struct rxe_send_wr *wr,
                case IB_WR_SEND:
                        break;
                default:
-                       rxe_err_qp(qp, "bad wr opcode %d for UD/GSI QP",
+                       rxe_err_qp(qp, "bad wr opcode %d for UD/GSI QP\n",
                                        wr->opcode);
                        return -EINVAL;
                }
@@ -795,7 +795,7 @@ static int init_send_wr(struct rxe_qp *qp, struct rxe_send_wr *wr,
                case IB_WR_ATOMIC_WRITE:
                        break;
                default:
-                       rxe_err_qp(qp, "unsupported wr opcode %d",
+                       rxe_err_qp(qp, "unsupported wr opcode %d\n",
                                        wr->opcode);
                        return -EINVAL;
                }
@@ -870,7 +870,7 @@ static int post_one_send(struct rxe_qp *qp, const struct ib_send_wr *ibwr)
 
        full = queue_full(sq->queue, QUEUE_TYPE_FROM_ULP);
        if (unlikely(full)) {
-               rxe_err_qp(qp, "send queue full");
+               rxe_err_qp(qp, "send queue full\n");
                return -ENOMEM;
        }
 
@@ -922,14 +922,14 @@ static int rxe_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
        /* caller has already called destroy_qp */
        if (WARN_ON_ONCE(!qp->valid)) {
                spin_unlock_irqrestore(&qp->state_lock, flags);
-               rxe_err_qp(qp, "qp has been destroyed");
+               rxe_err_qp(qp, "qp has been destroyed\n");
                return -EINVAL;
        }
 
        if (unlikely(qp_state(qp) < IB_QPS_RTS)) {
                spin_unlock_irqrestore(&qp->state_lock, flags);
                *bad_wr = wr;
-               rxe_err_qp(qp, "qp not ready to send");
+               rxe_err_qp(qp, "qp not ready to send\n");
                return -EINVAL;
        }
        spin_unlock_irqrestore(&qp->state_lock, flags);
@@ -959,13 +959,13 @@ static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr)
        full = queue_full(rq->queue, QUEUE_TYPE_FROM_ULP);
        if (unlikely(full)) {
                err = -ENOMEM;
-               rxe_dbg("queue full");
+               rxe_dbg("queue full\n");
                goto err_out;
        }
 
        if (unlikely(num_sge > rq->max_sge)) {
                err = -EINVAL;
-               rxe_dbg("bad num_sge > max_sge");
+               rxe_dbg("bad num_sge > max_sge\n");
                goto err_out;
        }
 
@@ -976,7 +976,7 @@ static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr)
        /* IBA max message size is 2^31 */
        if (length >= (1UL<<31)) {
                err = -EINVAL;
-               rxe_dbg("message length too long");
+               rxe_dbg("message length too long\n");
                goto err_out;
        }
 
@@ -996,7 +996,7 @@ static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr)
        return 0;
 
 err_out:
-       rxe_dbg("returned err = %d", err);
+       rxe_dbg("returned err = %d\n", err);
        return err;
 }
 
@@ -1012,7 +1012,7 @@ static int rxe_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
        /* caller has already called destroy_qp */
        if (WARN_ON_ONCE(!qp->valid)) {
                spin_unlock_irqrestore(&qp->state_lock, flags);
-               rxe_err_qp(qp, "qp has been destroyed");
+               rxe_err_qp(qp, "qp has been destroyed\n");
                return -EINVAL;
        }
 
@@ -1020,14 +1020,14 @@ static int rxe_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
        if (unlikely((qp_state(qp) < IB_QPS_INIT))) {
                spin_unlock_irqrestore(&qp->state_lock, flags);
                *bad_wr = wr;
-               rxe_dbg_qp(qp, "qp not ready to post recv");
+               rxe_dbg_qp(qp, "qp not ready to post recv\n");
                return -EINVAL;
        }
        spin_unlock_irqrestore(&qp->state_lock, flags);
 
        if (unlikely(qp->srq)) {
                *bad_wr = wr;
-               rxe_dbg_qp(qp, "qp has srq, use post_srq_recv instead");
+               rxe_dbg_qp(qp, "qp has srq, use post_srq_recv instead\n");
                return -EINVAL;
        }
 
@@ -1065,7 +1065,7 @@ static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
        if (udata) {
                if (udata->outlen < sizeof(*uresp)) {
                        err = -EINVAL;
-                       rxe_dbg_dev(rxe, "malformed udata, err = %d", err);
+                       rxe_dbg_dev(rxe, "malformed udata, err = %d\n", err);
                        goto err_out;
                }
                uresp = udata->outbuf;
@@ -1073,26 +1073,26 @@ static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
 
        if (attr->flags) {
                err = -EOPNOTSUPP;
-               rxe_dbg_dev(rxe, "bad attr->flags, err = %d", err);
+               rxe_dbg_dev(rxe, "bad attr->flags, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_cq_chk_attr(rxe, NULL, attr->cqe, attr->comp_vector);
        if (err) {
-               rxe_dbg_dev(rxe, "bad init attributes, err = %d", err);
+               rxe_dbg_dev(rxe, "bad init attributes, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_add_to_pool(&rxe->cq_pool, cq);
        if (err) {
-               rxe_dbg_dev(rxe, "unable to create cq, err = %d", err);
+               rxe_dbg_dev(rxe, "unable to create cq, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_cq_from_init(rxe, cq, attr->cqe, attr->comp_vector, udata,
                               uresp);
        if (err) {
-               rxe_dbg_cq(cq, "create cq failed, err = %d", err);
+               rxe_dbg_cq(cq, "create cq failed, err = %d\n", err);
                goto err_cleanup;
        }
 
@@ -1101,9 +1101,9 @@ static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
 err_cleanup:
        cleanup_err = rxe_cleanup(cq);
        if (cleanup_err)
-               rxe_err_cq(cq, "cleanup failed, err = %d", cleanup_err);
+               rxe_err_cq(cq, "cleanup failed, err = %d\n", cleanup_err);
 err_out:
-       rxe_err_dev(rxe, "returned err = %d", err);
+       rxe_err_dev(rxe, "returned err = %d\n", err);
        return err;
 }
 
@@ -1117,7 +1117,7 @@ static int rxe_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
        if (udata) {
                if (udata->outlen < sizeof(*uresp)) {
                        err = -EINVAL;
-                       rxe_dbg_cq(cq, "malformed udata");
+                       rxe_dbg_cq(cq, "malformed udata\n");
                        goto err_out;
                }
                uresp = udata->outbuf;
@@ -1125,20 +1125,20 @@ static int rxe_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 
        err = rxe_cq_chk_attr(rxe, cq, cqe, 0);
        if (err) {
-               rxe_dbg_cq(cq, "bad attr, err = %d", err);
+               rxe_dbg_cq(cq, "bad attr, err = %d\n", err);
                goto err_out;
        }
 
        err = rxe_cq_resize_queue(cq, cqe, uresp, udata);
        if (err) {
-               rxe_dbg_cq(cq, "resize cq failed, err = %d", err);
+               rxe_dbg_cq(cq, "resize cq failed, err = %d\n", err);
                goto err_out;
        }
 
        return 0;
 
 err_out:
-       rxe_err_cq(cq, "returned err = %d", err);
+       rxe_err_cq(cq, "returned err = %d\n", err);
        return err;
 }
 
@@ -1202,18 +1202,18 @@ static int rxe_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
         */
        if (atomic_read(&cq->num_wq)) {
                err = -EINVAL;
-               rxe_dbg_cq(cq, "still in use");
+               rxe_dbg_cq(cq, "still in use\n");
                goto err_out;
        }
 
        err = rxe_cleanup(cq);
        if (err)
-               rxe_err_cq(cq, "cleanup failed, err = %d", err);
+               rxe_err_cq(cq, "cleanup failed, err = %d\n", err);
 
        return 0;
 
 err_out:
-       rxe_err_cq(cq, "returned err = %d", err);
+       rxe_err_cq(cq, "returned err = %d\n", err);
        return err;
 }
 
@@ -1231,7 +1231,7 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
 
        err = rxe_add_to_pool(&rxe->mr_pool, mr);
        if (err) {
-               rxe_dbg_dev(rxe, "unable to create mr");
+               rxe_dbg_dev(rxe, "unable to create mr\n");
                goto err_free;
        }
 
@@ -1245,7 +1245,7 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
 
 err_free:
        kfree(mr);
-       rxe_err_pd(pd, "returned err = %d", err);
+       rxe_err_pd(pd, "returned err = %d\n", err);
        return ERR_PTR(err);
 }
 
@@ -1259,7 +1259,7 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, u64 start,
        int err, cleanup_err;
 
        if (access & ~RXE_ACCESS_SUPPORTED_MR) {
-               rxe_err_pd(pd, "access = %#x not supported (%#x)", access,
+               rxe_err_pd(pd, "access = %#x not supported (%#x)\n", access,
                                RXE_ACCESS_SUPPORTED_MR);
                return ERR_PTR(-EOPNOTSUPP);
        }
@@ -1270,7 +1270,7 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, u64 start,
 
        err = rxe_add_to_pool(&rxe->mr_pool, mr);
        if (err) {
-               rxe_dbg_pd(pd, "unable to create mr");
+               rxe_dbg_pd(pd, "unable to create mr\n");
                goto err_free;
        }
 
@@ -1278,9 +1278,9 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, u64 start,
        mr->ibmr.pd = ibpd;
        mr->ibmr.device = ibpd->device;
 
-       err = rxe_mr_init_user(rxe, start, length, iova, access, mr);
+       err = rxe_mr_init_user(rxe, start, length, access, mr);
        if (err) {
-               rxe_dbg_mr(mr, "reg_user_mr failed, err = %d", err);
+               rxe_dbg_mr(mr, "reg_user_mr failed, err = %d\n", err);
                goto err_cleanup;
        }
 
@@ -1290,10 +1290,10 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, u64 start,
 err_cleanup:
        cleanup_err = rxe_cleanup(mr);
        if (cleanup_err)
-               rxe_err_mr(mr, "cleanup failed, err = %d", cleanup_err);
+               rxe_err_mr(mr, "cleanup failed, err = %d\n", cleanup_err);
 err_free:
        kfree(mr);
-       rxe_err_pd(pd, "returned err = %d", err);
+       rxe_err_pd(pd, "returned err = %d\n", err);
        return ERR_PTR(err);
 }
 
@@ -1310,7 +1310,7 @@ static struct ib_mr *rxe_rereg_user_mr(struct ib_mr *ibmr, int flags,
         * rereg_pd and rereg_access
         */
        if (flags & ~RXE_MR_REREG_SUPPORTED) {
-               rxe_err_mr(mr, "flags = %#x not supported", flags);
+               rxe_err_mr(mr, "flags = %#x not supported\n", flags);
                return ERR_PTR(-EOPNOTSUPP);
        }
 
@@ -1322,7 +1322,7 @@ static struct ib_mr *rxe_rereg_user_mr(struct ib_mr *ibmr, int flags,
 
        if (flags & IB_MR_REREG_ACCESS) {
                if (access & ~RXE_ACCESS_SUPPORTED_MR) {
-                       rxe_err_mr(mr, "access = %#x not supported", access);
+                       rxe_err_mr(mr, "access = %#x not supported\n", access);
                        return ERR_PTR(-EOPNOTSUPP);
                }
                mr->access = access;
@@ -1341,7 +1341,7 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 
        if (mr_type != IB_MR_TYPE_MEM_REG) {
                err = -EINVAL;
-               rxe_dbg_pd(pd, "mr type %d not supported, err = %d",
+               rxe_dbg_pd(pd, "mr type %d not supported, err = %d\n",
                           mr_type, err);
                goto err_out;
        }
@@ -1360,7 +1360,7 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 
        err = rxe_mr_init_fast(max_num_sg, mr);
        if (err) {
-               rxe_dbg_mr(mr, "alloc_mr failed, err = %d", err);
+               rxe_dbg_mr(mr, "alloc_mr failed, err = %d\n", err);
                goto err_cleanup;
        }
 
@@ -1370,11 +1370,11 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 err_cleanup:
        cleanup_err = rxe_cleanup(mr);
        if (cleanup_err)
-               rxe_err_mr(mr, "cleanup failed, err = %d", err);
+               rxe_err_mr(mr, "cleanup failed, err = %d\n", err);
 err_free:
        kfree(mr);
 err_out:
-       rxe_err_pd(pd, "returned err = %d", err);
+       rxe_err_pd(pd, "returned err = %d\n", err);
        return ERR_PTR(err);
 }
 
@@ -1386,19 +1386,19 @@ static int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
        /* See IBA 10.6.7.2.6 */
        if (atomic_read(&mr->num_mw) > 0) {
                err = -EINVAL;
-               rxe_dbg_mr(mr, "mr has mw's bound");
+               rxe_dbg_mr(mr, "mr has mw's bound\n");
                goto err_out;
        }
 
        cleanup_err = rxe_cleanup(mr);
        if (cleanup_err)
-               rxe_err_mr(mr, "cleanup failed, err = %d", cleanup_err);
+               rxe_err_mr(mr, "cleanup failed, err = %d\n", cleanup_err);
 
        kfree_rcu_mightsleep(mr);
        return 0;
 
 err_out:
-       rxe_err_mr(mr, "returned err = %d", err);
+       rxe_err_mr(mr, "returned err = %d\n", err);
        return err;
 }
 
index 319d4288edddeaca2fb273fa7e1b211ed8619beb..8a4ab9ff0a68109e9a761b573259aa02b7c46b03 100644 (file)
@@ -287,8 +287,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
 
        ah = ipoib_create_ah(dev, priv->pd, &av);
        if (IS_ERR(ah)) {
-               ipoib_warn(priv, "ib_address_create failed %ld\n",
-                          -PTR_ERR(ah));
+               ipoib_warn(priv, "ib_address_create failed %pe\n", ah);
                /* use original error */
                return PTR_ERR(ah);
        }
index d3c436ead69461a9965afd7590f3551dba2c624d..4aa80c9388f058b745fca05b86f532d6a2b3339a 100644 (file)
@@ -133,7 +133,7 @@ static ssize_t mpath_policy_store(struct device *dev,
 
        /* distinguish "mi" and "min-latency" with length */
        len = strnlen(buf, NAME_MAX);
-       if (buf[len - 1] == '\n')
+       if (len && buf[len - 1] == '\n')
                len--;
 
        if (!strncasecmp(buf, "round-robin", 11) ||
index 040234c01be4d5a0cc6fb4a4124af4752f58e181..9632afbd727b64b0ddf0072ab8ce692588ad9803 100644 (file)
@@ -3209,7 +3209,6 @@ static int srpt_add_one(struct ib_device *device)
 
        INIT_IB_EVENT_HANDLER(&sdev->event_handler, sdev->device,
                              srpt_event_handler);
-       ib_register_event_handler(&sdev->event_handler);
 
        for (i = 1; i <= sdev->device->phys_port_cnt; i++) {
                sport = &sdev->port[i - 1];
@@ -3232,6 +3231,7 @@ static int srpt_add_one(struct ib_device *device)
                }
        }
 
+       ib_register_event_handler(&sdev->event_handler);
        spin_lock(&srpt_dev_lock);
        list_add_tail(&sdev->list, &srpt_dev_list);
        spin_unlock(&srpt_dev_lock);
@@ -3242,7 +3242,6 @@ static int srpt_add_one(struct ib_device *device)
 
 err_port:
        srpt_unregister_mad_agent(sdev, i);
-       ib_unregister_event_handler(&sdev->event_handler);
 err_cm:
        if (sdev->cm_id)
                ib_destroy_cm_id(sdev->cm_id);
index b7b6b58dd3486d98e5d641149b69dcf13e694292..477bf9dd5e714473bb8d896e384e2806cb8baf80 100644 (file)
@@ -1910,8 +1910,6 @@ struct ib_flow_eth_filter {
        u8      src_mac[6];
        __be16  ether_type;
        __be16  vlan_tag;
-       /* Must be last */
-       u8      real_sz[];
 };
 
 struct ib_flow_spec_eth {
@@ -1924,8 +1922,6 @@ struct ib_flow_spec_eth {
 struct ib_flow_ib_filter {
        __be16 dlid;
        __u8   sl;
-       /* Must be last */
-       u8      real_sz[];
 };
 
 struct ib_flow_spec_ib {
@@ -1949,8 +1945,6 @@ struct ib_flow_ipv4_filter {
        u8      tos;
        u8      ttl;
        u8      flags;
-       /* Must be last */
-       u8      real_sz[];
 };
 
 struct ib_flow_spec_ipv4 {
@@ -1967,9 +1961,7 @@ struct ib_flow_ipv6_filter {
        u8      next_hdr;
        u8      traffic_class;
        u8      hop_limit;
-       /* Must be last */
-       u8      real_sz[];
-};
+} __packed;
 
 struct ib_flow_spec_ipv6 {
        u32                        type;
@@ -1981,8 +1973,6 @@ struct ib_flow_spec_ipv6 {
 struct ib_flow_tcp_udp_filter {
        __be16  dst_port;
        __be16  src_port;
-       /* Must be last */
-       u8      real_sz[];
 };
 
 struct ib_flow_spec_tcp_udp {
@@ -1994,7 +1984,6 @@ struct ib_flow_spec_tcp_udp {
 
 struct ib_flow_tunnel_filter {
        __be32  tunnel_id;
-       u8      real_sz[];
 };
 
 /* ib_flow_spec_tunnel describes the Vxlan tunnel
@@ -2010,8 +1999,6 @@ struct ib_flow_spec_tunnel {
 struct ib_flow_esp_filter {
        __be32  spi;
        __be32  seq;
-       /* Must be last */
-       u8      real_sz[];
 };
 
 struct ib_flow_spec_esp {
@@ -2025,8 +2012,6 @@ struct ib_flow_gre_filter {
        __be16 c_ks_res0_ver;
        __be16 protocol;
        __be32 key;
-       /* Must be last */
-       u8      real_sz[];
 };
 
 struct ib_flow_spec_gre {
@@ -2038,8 +2023,6 @@ struct ib_flow_spec_gre {
 
 struct ib_flow_mpls_filter {
        __be32 tag;
-       /* Must be last */
-       u8      real_sz[];
 };
 
 struct ib_flow_spec_mpls {
index 06287de69cd29855b109a441cb0927e3ed24f102..e6c0de227fad3d0587b486076713bd5f9b2f1d3f 100644 (file)
@@ -629,12 +629,14 @@ struct uverbs_attr {
 };
 
 struct uverbs_attr_bundle {
-       struct ib_udata driver_udata;
-       struct ib_udata ucore;
-       struct ib_uverbs_file *ufile;
-       struct ib_ucontext *context;
-       struct ib_uobject *uobject;
-       DECLARE_BITMAP(attr_present, UVERBS_API_ATTR_BKEY_LEN);
+       struct_group_tagged(uverbs_attr_bundle_hdr, hdr,
+               struct ib_udata driver_udata;
+               struct ib_udata ucore;
+               struct ib_uverbs_file *ufile;
+               struct ib_ucontext *context;
+               struct ib_uobject *uobject;
+               DECLARE_BITMAP(attr_present, UVERBS_API_ATTR_BKEY_LEN);
+       );
        struct uverbs_attr attrs[];
 };
 
index c996e151081eb845b42734df878d1216d4418db8..158670da2b2a56d6217cb8f3022fecd3a1acaf38 100644 (file)
@@ -73,6 +73,17 @@ struct hns_roce_ib_create_srq_resp {
        __u32   cap_flags; /* Use enum hns_roce_srq_cap_flags */
 };
 
+enum hns_roce_congest_type_flags {
+       HNS_ROCE_CREATE_QP_FLAGS_DCQCN,
+       HNS_ROCE_CREATE_QP_FLAGS_LDCP,
+       HNS_ROCE_CREATE_QP_FLAGS_HC3,
+       HNS_ROCE_CREATE_QP_FLAGS_DIP,
+};
+
+enum hns_roce_create_qp_comp_mask {
+       HNS_ROCE_CREATE_QP_MASK_CONGEST_TYPE = 1 << 0,
+};
+
 struct hns_roce_ib_create_qp {
        __aligned_u64 buf_addr;
        __aligned_u64 db_addr;
@@ -81,6 +92,9 @@ struct hns_roce_ib_create_qp {
        __u8    sq_no_prefetch;
        __u8    reserved[5];
        __aligned_u64 sdb_addr;
+       __aligned_u64 comp_mask; /* Use enum hns_roce_create_qp_comp_mask */
+       __aligned_u64 create_flags;
+       __aligned_u64 cong_type_flags;
 };
 
 enum hns_roce_qp_cap_flags {
@@ -114,6 +128,8 @@ struct hns_roce_ib_alloc_ucontext_resp {
        __u32   reserved;
        __u32   config;
        __u32   max_inline_data;
+       __u8    congest_type;
+       __u8    reserved0[7];
 };
 
 struct hns_roce_ib_alloc_ucontext {