diff options
author | Dennis Dalessandro <dennis.dalessandro@intel.com> | 2020-02-25 14:54:45 -0500 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2020-03-02 11:10:21 -0400 |
commit | 817a68a6584aa08e323c64283fec5ded7be84759 (patch) | |
tree | 643c30c1add80c466d1033ed155fcdbb04f8e2d9 /drivers/infiniband/hw/qib/qib_verbs.c | |
parent | 801b67f3eaafd3f2ec8b65d93142d4ffedba85df (diff) | |
download | linux-817a68a6584aa08e323c64283fec5ded7be84759.tar.gz linux-817a68a6584aa08e323c64283fec5ded7be84759.tar.bz2 linux-817a68a6584aa08e323c64283fec5ded7be84759.zip |
IB/hfi1, qib: Ensure RCU is locked when accessing list
The packet handling function, specifically the iteration of the qp list
for mad packet processing misses locking RCU before running through the
list. Not only is this incorrect, but the list_for_each_entry_rcu() call
can not be called with a conditional check for lock dependency. Remedy
this by invoking the rcu lock and unlock around the critical section.
This brings MAD packet processing in line with what is done for non-MAD
packets.
Fixes: 7724105686e7 ("IB/hfi1: add driver files")
Link: https://lore.kernel.org/r/20200225195445.140896.41873.stgit@awfm-01.aw.intel.com
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_verbs.c')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_verbs.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/qib/qib_verbs.c b/drivers/infiniband/hw/qib/qib_verbs.c index 33778d451b82..5ef93f8f17a1 100644 --- a/drivers/infiniband/hw/qib/qib_verbs.c +++ b/drivers/infiniband/hw/qib/qib_verbs.c @@ -329,8 +329,10 @@ void qib_ib_rcv(struct qib_ctxtdata *rcd, void *rhdr, void *data, u32 tlen) if (mcast == NULL) goto drop; this_cpu_inc(ibp->pmastats->n_multicast_rcv); + rcu_read_lock(); list_for_each_entry_rcu(p, &mcast->qp_list, list) qib_qp_rcv(rcd, hdr, 1, data, tlen, p->qp); + rcu_read_unlock(); /* * Notify rvt_multicast_detach() if it is waiting for us * to finish. |