You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
6.4 KiB
207 lines
6.4 KiB
From 0f58f263b3f152104de15940709eca91b8a8f47a Mon Sep 17 00:00:00 2001
|
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
|
Date: Tue, 12 May 2020 10:53:39 -0400
|
|
Subject: [PATCH 133/312] [netdrv] net/mlx5: Use async EQ setup cleanup helpers
|
|
for multiple EQs
|
|
|
|
Message-id: <20200512105530.4207-14-ahleihel@redhat.com>
|
|
Patchwork-id: 306885
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.3 BZ 1789382 013/124] net/mlx5: Use async EQ setup cleanup helpers for multiple EQs
|
|
Bugzilla: 1789382
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1789382
|
|
Upstream: v5.6-rc1
|
|
|
|
commit 3ed879965cc4ea13fe0908468b653c4ff2cb1309
|
|
Author: Parav Pandit <parav@mellanox.com>
|
|
Date: Fri Dec 6 15:13:41 2019 -0600
|
|
|
|
net/mlx5: Use async EQ setup cleanup helpers for multiple EQs
|
|
|
|
Use helper routines to setup and teardown multiple EQs and reuse the
|
|
code in setup, cleanup and error unwinding flows.
|
|
|
|
Signed-off-by: Parav Pandit <parav@mellanox.com>
|
|
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
|
|
|
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
|
---
|
|
drivers/net/ethernet/mellanox/mlx5/core/eq.c | 114 ++++++++++++---------------
|
|
1 file changed, 49 insertions(+), 65 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
|
|
index 2c716abc0f27..cccea3a8eddd 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
|
|
@@ -564,6 +564,39 @@ static void gather_async_events_mask(struct mlx5_core_dev *dev, u64 mask[4])
|
|
gather_user_async_events(dev, mask);
|
|
}
|
|
|
|
+static int
|
|
+setup_async_eq(struct mlx5_core_dev *dev, struct mlx5_eq_async *eq,
|
|
+ struct mlx5_eq_param *param, const char *name)
|
|
+{
|
|
+ int err;
|
|
+
|
|
+ eq->irq_nb.notifier_call = mlx5_eq_async_int;
|
|
+
|
|
+ err = create_async_eq(dev, &eq->core, param);
|
|
+ if (err) {
|
|
+ mlx5_core_warn(dev, "failed to create %s EQ %d\n", name, err);
|
|
+ return err;
|
|
+ }
|
|
+ err = mlx5_eq_enable(dev, &eq->core, &eq->irq_nb);
|
|
+ if (err) {
|
|
+ mlx5_core_warn(dev, "failed to enable %s EQ %d\n", name, err);
|
|
+ destroy_async_eq(dev, &eq->core);
|
|
+ }
|
|
+ return err;
|
|
+}
|
|
+
|
|
+static void cleanup_async_eq(struct mlx5_core_dev *dev,
|
|
+ struct mlx5_eq_async *eq, const char *name)
|
|
+{
|
|
+ int err;
|
|
+
|
|
+ mlx5_eq_disable(dev, &eq->core, &eq->irq_nb);
|
|
+ err = destroy_async_eq(dev, &eq->core);
|
|
+ if (err)
|
|
+ mlx5_core_err(dev, "failed to destroy %s eq, err(%d)\n",
|
|
+ name, err);
|
|
+}
|
|
+
|
|
static int create_async_eqs(struct mlx5_core_dev *dev)
|
|
{
|
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
|
@@ -573,77 +606,45 @@ static int create_async_eqs(struct mlx5_core_dev *dev)
|
|
MLX5_NB_INIT(&table->cq_err_nb, cq_err_event_notifier, CQ_ERROR);
|
|
mlx5_eq_notifier_register(dev, &table->cq_err_nb);
|
|
|
|
- table->cmd_eq.irq_nb.notifier_call = mlx5_eq_async_int;
|
|
param = (struct mlx5_eq_param) {
|
|
.irq_index = 0,
|
|
.nent = MLX5_NUM_CMD_EQE,
|
|
+ .mask[0] = 1ull << MLX5_EVENT_TYPE_CMD,
|
|
};
|
|
-
|
|
- param.mask[0] = 1ull << MLX5_EVENT_TYPE_CMD;
|
|
- err = create_async_eq(dev, &table->cmd_eq.core, ¶m);
|
|
- if (err) {
|
|
- mlx5_core_warn(dev, "failed to create cmd EQ %d\n", err);
|
|
- goto err0;
|
|
- }
|
|
- err = mlx5_eq_enable(dev, &table->cmd_eq.core, &table->cmd_eq.irq_nb);
|
|
- if (err) {
|
|
- mlx5_core_warn(dev, "failed to enable cmd EQ %d\n", err);
|
|
+ err = setup_async_eq(dev, &table->cmd_eq, ¶m, "cmd");
|
|
+ if (err)
|
|
goto err1;
|
|
- }
|
|
+
|
|
mlx5_cmd_use_events(dev);
|
|
|
|
- table->async_eq.irq_nb.notifier_call = mlx5_eq_async_int;
|
|
param = (struct mlx5_eq_param) {
|
|
.irq_index = 0,
|
|
.nent = MLX5_NUM_ASYNC_EQE,
|
|
};
|
|
|
|
gather_async_events_mask(dev, param.mask);
|
|
- err = create_async_eq(dev, &table->async_eq.core, ¶m);
|
|
- if (err) {
|
|
- mlx5_core_warn(dev, "failed to create async EQ %d\n", err);
|
|
+ err = setup_async_eq(dev, &table->async_eq, ¶m, "async");
|
|
+ if (err)
|
|
goto err2;
|
|
- }
|
|
- err = mlx5_eq_enable(dev, &table->async_eq.core,
|
|
- &table->async_eq.irq_nb);
|
|
- if (err) {
|
|
- mlx5_core_warn(dev, "failed to enable async EQ %d\n", err);
|
|
- goto err3;
|
|
- }
|
|
|
|
- table->pages_eq.irq_nb.notifier_call = mlx5_eq_async_int;
|
|
param = (struct mlx5_eq_param) {
|
|
.irq_index = 0,
|
|
.nent = /* TODO: sriov max_vf + */ 1,
|
|
+ .mask[0] = 1ull << MLX5_EVENT_TYPE_PAGE_REQUEST,
|
|
};
|
|
|
|
- param.mask[0] = 1ull << MLX5_EVENT_TYPE_PAGE_REQUEST;
|
|
- err = create_async_eq(dev, &table->pages_eq.core, ¶m);
|
|
- if (err) {
|
|
- mlx5_core_warn(dev, "failed to create pages EQ %d\n", err);
|
|
- goto err4;
|
|
- }
|
|
- err = mlx5_eq_enable(dev, &table->pages_eq.core,
|
|
- &table->pages_eq.irq_nb);
|
|
- if (err) {
|
|
- mlx5_core_warn(dev, "failed to enable pages EQ %d\n", err);
|
|
- goto err5;
|
|
- }
|
|
+ err = setup_async_eq(dev, &table->pages_eq, ¶m, "pages");
|
|
+ if (err)
|
|
+ goto err3;
|
|
|
|
- return err;
|
|
+ return 0;
|
|
|
|
-err5:
|
|
- destroy_async_eq(dev, &table->pages_eq.core);
|
|
-err4:
|
|
- mlx5_eq_disable(dev, &table->async_eq.core, &table->async_eq.irq_nb);
|
|
err3:
|
|
- destroy_async_eq(dev, &table->async_eq.core);
|
|
+ cleanup_async_eq(dev, &table->async_eq, "async");
|
|
err2:
|
|
mlx5_cmd_use_polling(dev);
|
|
- mlx5_eq_disable(dev, &table->cmd_eq.core, &table->cmd_eq.irq_nb);
|
|
+ cleanup_async_eq(dev, &table->cmd_eq, "cmd");
|
|
err1:
|
|
- destroy_async_eq(dev, &table->cmd_eq.core);
|
|
-err0:
|
|
mlx5_eq_notifier_unregister(dev, &table->cq_err_nb);
|
|
return err;
|
|
}
|
|
@@ -651,28 +652,11 @@ static int create_async_eqs(struct mlx5_core_dev *dev)
|
|
static void destroy_async_eqs(struct mlx5_core_dev *dev)
|
|
{
|
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
|
- int err;
|
|
-
|
|
- mlx5_eq_disable(dev, &table->pages_eq.core, &table->pages_eq.irq_nb);
|
|
- err = destroy_async_eq(dev, &table->pages_eq.core);
|
|
- if (err)
|
|
- mlx5_core_err(dev, "failed to destroy pages eq, err(%d)\n",
|
|
- err);
|
|
-
|
|
- mlx5_eq_disable(dev, &table->async_eq.core, &table->async_eq.irq_nb);
|
|
- err = destroy_async_eq(dev, &table->async_eq.core);
|
|
- if (err)
|
|
- mlx5_core_err(dev, "failed to destroy async eq, err(%d)\n",
|
|
- err);
|
|
|
|
+ cleanup_async_eq(dev, &table->pages_eq, "pages");
|
|
+ cleanup_async_eq(dev, &table->async_eq, "async");
|
|
mlx5_cmd_use_polling(dev);
|
|
-
|
|
- mlx5_eq_disable(dev, &table->cmd_eq.core, &table->cmd_eq.irq_nb);
|
|
- err = destroy_async_eq(dev, &table->cmd_eq.core);
|
|
- if (err)
|
|
- mlx5_core_err(dev, "failed to destroy command eq, err(%d)\n",
|
|
- err);
|
|
-
|
|
+ cleanup_async_eq(dev, &table->cmd_eq, "cmd");
|
|
mlx5_eq_notifier_unregister(dev, &table->cq_err_nb);
|
|
}
|
|
|
|
--
|
|
2.13.6
|
|
|