[ofa-general] [PATCH] infiniband/core: Enable loopback of DR SMP responses from userspace

Hal Rosenstock hal.rosenstock at gmail.com
Thu Sep 13 08:24:14 PDT 2007


On 9/12/07, Roland Dreier <rdreier at cisco.com> wrote:
> Hal and Sean, what was the final feeling about this?  I seem to recall some changes were requested?

Yes, some mainly cosmetic changes were requested for more clarity.
This was all based on just code review. I have not had a chance to
test this out yet in what environments I can. I hope to get to this
next week.

> Are there two independent changes mixed
> up in one patch here?

Are you referring to the memcpy as one change and the rest as another ?

-- Hal

>  > diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
>  > index 6f42877..9ec910b 100644
>  > --- a/drivers/infiniband/core/mad.c
>  > +++ b/drivers/infiniband/core/mad.c
>  > @@ -701,7 +701,8 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
>  >      }
>  >
>  >      /* Check to post send on QP or process locally */
>  > -    if (smi_check_local_smp(smp, device) == IB_SMI_DISCARD)
>  > +    if (smi_check_local_smp(smp, device) == IB_SMI_DISCARD &&
>  > +        smi_check_local_resp_smp(smp, device) == IB_SMI_DISCARD)
>  >              goto out;
>  >
>  >      local = kmalloc(sizeof *local, GFP_ATOMIC);
>  > @@ -754,6 +755,7 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
>  >              if (port_priv) {
>  >                      mad_priv->mad.mad.mad_hdr.tid =
>  >                              ((struct ib_mad *)smp)->mad_hdr.tid;
>  > +                    memcpy(&mad_priv->mad.mad, smp, sizeof(struct ib_mad));
>  >                      recv_mad_agent = find_mad_agent(port_priv,
>  >                                                      &mad_priv->mad.mad);
>  >              }
>  > diff --git a/drivers/infiniband/core/smi.h b/drivers/infiniband/core/smi.h
>  > index 1cfc298..d96fc8e 100644
>  > --- a/drivers/infiniband/core/smi.h
>  > +++ b/drivers/infiniband/core/smi.h
>  > @@ -71,4 +71,18 @@ static inline enum smi_action smi_check_local_smp(struct ib_smp *smp,
>  >              (smp->hop_ptr == smp->hop_cnt + 1)) ?
>  >              IB_SMI_HANDLE : IB_SMI_DISCARD);
>  >  }
>  > +
>  > +/*
>  > + * Return 1 if the SMP response should be handled by the local management stack
>  > + */
>  > +static inline enum smi_action smi_check_local_resp_smp(struct ib_smp *smp,
>  > +                                                   struct ib_device *device)
>  > +{
>  > +    /* C14-13:3 -- We're at the end of the DR segment of path */
>  > +    /* C14-13:4 -- Hop Pointer == 0 -> give to SM */
>  > +    return ((device->process_mad &&
>  > +            ib_get_smp_direction(smp) &&
>  > +            !smp->hop_ptr) ? IB_SMI_HANDLE : IB_SMI_DISCARD);
>  > +}
>  > +
>  >  #endif      /* __SMI_H_ */
>



More information about the general mailing list