RDMA/bnxt_re: Fix lifetimes in bnxt_re_task
authorJason Gunthorpe <jgg@mellanox.com>
Fri, 13 Mar 2020 16:33:26 +0000 (09:33 -0700)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 17 Mar 2020 23:15:03 +0000 (20:15 -0300)
A work queue cannot just rely on the ib_device not being freed, it must
hold a kref on the memory so that the BNXT_RE_FLAG_IBDEV_REGISTERED check
works.

Fixes: 1ac5a4047975 ("RDMA/bnxt_re: Add bnxt_re RoCE driver")
Link: https://lore.kernel.org/r/1584117207-2664-3-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/bnxt_re/main.c

index 885127c..c494e11 100644 (file)
@@ -1670,6 +1670,7 @@ static void bnxt_re_task(struct work_struct *work)
        smp_mb__before_atomic();
        atomic_dec(&rdev->sched_count);
 exit:
+       put_device(&rdev->ibdev.dev);
        kfree(re_work);
 }
 
@@ -1735,6 +1736,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier,
                /* Allocate for the deferred task */
                re_work = kzalloc(sizeof(*re_work), GFP_ATOMIC);
                if (re_work) {
+                       get_device(&rdev->ibdev.dev);
                        re_work->rdev = rdev;
                        re_work->event = event;
                        re_work->vlan_dev = (real_dev == netdev ?