diff options
Diffstat (limited to 'drivers/infiniband/hw/hfi1/verbs.c')
| -rw-r--r-- | drivers/infiniband/hw/hfi1/verbs.c | 4 | 
1 files changed, 3 insertions, 1 deletions
| diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c index 089e201d7550..2f6323ad9c59 100644 --- a/drivers/infiniband/hw/hfi1/verbs.c +++ b/drivers/infiniband/hw/hfi1/verbs.c @@ -515,10 +515,11 @@ static inline void hfi1_handle_packet(struct hfi1_packet *packet,  				       opa_get_lid(packet->dlid, 9B));  		if (!mcast)  			goto drop; +		rcu_read_lock();  		list_for_each_entry_rcu(p, &mcast->qp_list, list) {  			packet->qp = p->qp;  			if (hfi1_do_pkey_check(packet)) -				goto drop; +				goto unlock_drop;  			spin_lock_irqsave(&packet->qp->r_lock, flags);  			packet_handler = qp_ok(packet);  			if (likely(packet_handler)) @@ -527,6 +528,7 @@ static inline void hfi1_handle_packet(struct hfi1_packet *packet,  				ibp->rvp.n_pkt_drops++;  			spin_unlock_irqrestore(&packet->qp->r_lock, flags);  		} +		rcu_read_unlock();  		/*  		 * Notify rvt_multicast_detach() if it is waiting for us  		 * to finish. |