[ofw] [PATCH] ib/mad: fix routing of vendor mads

Sean Hefty sean.hefty at intel.com
Tue Jan 19 16:21:28 PST 2010


SVN commit 2174 introduced an error that resulted in all
vendor MADs being routed to the local HCA driver.

This results in the ib-diag vendstat failing to receive
a response when trying to gather statistics about a remote
device.

We should only route vendor mads to the local HCA if the
mad is one of the mellanox vendor classes, the mad is not
a response, and the local HCA is the destination for the
mad.  Simplify both the send and receive processing to
be consistent in vendor mad handling.

Problem reported by Mohammad Sawalha.

Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
Vendstat to a local and remote lid worked for me with this patch.
I still need to perform some additional testing, but I think this
will work.

SVN 2174 only touched the receive side handling, but this patch
'fixes' the send side as well, plus makes the send side handling
for performance and base management mads similar.

 trunk/core/al/kernel/al_smi.c |   28 ++++++++++++++++------------
 1 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/trunk/core/al/kernel/al_smi.c b/trunk/core/al/kernel/al_smi.c
index 7f5abee..5e1c7fa 100644
--- a/trunk/core/al/kernel/al_smi.c
+++ b/trunk/core/al/kernel/al_smi.c
@@ -192,6 +192,10 @@ static mad_route_t
 route_recv_perf(
 	IN				ib_mad_element_t*			p_mad_element );
 
+static mad_route_t
+route_recv_vendor(
+	IN				ib_mad_element_t*			p_mad_element );
+
 ib_api_status_t
 forward_sm_trap(
 	IN				spl_qp_svc_t*				p_spl_qp_svc,
@@ -1191,20 +1195,12 @@ route_mad_send(
 
 		case IB_MCLASS_PERF:
 		case IB_MCLASS_BM:
-			local = ( h_av &&
+		case IB_MLX_VENDOR_CLASS1:
+		case IB_MLX_VENDOR_CLASS2:
+			local = !(p_mad->method & IB_MAD_METHOD_RESP_MASK) && ( h_av &&
 				( h_av->av_attr.dlid ==
 				( h_av->av_attr.path_bits | p_spl_qp_svc->base_lid ) ) );
 			break;
-
-		default:
-			/* Route vendor specific MADs to the HCA provider. */
-			if( ib_class_is_vendor_specific( p_mad->mgmt_class ) )
-			{
-				local = ( h_av &&
-					( h_av->av_attr.dlid ==
-					( h_av->av_attr.path_bits | p_spl_qp_svc->base_lid ) ) );
-			}
-			break;
 		}
 	}
 
@@ -2959,7 +2955,7 @@ process_mad_recv(
 
 		case IB_MLX_VENDOR_CLASS1:
 		case IB_MLX_VENDOR_CLASS2:
-			route = ROUTE_LOCAL;
+			route = route_recv_vendor( p_mad_element );
 			break;
 
 		default:
@@ -3119,6 +3115,14 @@ route_recv_perf(
 	return ROUTE_DISPATCHER;
 }
 
+static mad_route_t
+route_recv_vendor(
+	IN				ib_mad_element_t*			p_mad_element )
+{
+	return ( p_mad_element->p_mad_buf->method & IB_MAD_METHOD_RESP_MASK ) ?
+		ROUTE_DISPATCHER : ROUTE_LOCAL;
+}
+
 /*
  * Forward a locally generated Subnet Management trap.
  */





More information about the ofw mailing list