Commit 8a6c6170 authored by Jason Gunthorpe's avatar Jason Gunthorpe

RDMA/bnxt_re: Fix lifetimes in bnxt_re_task

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: 1ac5a404 ("RDMA/bnxt_re: Add bnxt_re RoCE driver")
Link: https://lore.kernel.org/r/1584117207-2664-3-git-send-email-selvin.xavier@broadcom.comSigned-off-by: default avatarSelvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 3cae5804
...@@ -1670,6 +1670,7 @@ static void bnxt_re_task(struct work_struct *work) ...@@ -1670,6 +1670,7 @@ static void bnxt_re_task(struct work_struct *work)
smp_mb__before_atomic(); smp_mb__before_atomic();
atomic_dec(&rdev->sched_count); atomic_dec(&rdev->sched_count);
exit: exit:
put_device(&rdev->ibdev.dev);
kfree(re_work); kfree(re_work);
} }
...@@ -1735,6 +1736,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier, ...@@ -1735,6 +1736,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier,
/* Allocate for the deferred task */ /* Allocate for the deferred task */
re_work = kzalloc(sizeof(*re_work), GFP_ATOMIC); re_work = kzalloc(sizeof(*re_work), GFP_ATOMIC);
if (re_work) { if (re_work) {
get_device(&rdev->ibdev.dev);
re_work->rdev = rdev; re_work->rdev = rdev;
re_work->event = event; re_work->event = event;
re_work->vlan_dev = (real_dev == netdev ? re_work->vlan_dev = (real_dev == netdev ?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment