/* This is implemented by have a long-lived send_wr and sge which point to a statically allocated ack frame. This ack wr does not fall under the ring accounting that the tx and rx wrs do. The QP attribute specifically makes room for it beyond the ring size. Send completion notices its special wr_id and avoids working with the ring in that case.  */
static void rds_ib_set_ack(struct rds_ib_connection *ic, u64 seq, int ack_required)
/* This is implemented by have a long-lived send_wr and sge which point to a statically allocated ack frame. This ack wr does not fall under the ring accounting that the tx and rx wrs do. The QP attribute specifically makes room for it beyond the ring size. Send completion notices its special wr_id and avoids working with the ring in that case.  */
static void rds_ib_set_ack(struct rds_ib_connection *ic, u64 seq, int ack_required)
{
	unsigned long flags;
	spin_lock_irqsave(&ic->i_ack_lock, flags);
	ic->i_ack_next = seq;
	if (ack_required)
		set_bit(IB_ACK_REQUESTED, &ic->i_ack_flags);
	spin_unlock_irqrestore(&ic->i_ack_lock, flags);
}