IB/mad: Report number of times a mad was retried
To allow ULPs to tune timeout values and capture retry statistics, report the number of times that a mad send operation was retried. For RMPP mads, report the total number of times that the any portion (send window) of the send operation was retried. Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
547af76521
commit
4fc8cd4919
|
@ -1100,7 +1100,9 @@ int ib_post_send_mad(struct ib_mad_send_buf *send_buf,
|
||||||
mad_send_wr->tid = ((struct ib_mad_hdr *) send_buf->mad)->tid;
|
mad_send_wr->tid = ((struct ib_mad_hdr *) send_buf->mad)->tid;
|
||||||
/* Timeout will be updated after send completes */
|
/* Timeout will be updated after send completes */
|
||||||
mad_send_wr->timeout = msecs_to_jiffies(send_buf->timeout_ms);
|
mad_send_wr->timeout = msecs_to_jiffies(send_buf->timeout_ms);
|
||||||
mad_send_wr->retries = send_buf->retries;
|
mad_send_wr->max_retries = send_buf->retries;
|
||||||
|
mad_send_wr->retries_left = send_buf->retries;
|
||||||
|
send_buf->retries = 0;
|
||||||
/* Reference for work request to QP + response */
|
/* Reference for work request to QP + response */
|
||||||
mad_send_wr->refcount = 1 + (mad_send_wr->timeout > 0);
|
mad_send_wr->refcount = 1 + (mad_send_wr->timeout > 0);
|
||||||
mad_send_wr->status = IB_WC_SUCCESS;
|
mad_send_wr->status = IB_WC_SUCCESS;
|
||||||
|
@ -2436,9 +2438,12 @@ static int retry_send(struct ib_mad_send_wr_private *mad_send_wr)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!mad_send_wr->retries--)
|
if (!mad_send_wr->retries_left)
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
|
mad_send_wr->retries_left--;
|
||||||
|
mad_send_wr->send_buf.retries++;
|
||||||
|
|
||||||
mad_send_wr->timeout = msecs_to_jiffies(mad_send_wr->send_buf.timeout_ms);
|
mad_send_wr->timeout = msecs_to_jiffies(mad_send_wr->send_buf.timeout_ms);
|
||||||
|
|
||||||
if (mad_send_wr->mad_agent_priv->agent.rmpp_version) {
|
if (mad_send_wr->mad_agent_priv->agent.rmpp_version) {
|
||||||
|
|
|
@ -131,7 +131,8 @@ struct ib_mad_send_wr_private {
|
||||||
struct ib_sge sg_list[IB_MAD_SEND_REQ_MAX_SG];
|
struct ib_sge sg_list[IB_MAD_SEND_REQ_MAX_SG];
|
||||||
__be64 tid;
|
__be64 tid;
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
int retries;
|
int max_retries;
|
||||||
|
int retries_left;
|
||||||
int retry;
|
int retry;
|
||||||
int refcount;
|
int refcount;
|
||||||
enum ib_wc_status status;
|
enum ib_wc_status status;
|
||||||
|
|
|
@ -684,7 +684,7 @@ static void process_rmpp_ack(struct ib_mad_agent_private *agent,
|
||||||
|
|
||||||
if (seg_num > mad_send_wr->last_ack) {
|
if (seg_num > mad_send_wr->last_ack) {
|
||||||
adjust_last_ack(mad_send_wr, seg_num);
|
adjust_last_ack(mad_send_wr, seg_num);
|
||||||
mad_send_wr->retries = mad_send_wr->send_buf.retries;
|
mad_send_wr->retries_left = mad_send_wr->max_retries;
|
||||||
}
|
}
|
||||||
mad_send_wr->newwin = newwin;
|
mad_send_wr->newwin = newwin;
|
||||||
if (mad_send_wr->last_ack == mad_send_wr->send_buf.seg_count) {
|
if (mad_send_wr->last_ack == mad_send_wr->send_buf.seg_count) {
|
||||||
|
|
|
@ -230,7 +230,9 @@ struct ib_class_port_info
|
||||||
* @seg_count: The number of RMPP segments allocated for this send.
|
* @seg_count: The number of RMPP segments allocated for this send.
|
||||||
* @seg_size: Size of each RMPP segment.
|
* @seg_size: Size of each RMPP segment.
|
||||||
* @timeout_ms: Time to wait for a response.
|
* @timeout_ms: Time to wait for a response.
|
||||||
* @retries: Number of times to retry a request for a response.
|
* @retries: Number of times to retry a request for a response. For MADs
|
||||||
|
* using RMPP, this applies per window. On completion, returns the number
|
||||||
|
* of retries needed to complete the transfer.
|
||||||
*
|
*
|
||||||
* Users are responsible for initializing the MAD buffer itself, with the
|
* Users are responsible for initializing the MAD buffer itself, with the
|
||||||
* exception of any RMPP header. Additional segment buffer space allocated
|
* exception of any RMPP header. Additional segment buffer space allocated
|
||||||
|
|
Loading…
Reference in New Issue