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

Ralph Campbell ralph.campbell at qlogic.com
Fri Oct 19 11:51:08 PDT 2007


On Fri, 2007-10-19 at 12:41 -0500, swelch at systemfabricworks.com wrote:
> 
>   This patch [v4] replaces the [v3] patch; it's identicial other than
>   the patch description has been updated to put back in the detailed
>   patch description absent from the [v3] patch.
> 
>   The local loopback of an outgoing DR SMP response is limited to those
>   that originate at the driver specific SMA implementation during the
>   driver specific process_mad() function.  This patch enables a
>   returning DR SMP originating in userspace (or elsewhere) to be
>   delivered to the local managment stack.  In this specific  case
>   the driver process_mad() function does not consume or process
>   the MAD, so a reponse mad has not be created and the original
>   MAD must manually be copied to the MAD buffer that is to be handed
>   off to the local agent.
> 
>   For consistent bahavior on top of iPath hardware, a subsequent patch
>   to be submitted by Ralph Campbell to update process_mad() return values
>   is required.
> 
>   Thanks, Steve

Acked-by: Ralph Campbell <ralph.campbell at qlogic.com>

> 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_ */




More information about the general mailing list