Skip to content

Commit 31333c1

Browse files
solbjorndavem330
authored andcommitted
net: qed: fix async event callbacks unregistering
qed_spq_unregister_async_cb() should be called before qed_rdma_info_free() to avoid crash-spawning uses-after-free. Instead of calling it from each subsystem exit code, do it in one place on PF down. Fixes: 291d57f ("qed: Fix rdma_info structure allocation") Signed-off-by: Alexander Lobakin <[email protected]> Signed-off-by: Igor Russkikh <[email protected]> Signed-off-by: Michal Kalderon <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 97dd1ab commit 31333c1

File tree

3 files changed

+7
-5
lines changed

3 files changed

+7
-5
lines changed

drivers/net/ethernet/qlogic/qed/qed_dev.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,8 @@ static void qed_dbg_user_data_free(struct qed_hwfn *p_hwfn)
13681368

13691369
void qed_resc_free(struct qed_dev *cdev)
13701370
{
1371+
struct qed_rdma_info *rdma_info;
1372+
struct qed_hwfn *p_hwfn;
13711373
int i;
13721374

13731375
if (IS_VF(cdev)) {
@@ -1385,7 +1387,8 @@ void qed_resc_free(struct qed_dev *cdev)
13851387
qed_llh_free(cdev);
13861388

13871389
for_each_hwfn(cdev, i) {
1388-
struct qed_hwfn *p_hwfn = &cdev->hwfns[i];
1390+
p_hwfn = cdev->hwfns + i;
1391+
rdma_info = p_hwfn->p_rdma_info;
13891392

13901393
qed_cxt_mngr_free(p_hwfn);
13911394
qed_qm_info_free(p_hwfn);
@@ -1404,8 +1407,10 @@ void qed_resc_free(struct qed_dev *cdev)
14041407
qed_ooo_free(p_hwfn);
14051408
}
14061409

1407-
if (QED_IS_RDMA_PERSONALITY(p_hwfn))
1410+
if (QED_IS_RDMA_PERSONALITY(p_hwfn) && rdma_info) {
1411+
qed_spq_unregister_async_cb(p_hwfn, rdma_info->proto);
14081412
qed_rdma_info_free(p_hwfn);
1413+
}
14091414

14101415
qed_iov_free(p_hwfn);
14111416
qed_l2_free(p_hwfn);

drivers/net/ethernet/qlogic/qed/qed_iwarp.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,8 +2836,6 @@ int qed_iwarp_stop(struct qed_hwfn *p_hwfn)
28362836
if (rc)
28372837
return rc;
28382838

2839-
qed_spq_unregister_async_cb(p_hwfn, PROTOCOLID_IWARP);
2840-
28412839
return qed_iwarp_ll2_stop(p_hwfn);
28422840
}
28432841

drivers/net/ethernet/qlogic/qed/qed_roce.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ void qed_roce_stop(struct qed_hwfn *p_hwfn)
113113
break;
114114
}
115115
}
116-
qed_spq_unregister_async_cb(p_hwfn, PROTOCOLID_ROCE);
117116
}
118117

119118
static void qed_rdma_copy_gids(struct qed_rdma_qp *qp, __le32 *src_gid,

0 commit comments

Comments
 (0)