RDMA/mlx5: Initialize SRQ tables on mlx5_ib
authorLeon Romanovsky <leonro@mellanox.com>
Wed, 28 Nov 2018 18:53:41 +0000 (20:53 +0200)
committerLeon Romanovsky <leonro@mellanox.com>
Tue, 4 Dec 2018 07:25:50 +0000 (09:25 +0200)
Transfer initialization and cleanup from mlx5_priv struct of
mlx5_core_dev to be part of mlx5_ib_dev. This completes removal
of SRQ from mlx5_core.

Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
drivers/infiniband/hw/mlx5/ib_rep.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/srq.c
drivers/infiniband/hw/mlx5/srq.h
drivers/infiniband/hw/mlx5/srq_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/Makefile
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/mellanox/mlx5/core/srq.c [deleted file]
include/linux/mlx5/driver.h
include/linux/mlx5/srq.h [deleted file]

index 584ff2ea7810465a1fb5971bfb8a517d1dcd013c..8a682d86d63471d2af4dbfefbf14c5b5c2333ac8 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include "ib_rep.h"
+#include "srq.h"
 
 static const struct mlx5_ib_profile rep_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_INIT,
@@ -21,6 +22,9 @@ static const struct mlx5_ib_profile rep_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_ROCE,
                     mlx5_ib_stage_rep_roce_init,
                     mlx5_ib_stage_rep_roce_cleanup),
+       STAGE_CREATE(MLX5_IB_STAGE_SRQ,
+                    mlx5_init_srq_table,
+                    mlx5_cleanup_srq_table),
        STAGE_CREATE(MLX5_IB_STAGE_DEVICE_RESOURCES,
                     mlx5_ib_stage_dev_res_init,
                     mlx5_ib_stage_dev_res_cleanup),
index 56472fa3e18bfc5a28a428e89f438d5cbdac2382..96515a8c9d2cb0f7b4b67311ddec34aa106182e0 100644 (file)
@@ -60,6 +60,7 @@
 #include "mlx5_ib.h"
 #include "ib_rep.h"
 #include "cmd.h"
+#include "srq.h"
 #include <linux/mlx5/fs_helpers.h>
 #include <linux/mlx5/accel.h>
 #include <rdma/uverbs_std_types.h>
@@ -6308,6 +6309,9 @@ static const struct mlx5_ib_profile pf_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_ROCE,
                     mlx5_ib_stage_roce_init,
                     mlx5_ib_stage_roce_cleanup),
+       STAGE_CREATE(MLX5_IB_STAGE_SRQ,
+                    mlx5_init_srq_table,
+                    mlx5_cleanup_srq_table),
        STAGE_CREATE(MLX5_IB_STAGE_DEVICE_RESOURCES,
                     mlx5_ib_stage_dev_res_init,
                     mlx5_ib_stage_dev_res_cleanup),
@@ -6365,6 +6369,9 @@ static const struct mlx5_ib_profile nic_rep_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_ROCE,
                     mlx5_ib_stage_rep_roce_init,
                     mlx5_ib_stage_rep_roce_cleanup),
+       STAGE_CREATE(MLX5_IB_STAGE_SRQ,
+                    mlx5_init_srq_table,
+                    mlx5_cleanup_srq_table),
        STAGE_CREATE(MLX5_IB_STAGE_DEVICE_RESOURCES,
                     mlx5_ib_stage_dev_res_init,
                     mlx5_ib_stage_dev_res_cleanup),
index 332d5c4d8ab3feced8d3209e4ba4645b304b8979..861b68f2e33085da501fe2ed0ddc6253e3286b2a 100644 (file)
@@ -41,7 +41,6 @@
 #include <linux/mlx5/cq.h>
 #include <linux/mlx5/fs.h>
 #include <linux/mlx5/qp.h>
-#include <linux/mlx5/srq.h>
 #include <linux/mlx5/fs.h>
 #include <linux/types.h>
 #include <linux/mlx5/transobj.h>
@@ -50,6 +49,8 @@
 #include <rdma/uverbs_ioctl.h>
 #include <rdma/mlx5_user_ioctl_cmds.h>
 
+#include "srq.h"
+
 #define mlx5_ib_dbg(_dev, format, arg...)                                      \
        dev_dbg(&(_dev)->ib_dev.dev, "%s:%d:(pid %d): " format, __func__,      \
                __LINE__, current->pid, ##arg)
@@ -774,6 +775,7 @@ enum mlx5_ib_stages {
        MLX5_IB_STAGE_CAPS,
        MLX5_IB_STAGE_NON_DEFAULT_CB,
        MLX5_IB_STAGE_ROCE,
+       MLX5_IB_STAGE_SRQ,
        MLX5_IB_STAGE_DEVICE_RESOURCES,
        MLX5_IB_STAGE_DEVICE_NOTIFIER,
        MLX5_IB_STAGE_ODP,
@@ -942,6 +944,7 @@ struct mlx5_ib_dev {
        u64                     sys_image_guid;
        struct mlx5_memic       memic;
        u16                     devx_whitelist_uid;
+       struct mlx5_srq_table   srq_table;
 };
 
 static inline struct mlx5_ib_cq *to_mibcq(struct mlx5_core_cq *mcq)
index 2b184c7f531a8893de6719bbb6c094149bbcd407..91dcd3918d96f70c6ea83635bad333eec85f5d00 100644 (file)
@@ -5,7 +5,6 @@
 
 #include <linux/module.h>
 #include <linux/mlx5/qp.h>
-#include <linux/mlx5/srq.h>
 #include <linux/slab.h>
 #include <rdma/ib_umem.h>
 #include <rdma/ib_user_verbs.h>
index 1110aeaa775e16f4ed3c1027226c14f5f003822c..75eb5839ae95e886bb871408ff8379f88335e19c 100644 (file)
@@ -37,6 +37,28 @@ struct mlx5_srq_attr {
 
 struct mlx5_ib_dev;
 
+struct mlx5_core_srq {
+       struct mlx5_core_rsc_common common; /* must be first */
+       u32 srqn;
+       int max;
+       size_t max_gs;
+       size_t max_avail_gather;
+       int wqe_shift;
+       void (*event)(struct mlx5_core_srq *srq, enum mlx5_event e);
+
+       atomic_t refcount;
+       struct completion free;
+       u16 uid;
+};
+
+struct mlx5_srq_table {
+       struct notifier_block nb;
+       /* protect radix tree
+        */
+       spinlock_t lock;
+       struct radix_tree_root tree;
+};
+
 int mlx5_cmd_create_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                        struct mlx5_srq_attr *in);
 int mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq);
@@ -45,4 +67,7 @@ int mlx5_cmd_query_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
 int mlx5_cmd_arm_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                     u16 lwm, int is_srq);
 struct mlx5_core_srq *mlx5_cmd_get_srq(struct mlx5_ib_dev *dev, u32 srqn);
+
+int mlx5_init_srq_table(struct mlx5_ib_dev *dev);
+void mlx5_cleanup_srq_table(struct mlx5_ib_dev *dev);
 #endif /* MLX5_IB_SRQ_H */
index fdb9443f49f07433e171e463ee2c538df0350503..6be89c6be40f795c5c68b23fa97f997473b078b6 100644 (file)
@@ -80,12 +80,9 @@ static void get_srqc(void *srqc, struct mlx5_srq_attr *in)
 
 struct mlx5_core_srq *mlx5_cmd_get_srq(struct mlx5_ib_dev *dev, u32 srqn)
 {
-       struct mlx5_core_dev *mdev = dev->mdev;
-       struct mlx5_srq_table *table;
+       struct mlx5_srq_table *table = &dev->srq_table;
        struct mlx5_core_srq *srq;
 
-       table = &mdev->priv.srq_table;
-
        spin_lock(&table->lock);
 
        srq = radix_tree_lookup(&table->tree, srqn);
@@ -576,12 +573,9 @@ static int destroy_srq_split(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
 int mlx5_cmd_create_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                        struct mlx5_srq_attr *in)
 {
-       struct mlx5_core_dev *mdev = dev->mdev;
-       struct mlx5_srq_table *table;
+       struct mlx5_srq_table *table = &dev->srq_table;
        int err;
 
-       table = &mdev->priv.srq_table;
-
        switch (in->type) {
        case IB_SRQT_XRC:
                srq->common.res = MLX5_RES_XSRQ;
@@ -616,13 +610,10 @@ err_destroy_srq_split:
 
 int mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
 {
-       struct mlx5_core_dev *mdev = dev->mdev;
-       struct mlx5_srq_table *table;
+       struct mlx5_srq_table *table = &dev->srq_table;
        struct mlx5_core_srq *tmp;
        int err;
 
-       table = &mdev->priv.srq_table;
-
        spin_lock_irq(&table->lock);
        tmp = radix_tree_delete(&table->tree, srq->srqn);
        spin_unlock_irq(&table->lock);
@@ -669,3 +660,60 @@ int mlx5_cmd_arm_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                return arm_rmp_cmd(dev, srq, lwm);
        }
 }
+
+static int srq_event_notifier(struct notifier_block *nb,
+                             unsigned long type, void *data)
+{
+       struct mlx5_srq_table *table;
+       struct mlx5_core_srq *srq;
+       struct mlx5_eqe *eqe;
+       u32 srqn;
+
+       if (type != MLX5_EVENT_TYPE_SRQ_CATAS_ERROR &&
+           type != MLX5_EVENT_TYPE_SRQ_RQ_LIMIT)
+               return NOTIFY_DONE;
+
+       table = container_of(nb, struct mlx5_srq_table, nb);
+
+       eqe = data;
+       srqn = be32_to_cpu(eqe->data.qp_srq.qp_srq_n) & 0xffffff;
+
+       spin_lock(&table->lock);
+
+       srq = radix_tree_lookup(&table->tree, srqn);
+       if (srq)
+               atomic_inc(&srq->refcount);
+
+       spin_unlock(&table->lock);
+
+       if (!srq)
+               return NOTIFY_OK;
+
+       srq->event(srq, eqe->type);
+
+       if (atomic_dec_and_test(&srq->refcount))
+               complete(&srq->free);
+
+       return NOTIFY_OK;
+}
+
+int mlx5_init_srq_table(struct mlx5_ib_dev *dev)
+{
+       struct mlx5_srq_table *table = &dev->srq_table;
+
+       memset(table, 0, sizeof(*table));
+       spin_lock_init(&table->lock);
+       INIT_RADIX_TREE(&table->tree, GFP_ATOMIC);
+
+       table->nb.notifier_call = srq_event_notifier;
+       mlx5_notifier_register(dev->mdev, &table->nb);
+
+       return 0;
+}
+
+void mlx5_cleanup_srq_table(struct mlx5_ib_dev *dev)
+{
+       struct mlx5_srq_table *table = &dev->srq_table;
+
+       mlx5_notifier_unregister(dev->mdev, &table->nb);
+}
index 26afe0779a0c226f4d6f5eab710f2851faebb76e..d499b3d003480ecdbb74a5c5bf58f705cda22728 100644 (file)
@@ -12,7 +12,7 @@ obj-$(CONFIG_MLX5_CORE) += mlx5_core.o
 # mlx5 core basic
 #
 mlx5_core-y := main.o cmd.o debugfs.o fw.o eq.o uar.o pagealloc.o \
-               health.o mcg.o cq.o srq.o alloc.o qp.o port.o mr.o pd.o \
+               health.o mcg.o cq.o alloc.o qp.o port.o mr.o pd.o \
                mad.o transobj.o vport.o sriov.o fs_cmd.o fs_core.o \
                fs_counters.o rl.o lag.o dev.o events.o wq.o lib/gid.o \
                diag/fs_tracepoint.o diag/fw_tracer.o
index 4bc27a073dc4df35b2186ca1df2914ed1bda2caa..7789955738127c3d3382dbe64fc540ea14996f8f 100644 (file)
@@ -43,7 +43,6 @@
 #include <linux/mlx5/driver.h>
 #include <linux/mlx5/cq.h>
 #include <linux/mlx5/qp.h>
-#include <linux/mlx5/srq.h>
 #include <linux/debugfs.h>
 #include <linux/kmod.h>
 #include <linux/mlx5/mlx5_ifc.h>
@@ -749,8 +748,6 @@ static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
 
        mlx5_init_qp_table(dev);
 
-       mlx5_init_srq_table(dev);
-
        mlx5_init_mkey_table(dev);
 
        mlx5_init_reserved_gids(dev);
@@ -804,7 +801,6 @@ err_rl_cleanup:
 err_tables_cleanup:
        mlx5_vxlan_destroy(dev->vxlan);
        mlx5_cleanup_mkey_table(dev);
-       mlx5_cleanup_srq_table(dev);
        mlx5_cleanup_qp_table(dev);
        mlx5_cq_debugfs_cleanup(dev);
 err_events_cleanup:
@@ -828,7 +824,6 @@ static void mlx5_cleanup_once(struct mlx5_core_dev *dev)
        mlx5_cleanup_clock(dev);
        mlx5_cleanup_reserved_gids(dev);
        mlx5_cleanup_mkey_table(dev);
-       mlx5_cleanup_srq_table(dev);
        mlx5_cleanup_qp_table(dev);
        mlx5_cq_debugfs_cleanup(dev);
        mlx5_events_cleanup(dev);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/srq.c b/drivers/net/ethernet/mellanox/mlx5/core/srq.c
deleted file mode 100644 (file)
index 0e80ddb..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
-/*
- * Copyright (c) 2013-2018, Mellanox Technologies inc.  All rights reserved.
- */
-
-#include <linux/kernel.h>
-#include <linux/mlx5/driver.h>
-#include <linux/mlx5/srq.h>
-
-static int srq_event_notifier(struct notifier_block *nb,
-                             unsigned long type, void *data)
-{
-       struct mlx5_srq_table *table;
-       struct mlx5_core_srq *srq;
-       struct mlx5_eqe *eqe;
-       u32 srqn;
-
-       if (type != MLX5_EVENT_TYPE_SRQ_CATAS_ERROR &&
-           type != MLX5_EVENT_TYPE_SRQ_RQ_LIMIT)
-               return NOTIFY_DONE;
-
-       table = container_of(nb, struct mlx5_srq_table, nb);
-
-       eqe = data;
-       srqn = be32_to_cpu(eqe->data.qp_srq.qp_srq_n) & 0xffffff;
-
-       spin_lock(&table->lock);
-
-       srq = radix_tree_lookup(&table->tree, srqn);
-       if (srq)
-               atomic_inc(&srq->refcount);
-
-       spin_unlock(&table->lock);
-
-       if (!srq)
-               return NOTIFY_OK;
-
-       srq->event(srq, eqe->type);
-
-       if (atomic_dec_and_test(&srq->refcount))
-               complete(&srq->free);
-
-       return NOTIFY_OK;
-}
-
-void mlx5_init_srq_table(struct mlx5_core_dev *dev)
-{
-       struct mlx5_srq_table *table = &dev->priv.srq_table;
-
-       memset(table, 0, sizeof(*table));
-       spin_lock_init(&table->lock);
-       INIT_RADIX_TREE(&table->tree, GFP_ATOMIC);
-
-       table->nb.notifier_call = srq_event_notifier;
-       mlx5_notifier_register(dev, &table->nb);
-}
-
-void mlx5_cleanup_srq_table(struct mlx5_core_dev *dev)
-{
-       struct mlx5_srq_table *table = &dev->priv.srq_table;
-
-       mlx5_notifier_unregister(dev, &table->nb);
-}
index 1096da4fb368ea86152a54a72ecbf4815ccae512..584d8a5df7eb6855648dc34f166ef863f3ec112c 100644 (file)
@@ -50,7 +50,6 @@
 
 #include <linux/mlx5/device.h>
 #include <linux/mlx5/doorbell.h>
-#include <linux/mlx5/srq.h>
 #include <linux/mlx5/eq.h>
 #include <linux/timecounter.h>
 #include <linux/ptp_clock_kernel.h>
@@ -393,20 +392,6 @@ struct mlx5_core_rsc_common {
        struct completion       free;
 };
 
-struct mlx5_core_srq {
-       struct mlx5_core_rsc_common     common; /* must be first */
-       u32             srqn;
-       int             max;
-       size_t          max_gs;
-       size_t          max_avail_gather;
-       int             wqe_shift;
-       void (*event)   (struct mlx5_core_srq *, enum mlx5_event);
-
-       atomic_t                refcount;
-       struct completion       free;
-       u16             uid;
-};
-
 struct mlx5_uars_page {
        void __iomem           *map;
        bool                    wc;
@@ -464,14 +449,6 @@ struct mlx5_qp_table {
        struct radix_tree_root  tree;
 };
 
-struct mlx5_srq_table {
-       struct notifier_block   nb;
-       /* protect radix tree
-        */
-       spinlock_t              lock;
-       struct radix_tree_root  tree;
-};
-
 struct mlx5_mkey_table {
        /* protect radix tree
         */
@@ -547,8 +524,6 @@ struct mlx5_priv {
 
        struct mlx5_core_health health;
 
-       struct mlx5_srq_table   srq_table;
-
        /* start: qp staff */
        struct mlx5_qp_table    qp_table;
        struct dentry          *qp_debugfs;
diff --git a/include/linux/mlx5/srq.h b/include/linux/mlx5/srq.h
deleted file mode 100644 (file)
index 9343306..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
-/*
- * Copyright (c) 2013-2018, Mellanox Technologies. All rights reserved.
- */
-
-#ifndef MLX5_SRQ_H
-#define MLX5_SRQ_H
-
-struct mlx5_core_dev;
-
-void mlx5_init_srq_table(struct mlx5_core_dev *dev);
-void mlx5_cleanup_srq_table(struct mlx5_core_dev *dev);
-
-#endif /* MLX5_SRQ_H */