Commit 7c091e5c authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Greg Kroah-Hartman

staging/rdma/hfi1: add ACK coalescing logic

Implement ACK coalesing logic using a 8 bit counter.

The algorithm is send pio ack when:
- fecn present
- this is the first packet in an interrupt session
- counter is >= HFI1_PSN_CREDIT

Otherwise the ack is defered.
Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2fd36865
...@@ -378,6 +378,7 @@ static void reset_qp(struct hfi1_qp *qp, enum ib_qp_type type) ...@@ -378,6 +378,7 @@ static void reset_qp(struct hfi1_qp *qp, enum ib_qp_type type)
} }
qp->s_ack_state = IB_OPCODE_RC_ACKNOWLEDGE; qp->s_ack_state = IB_OPCODE_RC_ACKNOWLEDGE;
qp->r_nak_state = 0; qp->r_nak_state = 0;
qp->r_adefered = 0;
qp->r_aflags = 0; qp->r_aflags = 0;
qp->r_flags = 0; qp->r_flags = 0;
qp->s_head = 0; qp->s_head = 0;
......
...@@ -1618,6 +1618,17 @@ static inline void rc_defered_ack(struct hfi1_ctxtdata *rcd, ...@@ -1618,6 +1618,17 @@ static inline void rc_defered_ack(struct hfi1_ctxtdata *rcd,
} }
} }
static inline void rc_cancel_ack(struct hfi1_qp *qp)
{
qp->r_adefered = 0;
if (list_empty(&qp->rspwait))
return;
list_del_init(&qp->rspwait);
qp->r_flags &= ~HFI1_R_RSP_DEFERED_ACK;
if (atomic_dec_and_test(&qp->refcount))
wake_up(&qp->wait);
}
/** /**
* rc_rcv_error - process an incoming duplicate or error RC packet * rc_rcv_error - process an incoming duplicate or error RC packet
* @ohdr: the other headers for this packet * @ohdr: the other headers for this packet
...@@ -2335,8 +2346,22 @@ void hfi1_rc_rcv(struct hfi1_packet *packet) ...@@ -2335,8 +2346,22 @@ void hfi1_rc_rcv(struct hfi1_packet *packet)
qp->r_ack_psn = psn; qp->r_ack_psn = psn;
qp->r_nak_state = 0; qp->r_nak_state = 0;
/* Send an ACK if requested or required. */ /* Send an ACK if requested or required. */
if (psn & (1 << 31)) if (psn & IB_BTH_REQ_ACK) {
goto send_ack; if (packet->numpkt == 0) {
rc_cancel_ack(qp);
goto send_ack;
}
if (qp->r_adefered >= HFI1_PSN_CREDIT) {
rc_cancel_ack(qp);
goto send_ack;
}
if (unlikely(is_fecn)) {
rc_cancel_ack(qp);
goto send_ack;
}
qp->r_adefered++;
rc_defered_ack(rcd, qp);
}
return; return;
rnr_nak: rnr_nak:
......
...@@ -120,9 +120,9 @@ struct hfi1_packet; ...@@ -120,9 +120,9 @@ struct hfi1_packet;
#define HFI1_VENDOR_IPG cpu_to_be16(0xFFA0) #define HFI1_VENDOR_IPG cpu_to_be16(0xFFA0)
#define IB_BTH_REQ_ACK (1 << 31) #define IB_BTH_REQ_ACK BIT(31)
#define IB_BTH_SOLICITED (1 << 23) #define IB_BTH_SOLICITED BIT(23)
#define IB_BTH_MIG_REQ (1 << 22) #define IB_BTH_MIG_REQ BIT(22)
#define IB_GRH_VERSION 6 #define IB_GRH_VERSION 6
#define IB_GRH_VERSION_MASK 0xF #define IB_GRH_VERSION_MASK 0xF
...@@ -490,6 +490,7 @@ struct hfi1_qp { ...@@ -490,6 +490,7 @@ struct hfi1_qp {
u32 r_psn; /* expected rcv packet sequence number */ u32 r_psn; /* expected rcv packet sequence number */
u32 r_msn; /* message sequence number */ u32 r_msn; /* message sequence number */
u8 r_adefered; /* number of acks defered */
u8 r_state; /* opcode of last packet received */ u8 r_state; /* opcode of last packet received */
u8 r_flags; u8 r_flags;
u8 r_head_ack_queue; /* index into s_ack_queue[] */ u8 r_head_ack_queue; /* index into s_ack_queue[] */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment