diff options
author | Dean Luick | 2015-10-26 15:28:43 +0100 |
---|---|---|
committer | Greg Kroah-Hartman | 2015-10-27 09:45:51 +0100 |
commit | b77d713a310b5c6eba13e9c394bcf0b085c4a49d (patch) | |
tree | 482853a8a51b68e3c739a7e375ff1df9a22c22ea /drivers/staging/rdma/hfi1/verbs.c | |
parent | staging/rdma/hfi1: Increase SDMA descriptor queue size (diff) | |
download | kernel-qcow2-linux-b77d713a310b5c6eba13e9c394bcf0b085c4a49d.tar.gz kernel-qcow2-linux-b77d713a310b5c6eba13e9c394bcf0b085c4a49d.tar.xz kernel-qcow2-linux-b77d713a310b5c6eba13e9c394bcf0b085c4a49d.zip |
staging/rdma/hfi1: Add irqsaves in the packet processing path
In preparation for threading the receive interrupt, add irqsaves in the packet
processing path.
When the receive interrupt is threaded, the packet processing path is no longer
guaranteed to have IRQs disabled. Add irqsaves where needed on several locks
in the packet processing path. Anything that did not have an obvious, "close"
irqsave in its caller is a candidate.
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/rdma/hfi1/verbs.c')
-rw-r--r-- | drivers/staging/rdma/hfi1/verbs.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/staging/rdma/hfi1/verbs.c b/drivers/staging/rdma/hfi1/verbs.c index 45f291fd3236..d8f6347decd6 100644 --- a/drivers/staging/rdma/hfi1/verbs.c +++ b/drivers/staging/rdma/hfi1/verbs.c @@ -597,6 +597,7 @@ void hfi1_ib_rcv(struct hfi1_packet *packet) u32 tlen = packet->tlen; struct hfi1_pportdata *ppd = rcd->ppd; struct hfi1_ibport *ibp = &ppd->ibport_data; + unsigned long flags; u32 qp_num; int lnh; u8 opcode; @@ -639,10 +640,10 @@ void hfi1_ib_rcv(struct hfi1_packet *packet) goto drop; list_for_each_entry_rcu(p, &mcast->qp_list, list) { packet->qp = p->qp; - spin_lock(&packet->qp->r_lock); + spin_lock_irqsave(&packet->qp->r_lock, flags); if (likely((qp_ok(opcode, packet)))) opcode_handler_tbl[opcode](packet); - spin_unlock(&packet->qp->r_lock); + spin_unlock_irqrestore(&packet->qp->r_lock, flags); } /* * Notify hfi1_multicast_detach() if it is waiting for us @@ -657,10 +658,10 @@ void hfi1_ib_rcv(struct hfi1_packet *packet) rcu_read_unlock(); goto drop; } - spin_lock(&packet->qp->r_lock); + spin_lock_irqsave(&packet->qp->r_lock, flags); if (likely((qp_ok(opcode, packet)))) opcode_handler_tbl[opcode](packet); - spin_unlock(&packet->qp->r_lock); + spin_unlock_irqrestore(&packet->qp->r_lock, flags); rcu_read_unlock(); } return; |