|
@@ -2681,20 +2681,22 @@ static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init)
|
|
kfree(dm[i]);
|
|
kfree(dm[i]);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
- }
|
|
|
|
- /* initialize or tear down tunnel QPs for the slave */
|
|
|
|
- for (i = 0; i < ports; i++) {
|
|
|
|
INIT_WORK(&dm[i]->work, mlx4_ib_tunnels_update_work);
|
|
INIT_WORK(&dm[i]->work, mlx4_ib_tunnels_update_work);
|
|
dm[i]->port = first_port + i + 1;
|
|
dm[i]->port = first_port + i + 1;
|
|
dm[i]->slave = slave;
|
|
dm[i]->slave = slave;
|
|
dm[i]->do_init = do_init;
|
|
dm[i]->do_init = do_init;
|
|
dm[i]->dev = ibdev;
|
|
dm[i]->dev = ibdev;
|
|
- spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags);
|
|
|
|
- if (!ibdev->sriov.is_going_down)
|
|
|
|
|
|
+ }
|
|
|
|
+ /* initialize or tear down tunnel QPs for the slave */
|
|
|
|
+ spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags);
|
|
|
|
+ if (!ibdev->sriov.is_going_down) {
|
|
|
|
+ for (i = 0; i < ports; i++)
|
|
queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work);
|
|
queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work);
|
|
- else
|
|
|
|
- kfree(dm[i]);
|
|
|
|
spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags);
|
|
spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags);
|
|
|
|
+ } else {
|
|
|
|
+ spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags);
|
|
|
|
+ for (i = 0; i < ports; i++)
|
|
|
|
+ kfree(dm[i]);
|
|
}
|
|
}
|
|
out:
|
|
out:
|
|
kfree(dm);
|
|
kfree(dm);
|