aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSelvin Xavier <selvin.xavier@broadcom.com>2018-02-16 00:20:12 -0500
committerDoug Ledford <dledford@redhat.com>2018-02-20 11:57:21 -0500
commitdcdaba08062b4726500b9456f8664bfda896c664 (patch)
tree77bdeb1e050fdc1a6e54a2bc765838336c3a5df2
parent3b921e3bc4c20af58a663ed238ad57e87493dde2 (diff)
RDMA/bnxt_re: Fix system crash during load/unload
During driver unload, the driver proceeds with cleanup without waiting for the scheduled events. So the device pointers get freed up and driver crashes when the events are scheduled later. Flush the bnxt_re_task work queue before starting device removal. Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/bnxt_re/main.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index 508d00a5a106..7f9298db507b 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -1578,6 +1578,11 @@ static void __exit bnxt_re_mod_exit(void)
1578 */ 1578 */
1579 list_for_each_entry_safe_reverse(rdev, next, &to_be_deleted, list) { 1579 list_for_each_entry_safe_reverse(rdev, next, &to_be_deleted, list) {
1580 dev_info(rdev_to_dev(rdev), "Unregistering Device"); 1580 dev_info(rdev_to_dev(rdev), "Unregistering Device");
1581 /*
1582 * Flush out any scheduled tasks before destroying the
1583 * resources
1584 */
1585 flush_workqueue(bnxt_re_wq);
1581 bnxt_re_dev_stop(rdev); 1586 bnxt_re_dev_stop(rdev);
1582 bnxt_re_ib_unreg(rdev, true); 1587 bnxt_re_ib_unreg(rdev, true);
1583 bnxt_re_remove_one(rdev); 1588 bnxt_re_remove_one(rdev);