aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMoni Shoua <monis@mellanox.com>2014-08-21 07:28:42 -0400
committerRoland Dreier <roland@purestorage.com>2014-09-22 12:46:52 -0400
commit4bf9715f184969dc703bde7be94919995024a6a9 (patch)
tree6845226145b3df4638f3e52834d1e57fc3d725d4
parentdba3ad2addcd74ec850e510f3b8a9d046cc24ef3 (diff)
IB/mlx4: Avoid executing gid task when device is being removed
When device is being removed (e.g during VPI port link type change from ETH to IB), tasks for gid table changes should not be executed. Flush the current queue of tasks and block further tasks from entering the queue. Signed-off-by: Moni Shoua <monis@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/mlx4/main.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index c231112396b2..c61bcee9ee8a 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -1390,6 +1390,9 @@ static void update_gids_task(struct work_struct *work)
1390 int err; 1390 int err;
1391 struct mlx4_dev *dev = gw->dev->dev; 1391 struct mlx4_dev *dev = gw->dev->dev;
1392 1392
1393 if (!gw->dev->ib_active)
1394 return;
1395
1393 mailbox = mlx4_alloc_cmd_mailbox(dev); 1396 mailbox = mlx4_alloc_cmd_mailbox(dev);
1394 if (IS_ERR(mailbox)) { 1397 if (IS_ERR(mailbox)) {
1395 pr_warn("update gid table failed %ld\n", PTR_ERR(mailbox)); 1398 pr_warn("update gid table failed %ld\n", PTR_ERR(mailbox));
@@ -1420,6 +1423,9 @@ static void reset_gids_task(struct work_struct *work)
1420 int err; 1423 int err;
1421 struct mlx4_dev *dev = gw->dev->dev; 1424 struct mlx4_dev *dev = gw->dev->dev;
1422 1425
1426 if (!gw->dev->ib_active)
1427 return;
1428
1423 mailbox = mlx4_alloc_cmd_mailbox(dev); 1429 mailbox = mlx4_alloc_cmd_mailbox(dev);
1424 if (IS_ERR(mailbox)) { 1430 if (IS_ERR(mailbox)) {
1425 pr_warn("reset gid table failed\n"); 1431 pr_warn("reset gid table failed\n");
@@ -2369,6 +2375,9 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)
2369 struct mlx4_ib_dev *ibdev = ibdev_ptr; 2375 struct mlx4_ib_dev *ibdev = ibdev_ptr;
2370 int p; 2376 int p;
2371 2377
2378 ibdev->ib_active = false;
2379 flush_workqueue(wq);
2380
2372 mlx4_ib_close_sriov(ibdev); 2381 mlx4_ib_close_sriov(ibdev);
2373 mlx4_ib_mad_cleanup(ibdev); 2382 mlx4_ib_mad_cleanup(ibdev);
2374 ib_unregister_device(&ibdev->ib_dev); 2383 ib_unregister_device(&ibdev->ib_dev);