X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=drivers%2Fstaging%2Frdma%2Fhfi1%2Frc.c;h=5fc93bb312f1b900ead7e1b6ae4f7ed643799f75;hb=25912ee10d64eba7f267b475afcf5d6ad4249ab3;hp=fd0ac608c62dca582bef0ef50604c1a2be6fb644;hpb=7a10d5218576f49623a4164816d9f82c6b98be38;p=karo-tx-linux.git diff --git a/drivers/staging/rdma/hfi1/rc.c b/drivers/staging/rdma/hfi1/rc.c index fd0ac608c62d..5fc93bb312f1 100644 --- a/drivers/staging/rdma/hfi1/rc.c +++ b/drivers/staging/rdma/hfi1/rc.c @@ -697,6 +697,7 @@ void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct hfi1_qp *qp, struct pio_buf *pbuf; struct hfi1_ib_header hdr; struct hfi1_other_headers *ohdr; + unsigned long flags; /* Don't send ACK or NAK if a RDMA read or atomic is pending. */ if (qp->s_flags & HFI1_S_RESP_PENDING) @@ -771,7 +772,7 @@ void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct hfi1_qp *qp, queue_ack: this_cpu_inc(*ibp->rc_qacks); - spin_lock(&qp->s_lock); + spin_lock_irqsave(&qp->s_lock, flags); qp->s_flags |= HFI1_S_ACK_PENDING | HFI1_S_RESP_PENDING; qp->s_nak_state = qp->r_nak_state; qp->s_ack_psn = qp->r_ack_psn; @@ -780,7 +781,7 @@ queue_ack: /* Schedule the send tasklet. */ hfi1_schedule_send(qp); - spin_unlock(&qp->s_lock); + spin_unlock_irqrestore(&qp->s_lock, flags); } /** @@ -926,6 +927,7 @@ static void rc_timeout(unsigned long arg) ibp->n_rc_timeouts++; qp->s_flags &= ~HFI1_S_TIMER; del_timer(&qp->s_timer); + trace_hfi1_rc_timeout(qp, qp->s_last_psn + 1); restart_rc(qp, qp->s_last_psn + 1, 1); hfi1_schedule_send(qp); } @@ -1152,7 +1154,7 @@ static struct hfi1_swqe *do_rc_completion(struct hfi1_qp *qp, * * This is called from rc_rcv_resp() to process an incoming RC ACK * for the given QP. - * Called at interrupt level with the QP s_lock held. + * May be called at interrupt level, with the QP s_lock held. * Returns 1 if OK, 0 if current operation should be aborted (NAK). */ static int do_rc_ack(struct hfi1_qp *qp, u32 aeth, u32 psn, int opcode, @@ -1441,6 +1443,8 @@ static void rc_rcv_resp(struct hfi1_ibport *ibp, spin_lock_irqsave(&qp->s_lock, flags); + trace_hfi1_rc_ack(qp, psn); + /* Ignore invalid responses. */ if (cmp_psn(psn, qp->s_next_psn) >= 0) goto ack_done; @@ -1629,6 +1633,7 @@ static noinline int rc_rcv_error(struct hfi1_other_headers *ohdr, void *data, u8 i, prev; int old_req; + trace_hfi1_rc_rcv_error(qp, psn); if (diff > 0) { /* * Packet sequence error. @@ -1835,11 +1840,12 @@ static void log_cca_event(struct hfi1_pportdata *ppd, u8 sl, u32 rlid, u32 lqpn, u32 rqpn, u8 svc_type) { struct opa_hfi1_cong_log_event_internal *cc_event; + unsigned long flags; if (sl >= OPA_MAX_SLS) return; - spin_lock(&ppd->cc_log_lock); + spin_lock_irqsave(&ppd->cc_log_lock, flags); ppd->threshold_cong_event_map[sl/8] |= 1 << (sl % 8); ppd->threshold_event_counter++; @@ -1855,7 +1861,7 @@ static void log_cca_event(struct hfi1_pportdata *ppd, u8 sl, u32 rlid, /* keep timestamp in units of 1.024 usec */ cc_event->timestamp = ktime_to_ns(ktime_get()) / 1024; - spin_unlock(&ppd->cc_log_lock); + spin_unlock_irqrestore(&ppd->cc_log_lock, flags); } void process_becn(struct hfi1_pportdata *ppd, u8 sl, u16 rlid, u32 lqpn, @@ -1865,6 +1871,7 @@ void process_becn(struct hfi1_pportdata *ppd, u8 sl, u16 rlid, u32 lqpn, u16 ccti, ccti_incr, ccti_timer, ccti_limit; u8 trigger_threshold; struct cc_state *cc_state; + unsigned long flags; if (sl >= OPA_MAX_SLS) return; @@ -1887,7 +1894,7 @@ void process_becn(struct hfi1_pportdata *ppd, u8 sl, u16 rlid, u32 lqpn, trigger_threshold = cc_state->cong_setting.entries[sl].trigger_threshold; - spin_lock(&ppd->cca_timer_lock); + spin_lock_irqsave(&ppd->cca_timer_lock, flags); if (cca_timer->ccti < ccti_limit) { if (cca_timer->ccti + ccti_incr <= ccti_limit) @@ -1897,7 +1904,7 @@ void process_becn(struct hfi1_pportdata *ppd, u8 sl, u16 rlid, u32 lqpn, set_link_ipg(ppd); } - spin_unlock(&ppd->cca_timer_lock); + spin_unlock_irqrestore(&ppd->cca_timer_lock, flags); ccti = cca_timer->ccti; @@ -1924,7 +1931,7 @@ void process_becn(struct hfi1_pportdata *ppd, u8 sl, u16 rlid, u32 lqpn, * * This is called from qp_rcv() to process an incoming RC packet * for the given QP. - * Called at interrupt level. + * May be called at interrupt level. */ void hfi1_rc_rcv(struct hfi1_packet *packet) { @@ -2383,7 +2390,7 @@ void hfi1_rc_hdrerr( struct hfi1_other_headers *ohdr; struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num); int diff; - u8 opcode; + u32 opcode; u32 psn; /* Check for GRH */