[openib-general] [PATCH] stored MAD timeout usage changes
Sean Hefty
Thu Oct 7 14:33:21 PDT 2004
This patch converts stored MAD timeouts from ms to jiffies and changes from keying off a non-zero timeout to using the MAD status value when handling errors and canceling MADs.
- Sean
Index: access/ib_mad_priv.h
===================================================================
--- access/ib_mad_priv.h (revision 956)
+++ access/ib_mad_priv.h (working copy)
@@ -120,7 +120,7 @@
struct ib_mad_agent *agent;
u64 wr_id; /* client WR ID */
u64 tid;
- int timeout;
+ unsigned long timeout;
int refcount;
enum ib_wc_status status;
};
Index: access/ib_mad.c
===================================================================
--- access/ib_mad.c (revision 956)
+++ access/ib_mad.c (working copy)
@@ -352,11 +352,10 @@
mad_send_wr->tid = send_wr->wr.ud.mad_hdr->tid;
mad_send_wr->agent = mad_agent;
+ /* Timeout will be updated after send completes. */
mad_send_wr->timeout = cur_send_wr->wr.ud.timeout_ms;
- if (mad_send_wr->timeout)
- mad_send_wr->refcount = 2;
- else
- mad_send_wr->refcount = 1;
+ /* One reference for each work request to QP + response. */
+ mad_send_wr->refcount = 1 + (mad_send_wr->timeout > 0);
mad_send_wr->status = IB_WC_SUCCESS;
/* Reference MAD agent until send completes */
@@ -787,14 +786,10 @@
list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list,
agent_list) {
-
- if (mad_send_wr->tid == tid) {
- /* Verify request is still valid */
- if (mad_send_wr->status == IB_WC_SUCCESS &&
- mad_send_wr->timeout)
- return mad_send_wr;
- else
- return NULL;
+ if (mad_send_wr->tid == tid && mad_send_wr->timeout) {
+ /* Verify request has not been canceled. */
+ return (mad_send_wr->status == IB_WC_SUCCESS) ?
+ mad_send_wr : NULL;
}
}
return NULL;
@@ -823,6 +818,7 @@
ib_free_recv_mad(&recv->header.recv_wc);
return;
}
+ /* Timeout = 0 means that we won't wait for a response. */
mad_send_wr->timeout = 0;
spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
@@ -951,12 +947,8 @@
spin_lock_irqsave(&mad_agent_priv->lock, flags);
if (mad_send_wc->status != IB_WC_SUCCESS &&
mad_send_wr->status == IB_WC_SUCCESS) {
-
mad_send_wr->status = mad_send_wc->status;
- if (mad_send_wr->timeout) {
- mad_send_wr->timeout = 0;
- mad_send_wr->refcount--;
- }
+ mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
}
/*
@@ -1077,17 +1069,14 @@
&mad_agent_priv->send_list, agent_list) {
if (mad_send_wr->status == IB_WC_SUCCESS)
- mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
-
- if (mad_send_wr->timeout) {
- mad_send_wr->timeout = 0;
- mad_send_wr->refcount--;
- }
+ mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
if (mad_send_wr->refcount == 0) {
list_del(&mad_send_wr->agent_list);
list_add_tail(&mad_send_wr->agent_list,
&cancel_list);
+ } else {
+ mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
}
}
spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
@@ -1142,14 +1131,10 @@
}
if (mad_send_wr->status == IB_WC_SUCCESS)
- mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
-
- if (mad_send_wr->timeout) {
- mad_send_wr->timeout = 0;
- mad_send_wr->refcount--;
- }
+ mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
if (mad_send_wr->refcount != 0) {
+ mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
goto ret;
}
More information about the openib-general mailing list