Commit c3594f22 authored by Kalderon, Michal's avatar Kalderon, Michal Committed by Jason Gunthorpe

RDMA/qedr: fix QP's ack timeout configuration

QPs that were configured with ack timeout value lower than 1
msec will not implement re-transmission timeout.
This means that if a packet / ACK were dropped, the QP
will not retransmit this packet.

This can lead to an application hang.

Fixes: cecbcddf ("qedr: Add support for QP verbs")
Signed-off-by: default avatarMichal Kalderon <Michal.Kalderon@cavium.com>
Signed-off-by: default avatarAriel Elior <Ariel.Elior@cavium.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 5f3e3b85
...@@ -2086,18 +2086,23 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, ...@@ -2086,18 +2086,23 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
SET_FIELD(qp_params.modify_flags, SET_FIELD(qp_params.modify_flags,
QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1); QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
qp_params.ack_timeout = attr->timeout; /* The received timeout value is an exponent used like this:
if (attr->timeout) { * "12.7.34 LOCAL ACK TIMEOUT
u32 temp; * Value representing the transport (ACK) timeout for use by
* the remote, expressed as: 4.096 * 2^timeout [usec]"
temp = 4096 * (1UL << attr->timeout) / 1000 / 1000; * The FW expects timeout in msec so we need to divide the usec
/* FW requires [msec] */ * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
qp_params.ack_timeout = temp; * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
} else { * The value of zero means infinite so we use a 'max_t' to make
/* Infinite */ * sure that sub 1 msec values will be configured as 1 msec.
*/
if (attr->timeout)
qp_params.ack_timeout =
1 << max_t(int, attr->timeout - 8, 0);
else
qp_params.ack_timeout = 0; qp_params.ack_timeout = 0;
} }
}
if (attr_mask & IB_QP_RETRY_CNT) { if (attr_mask & IB_QP_RETRY_CNT) {
SET_FIELD(qp_params.modify_flags, SET_FIELD(qp_params.modify_flags,
QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1); QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
......
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