| From: Moni Shoua <monis@mellanox.com> |
| Date: Thu, 21 Aug 2014 14:28:42 +0300 |
| Subject: IB/mlx4: Avoid executing gid task when device is being removed |
| |
| commit 4bf9715f184969dc703bde7be94919995024a6a9 upstream. |
| |
| 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> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/infiniband/hw/mlx4/main.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/drivers/infiniband/hw/mlx4/main.c |
| +++ b/drivers/infiniband/hw/mlx4/main.c |
| @@ -1395,6 +1395,9 @@ static void update_gids_task(struct work |
| int err; |
| struct mlx4_dev *dev = gw->dev->dev; |
| |
| + if (!gw->dev->ib_active) |
| + return; |
| + |
| mailbox = mlx4_alloc_cmd_mailbox(dev); |
| if (IS_ERR(mailbox)) { |
| pr_warn("update gid table failed %ld\n", PTR_ERR(mailbox)); |
| @@ -1425,6 +1428,9 @@ static void reset_gids_task(struct work_ |
| int err; |
| struct mlx4_dev *dev = gw->dev->dev; |
| |
| + if (!gw->dev->ib_active) |
| + return; |
| + |
| mailbox = mlx4_alloc_cmd_mailbox(dev); |
| if (IS_ERR(mailbox)) { |
| pr_warn("reset gid table failed\n"); |
| @@ -2363,6 +2369,9 @@ static void mlx4_ib_remove(struct mlx4_d |
| struct mlx4_ib_dev *ibdev = ibdev_ptr; |
| int p; |
| |
| + ibdev->ib_active = false; |
| + flush_workqueue(wq); |
| + |
| mlx4_ib_close_sriov(ibdev); |
| mlx4_ib_mad_cleanup(ibdev); |
| ib_unregister_device(&ibdev->ib_dev); |