Skip to content

Commit

Permalink
RDMA/rxe: Fix seg fault in rxe_comp_queue_pkt
Browse files Browse the repository at this point in the history
In rxe_comp_queue_pkt() an incoming response packet skb is enqueued to the
resp_pkts queue and then a decision is made whether to run the completer
task inline or schedule it. Finally the skb is dereferenced to bump a 'hw'
performance counter. This is wrong because if the completer task is
already running in a separate thread it may have already processed the skb
and freed it which can cause a seg fault.  This has been observed
infrequently in testing at high scale.

This patch fixes this by changing the order of enqueuing the packet until
after the counter is accessed.

Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Bob Pearson <[email protected]>
Fixes: 0b1e5b9 ("IB/rxe: Add port protocol stats")
Signed-off-by: Jason Gunthorpe <[email protected]>
  • Loading branch information
Bob Pearson authored and jgunthorpe committed Apr 22, 2024
1 parent ca0b44e commit 2b23b60
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions drivers/infiniband/sw/rxe/rxe_comp.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,12 +131,12 @@ void rxe_comp_queue_pkt(struct rxe_qp *qp, struct sk_buff *skb)
{
int must_sched;

skb_queue_tail(&qp->resp_pkts, skb);

must_sched = skb_queue_len(&qp->resp_pkts) > 1;
must_sched = skb_queue_len(&qp->resp_pkts) > 0;
if (must_sched != 0)
rxe_counter_inc(SKB_TO_PKT(skb)->rxe, RXE_CNT_COMPLETER_SCHED);

skb_queue_tail(&qp->resp_pkts, skb);

if (must_sched)
rxe_sched_task(&qp->comp.task);
else
Expand Down

0 comments on commit 2b23b60

Please sign in to comment.