[ofa-general] [PATCH V3] infiniband/core: Enable loopback of DR SMP responses from userspace
Suresh Shelvapille
suri at baymicrosystems.com
Tue Oct 16 11:53:32 PDT 2007
Steve:
This patch looks good on my system, meaning it did not break any of my usual
tests (switch related).
Thanks,
Suri
> -----Original Message-----
> From: general-bounces at lists.openfabrics.org [mailto:general-bounces at lists.openfabrics.org] On Behalf
> Of swelch at systemfabricworks.com
> Sent: Wednesday, October 10, 2007 11:29 PM
> To: rdreier at cisco.com; sean.hefty at intel.com; general at lists.openfabrics.org
> Subject: [ofa-general] [PATCH V3] infiniband/core: Enable loopback of DR SMP responses from userspace
>
>
>
> Sean, Roland,
>
> This patch [v3] replaces the [v2] patch; it includes those changes but renames
> the smi function testing returning SMP requests to the name Hal recommends.
>
> This patch allows userspace DR SMP responses to be looped back and delivered
> to a local mad agent by the management stack.
>
> Thanks, Steve
>
> Signed-off-by: Steve Welch <swelch at systemfabricworks.com>
> ---
> drivers/infiniband/core/mad.c | 6 +++---
> drivers/infiniband/core/smi.h | 18 +++++++++++++++++-
> 2 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
> index 6f42877..98148d6 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_returning_smp(smp, device) == IB_SMI_DISCARD)
> goto out;
>
> local = kmalloc(sizeof *local, GFP_ATOMIC);
> @@ -752,8 +753,7 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
> port_priv = ib_get_mad_port(mad_agent_priv->agent.device,
> mad_agent_priv->agent.port_num);
> 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..aff96ba 100644
> --- a/drivers/infiniband/core/smi.h
> +++ b/drivers/infiniband/core/smi.h
> @@ -59,7 +59,8 @@ extern enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp,
> u8 node_type, int port_num);
>
> /*
> - * Return 1 if the SMP should be handled by the local SMA/SM via process_mad
> + * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM
> + * via process_mad
> */
> static inline enum smi_action smi_check_local_smp(struct ib_smp *smp,
> struct ib_device *device)
> @@ -71,4 +72,19 @@ 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 IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM
> + * via process_mad
> + */
> +static inline enum smi_action smi_check_local_returning_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_ */
> _______________________________________________
> general mailing list
> general at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
>
> To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
More information about the general
mailing list