> This code is duplicated so it should be combined with if (!mad_send_wr) > clause above to eliminate the duplication. > > -- Hal
I guess that's true - they used to be different but since we've reverted to simply discarding the response, you're right the clauses can be merged. -----Original Message----- From: Hal Rosenstock [mailto:[email protected]] Sent: Monday, December 06, 2010 11:46 AM To: Mike Heinz Cc: [email protected] Subject: Re: [PATCH V5] SA Busy Handling On 12/3/2010 4:57 PM, Mike Heinz wrote: > The purpose of this patch is to cause the ib_mad driver to discard busy > responses from the SA, effectively causing busy responses to become time outs. > > This ensures that naïve IB applications cannot overwhelm the SA with queries, > which could happen when a cluster is being rebooted, or when a large HPC > application is started. > > Signed-Off-By: Michael Heinz<[email protected]> > > ---- > > drivers/infiniband/core/mad.c | 13 +++++++++++++ > include/rdma/ib_mad.h | 9 +++++++++ > 2 files changed, 22 insertions(+), 0 deletions(-) > diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c > index 64e660c..b322173 100644 > --- a/drivers/infiniband/core/mad.c > +++ b/drivers/infiniband/core/mad.c > @@ -1828,6 +1828,9 @@ static void ib_mad_complete_recv(struct > ib_mad_agent_private *mad_agent_priv, > > /* Complete corresponding request */ > if (ib_response_mad(mad_recv_wc->recv_buf.mad)) { > + u16 busy = > be16_to_cpu(mad_recv_wc->recv_buf.mad->mad_hdr.status)& > + > IB_MGMT_MAD_STATUS_BUSY; > + > spin_lock_irqsave(&mad_agent_priv->lock, flags); > mad_send_wr = ib_find_send_mad(mad_agent_priv, mad_recv_wc); > if (!mad_send_wr) { > @@ -1836,6 +1839,16 @@ static void ib_mad_complete_recv(struct > ib_mad_agent_private *mad_agent_priv, > deref_mad_agent(mad_agent_priv); > return; > } > + > + if (busy&& mad_send_wr->retries_left&& > + (mad_recv_wc->recv_buf.mad->mad_hdr.method != > IB_MGMT_METHOD_TRAP_REPRESS)) { > + /* Just let the query timeout and have it requeued > later */ > + spin_unlock_irqrestore(&mad_agent_priv->lock, flags); > + ib_free_recv_mad(mad_recv_wc); > + deref_mad_agent(mad_agent_priv); > + return; > + } This code is duplicated so it should be combined with if (!mad_send_wr) clause above to eliminate the duplication. -- Hal > + > ib_mark_mad_done(mad_send_wr); > spin_unlock_irqrestore(&mad_agent_priv->lock, flags); > > diff --git a/include/rdma/ib_mad.h b/include/rdma/ib_mad.h > index d3b9401..b901968 100644 > --- a/include/rdma/ib_mad.h > +++ b/include/rdma/ib_mad.h > @@ -77,6 +77,15 @@ > > #define IB_MGMT_MAX_METHODS 128 > > +/* MAD Status field bit masks */ > +#define IB_MGMT_MAD_STATUS_SUCCESS 0x0000 > +#define IB_MGMT_MAD_STATUS_BUSY 0x0001 > +#define IB_MGMT_MAD_STATUS_REDIRECT_REQD 0x0002 > +#define IB_MGMT_MAD_STATUS_BAD_VERSION 0x0004 > +#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD 0x0008 > +#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB 0x000c > +#define IB_MGMT_MAD_STATUS_INVALID_ATTRIB_VALUE 0x001c > + > /* RMPP information */ > #define IB_MGMT_RMPP_VERSION 1 > > > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
