All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hal Rosenstock <hal-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
To: "linux-rdma
	(linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org)"
	<linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH 07/07] opensm/perfmgr: add sl support
Date: Tue, 19 Mar 2013 12:33:48 -0400	[thread overview]
Message-ID: <5148936C.4010605@dev.mellanox.co.il> (raw)
In-Reply-To: <51485F74.1010701-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>


This doesn't appear to have made it to the list so I'm resending.

-------- Original Message --------
Subject: Re: [PATCH 07/07] opensm/perfmgr: add sl support
Date: Tue, 19 Mar 2013 08:52:04 -0400
From: Hal Rosenstock <hal-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
Reply-To: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org <linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
To: Ira Weiny <iweiny-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Ira Weiny <ira.weiny-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
CC: Hal Rosenstock <hal-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>

On 2/28/2013 8:09 PM, Ira Weiny wrote:
> 
> SL's are queried internally when running in a master SM 

Similarly, does PerfMgr really need it's own discovery code when not in
standalone mode or could this also be gleaned from existing data SM
structures ?

> and queried from the SA when running in a standby or inactive SM.
> 
> Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
> ---
>  include/opensm/osm_perfmgr.h |   11 ++
>  opensm/osm_perfmgr.c         |  345 +++++++++++++++++++++++++++++++++++++++---
>  2 files changed, 336 insertions(+), 20 deletions(-)
> 
> diff --git a/include/opensm/osm_perfmgr.h b/include/opensm/osm_perfmgr.h
> index 4141d41..5ca1cf4 100644
> --- a/include/opensm/osm_perfmgr.h
> +++ b/include/opensm/osm_perfmgr.h
> @@ -2,6 +2,7 @@
>   * Copyright (c) 2007 The Regents of the University of California.
>   * Copyright (c) 2007-2009 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2009,2010 HNR Consulting. All rights reserved.
> + * Copyright (c) 2013 Lawrence Livermore National Security, All rights reserved
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -90,6 +91,11 @@ typedef enum {
>  	PERFMGR_SWEEP_SUSPENDED
>  } osm_perfmgr_sweep_state_t;
>  
> +typedef struct pr_map_item {
> +	cl_map_item_t map_item;
> +	ib_path_rec_t pr;
> +} pr_map_item_t;
> +
>  typedef struct monitored_port {
>  	uint16_t pkey_ix;
>  	ib_net16_t orig_lid;
> @@ -150,6 +156,11 @@ typedef struct osm_perfmgr {
>  	int16_t local_port;
>  	int rm_nodes;
>  	boolean_t query_cpi;
> +	cl_qmap_t path_rec_map;

Where does cleanup of path_rec_map occur ? Did I miss that ?

> +	/* when operating in stand alone mode we are required to query the
> +	 * remote master SA */
> +	osm_bind_handle_t sa_bind_handle;
> +	int pr_query_outstanding;
>  } osm_perfmgr_t;
>  /*
>  * FIELDS
> diff --git a/opensm/osm_perfmgr.c b/opensm/osm_perfmgr.c
> index 9df28f9..b1cd419 100644
> --- a/opensm/osm_perfmgr.c
> +++ b/opensm/osm_perfmgr.c
> @@ -2,7 +2,7 @@
>   * Copyright (c) 2007 The Regents of the University of California.
>   * Copyright (c) 2007-2009 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2009,2010 HNR Consulting. All rights reserved.
> - * Copyright (c) 2013 Lawrence Livermore National Security. All rights * reserved.
> + * Copyright (c) 2013 Lawrence Livermore National Security. All rights reserved.
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -123,6 +123,7 @@ static inline void diff_time(struct timeval *before, struct timeval *after,
>  static void init_monitored_nodes(osm_perfmgr_t * pm)
>  {
>  	cl_qmap_init(&pm->monitored_map);
> +	cl_qmap_init(&pm->path_rec_map);
>  	pm->remove_list = NULL;
>  	cl_event_construct(&pm->sig_query);
>  	cl_event_init(&pm->sig_query, FALSE);
> @@ -254,6 +255,10 @@ Exit:
>  	OSM_LOG_EXIT(pm->log);
>  }
>  
> +static void perfmgr_sa_mad_recv_cb(osm_madw_t * p_madw, void *bind_context,
> +				osm_madw_t * p_req_madw);
> +static void perfmgr_sa_mad_send_err_cb(void *bind_context,
> +				osm_madw_t * p_madw);
>  /**********************************************************************
>   * Bind the PerfMgr to the vendor layer for MAD sends/receives
>   **********************************************************************/
> @@ -294,6 +299,22 @@ ib_api_status_t osm_perfmgr_bind(osm_perfmgr_t * pm, ib_net64_t port_guid)
>  		OSM_LOG(pm->log, OSM_LOG_ERROR,
>  			"ERR 5404: Vendor specific bind failed (%s)\n",
>  			ib_get_err_str(status));
> +		goto Exit;
> +	}
> +
> +	bind_info.mad_class = IB_MCLASS_SUBN_ADM;
> +	bind_info.class_version = 2;

Are any other bind parameters needed ?

> +
> +	pm->sa_bind_handle = osm_vendor_bind(pm->vendor, &bind_info,
> +					     pm->mad_pool,
> +					     perfmgr_sa_mad_recv_cb,
> +					     perfmgr_sa_mad_send_err_cb, pm);

Why not only do this when in standalone mode ? Is that due to the bind
being needed based on SM state and that isn't known here ?

> +
> +	if (pm->sa_bind_handle == OSM_BIND_INVALID_HANDLE) {
> +		status = IB_ERROR;
> +		OSM_LOG(pm->log, OSM_LOG_ERROR,
> +			"ERR 540E: PM SA bind failed (%s)\n",
> +			ib_get_err_str(status));
>  	}
>  
>  Exit:
> @@ -307,12 +328,17 @@ Exit:
>  static void perfmgr_mad_unbind(osm_perfmgr_t * pm)
>  {
>  	OSM_LOG_ENTER(pm->log);
> -	if (pm->bind_handle == OSM_BIND_INVALID_HANDLE) {
> +
> +	if (pm->bind_handle == OSM_BIND_INVALID_HANDLE)
>  		OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5405: No previous bind\n");
> -		goto Exit;
> -	}
> -	osm_vendor_unbind(pm->bind_handle);
> -Exit:
> +	else
> +		osm_vendor_unbind(pm->bind_handle);
> +
> +	if (pm->sa_bind_handle == OSM_BIND_INVALID_HANDLE)
> +		OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 540F: No previous SA bind\n");
> +	else
> +		osm_vendor_unbind(pm->sa_bind_handle);
> +
>  	OSM_LOG_EXIT(pm->log);
>  }
>  
> @@ -330,6 +356,250 @@ static ib_net32_t get_qp(monitored_node_t * mon_node, uint8_t port)
>  	return qp;
>  }
>  
> +static inline boolean_t sm_not_active(osm_perfmgr_t *pm)
> +{
> +	return (pm->subn->sm_state == IB_SMINFO_STATE_STANDBY ||
> +		pm->subn->sm_state == IB_SMINFO_STATE_NOTACTIVE);
> +}
> +
> +static int get_sm_info(osm_perfmgr_t *pm, ib_net16_t *smlid, uint8_t *smsl)
> +{
> +	int i, rc = -1;
> +	uint32_t num_ports = 32;
> +	ib_port_attr_t attr_array[32];

64 is better as there are 36 port switches. Also, this should be a define.

> +
> +	osm_vendor_get_all_port_attr(pm->vendor, attr_array, &num_ports);
> +
> +	for(i = 0; i<num_ports; i++) {
> +		if (attr_array[i].port_guid == pm->port_guid) {
> +			*smlid = attr_array[i].sm_lid;
> +			*smsl = attr_array[i].sm_sl;
> +			rc = 0;
> +		}
> +	}
> +
> +	return (rc);
> +}
> +
> +static void insert_pr_map(osm_perfmgr_t *pm,  ib_path_rec_t *pr)
> +{
> +	pr_map_item_t *mi = calloc(1, sizeof(*mi));
> +	if (mi) {
> +		cl_map_item_t *tmp;
> +		if ((tmp = cl_qmap_get(&pm->path_rec_map, (uint64_t)pr->dlid))
> +				!= cl_qmap_end(&pm->path_rec_map)) {
> +			cl_qmap_remove_item(&pm->path_rec_map, tmp);
> +			free(tmp);
> +		}
> +		memcpy(&mi->pr, pr, sizeof(mi->pr));
> +		cl_qmap_insert(&pm->path_rec_map, (uint64_t)pr->dlid,
> +		       (cl_map_item_t *) mi);
> +	} else {
> +		OSM_LOG(pm->log, OSM_LOG_ERROR,
> +			"ERR 54FC: Failed to allocate path "
> +			"record map item for DLID %d",

LIDs should be formatted as %u

> +			cl_ntoh16(pr->dlid));
> +	}
> +}
> +
> +/** =========================================================================
> + * SA query call backs for the sa_bind_handle
> + */
> +static void perfmgr_sa_mad_recv_cb(osm_madw_t * p_madw, void *bind_context,
> +				   osm_madw_t * p_req_madw)
> +{
> +	osm_perfmgr_t *pm = (osm_perfmgr_t *) bind_context;
> +	ib_sa_mad_t *sa_mad;
> +	int num_results;
> +	int i;
> +
> +	OSM_LOG_ENTER(pm->log);
> +
> +	osm_madw_copy_context(p_madw, p_req_madw);
> +	osm_mad_pool_put(pm->mad_pool, p_req_madw);
> +
> +	sa_mad = osm_madw_get_sa_mad_ptr(p_madw);
> +
> +	num_results = (p_madw->mad_size - IB_SA_MAD_HDR_SIZE) /
> +				(sa_mad->attr_offset << 3);
> +
> +	for (i = 0; i < num_results; i++) {
> +		ib_path_rec_t *pr = (ib_path_rec_t *)
> +				(sa_mad->data + (i*sizeof(ib_path_rec_t)));
> +
> +		/* only want reversible paths */
> +		if ((pr->num_path & 0x80) == 0)

Shouldn't this just be part of the query and wouldn't need checking here ?

> +			continue;
> +
> +		insert_pr_map(pm, pr);
> +	}
> +
> +	osm_mad_pool_put(pm->mad_pool, p_madw);
> +	pm->pr_query_outstanding = 0;
> +
> +	OSM_LOG_EXIT(pm->log);
> +}
> +
> +static void perfmgr_sa_mad_send_err_cb(void *bind_context, osm_madw_t * p_madw)
> +{
> +	osm_perfmgr_t *pm = (osm_perfmgr_t *) bind_context;
> +	OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 540D: PM PathRecord query "
> +		"failed; sm LID %u MAD TID 0x%" PRIx64 "\n",
> +		cl_ntoh16(p_madw->mad_addr.dest_lid),
> +		cl_ntoh64(p_madw->p_mad->trans_id));
> +	pm->pr_query_outstanding = -1;
> +}
> +
> +static void create_half_world_query(osm_perfmgr_t *pm, ib_sa_mad_t *sa_mad)
> +{
> +	ib_path_rec_t *pr = (ib_path_rec_t *)sa_mad->data;
> +
> +	sa_mad->base_ver = 1;
> +	sa_mad->mgmt_class = IB_MCLASS_SUBN_ADM;
> +	sa_mad->class_ver = 2;
> +	sa_mad->method = IB_MAD_METHOD_GETTABLE;
> +	sa_mad->status = 0;
> +	sa_mad->trans_id =
> +	    cl_hton64((uint64_t) cl_atomic_inc(&pm->trans_id) &
> +		      (uint64_t) (0xFFFFFFFF));
> +	if (sa_mad->trans_id == 0)
> +		sa_mad->trans_id =
> +		    cl_hton64((uint64_t) cl_atomic_inc(&pm->trans_id) &
> +			      (uint64_t) (0xFFFFFFFF));
> +	sa_mad->attr_id = IB_MAD_ATTR_PATH_RECORD;
> +	sa_mad->attr_mod = 0;
> +
> +	pr->slid = osm_port_get_base_lid(osm_get_port_by_guid(pm->subn,
> +							pm->port_guid));
> +	sa_mad->comp_mask = IB_PR_COMPMASK_SLID;

Although OpenSM supports this, it would be best to have this as
compliant query which requires NumbPath and SGID. Also, previously
discussed adding in Reversible.

> +}
> +
> +static int send_sa_pr_query(osm_perfmgr_t *pm)
> +{
> +	ib_sa_mad_t *sa_mad = NULL;
> +	osm_madw_t *p_madw = NULL;
> +	ib_net16_t smlid;
> +	uint8_t smsl;
> +
> +	if (get_sm_info(pm, &smlid, &smsl) < 0) {
> +	        OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 54FE: "
> +	                "PM failed to find SM LID & SL for PR query\n");
> +		return (-1);
> +	}
> +
> +	p_madw = osm_mad_pool_get(pm->mad_pool, pm->sa_bind_handle,
> +				  MAD_BLOCK_SIZE, NULL);
> +	if (p_madw == NULL)
> +		return -1;
> +
> +	sa_mad = osm_madw_get_sa_mad_ptr(p_madw);
> +
> +	create_half_world_query(pm, sa_mad);
> +
> +	p_madw->mad_addr.dest_lid = smlid;
> +	p_madw->mad_addr.addr_type.gsi.remote_qp = 1;
> +	p_madw->mad_addr.addr_type.gsi.remote_qkey =
> +	    cl_hton32(IB_QP1_WELL_KNOWN_Q_KEY);
> +	p_madw->mad_addr.addr_type.gsi.pkey_ix = 0;
> +	p_madw->mad_addr.addr_type.gsi.service_level = smsl;
> +	p_madw->mad_addr.addr_type.gsi.global_route = FALSE;
> +	p_madw->resp_expected = TRUE;
> +
> +	if (osm_vendor_send(pm->sa_bind_handle, p_madw, TRUE)
> +	    != IB_SUCCESS)
> +		return (-1);
> +
> +	return (0);
> +}
> +
> +static int get_internal_pr(osm_perfmgr_t *pm)
> +{
> +	ib_sa_mad_t sa_mad;
> +	const osm_alias_guid_t *p_src_alias_guid, *p_dest_alias_guid;
> +	const osm_port_t *p_src_port, *p_dest_port;
> +	const ib_gid_t *p_sgid = NULL, *p_dgid = NULL;
> +	osm_port_t *p_local_port;
> +	cl_qlist_t pr_list;
> +	cl_list_item_t *item;
> +	unsigned num_rec, i;
> +
> +	create_half_world_query(pm, &sa_mad);
> +

Doesn't the SMDB RO lock needs to be held here or is it already held
when reaching here ?

> +	osm_pr_get_end_points(&pm->osm->sa, &sa_mad,
> +			&p_src_alias_guid, &p_dest_alias_guid,
> +			&p_src_port, &p_dest_port,
> +			&p_sgid, &p_dgid);
> +
> +	cl_qlist_init(&pr_list);
> +	p_local_port = osm_get_port_by_guid(pm->subn, pm->port_guid);
> +
> +	/* Get all alias GUIDs for the src port */
> +	p_src_alias_guid = (osm_alias_guid_t *) cl_qmap_head(&pm->subn->alias_port_guid_tbl);
> +	while (p_src_alias_guid !=
> +	       (osm_alias_guid_t *) cl_qmap_end(&pm->subn->alias_port_guid_tbl)) {
> +
> +		if (osm_get_port_by_alias_guid(pm->subn, p_src_alias_guid->alias_guid)
> +		    == p_src_port) {

Only base port GUIDs need checking.

> +			osm_pr_process_half(&pm->osm->sa, &sa_mad, p_local_port,
> +						p_src_alias_guid, p_dest_alias_guid,
> +						p_sgid, p_dgid, &pr_list);
> +		}
> +
> +		p_src_alias_guid = (osm_alias_guid_t *) cl_qmap_next(&p_src_alias_guid->map_item);
> +	}
> +

SMDB RO lock would be released here if it's grabbed above.

> +	num_rec = cl_qlist_count(&pr_list);
> +	for (i = 0; i < num_rec; i++) {
> +		ib_path_rec_t *pr;
> +		item = cl_qlist_remove_head(&pr_list);
> +		pr = (ib_path_rec_t *)((osm_sa_item_t *)item)->resp.data;
> +
> +		/* only want reversible paths */
> +		if ((pr->num_path & 0x80) == 0)
> +			continue;
> +
> +		insert_pr_map(pm, pr);
> +		free(item);
> +	}
> +	pm->pr_query_outstanding = 0;
> +	return (0);
> +}
> +
> +static ib_path_rec_t * get_pr_from_pr_map(osm_perfmgr_t *pm, ib_net16_t dlid)
> +{
> +	cl_map_item_t *mi;
> +	if ((mi = cl_qmap_get(&pm->path_rec_map, (uint64_t)dlid)) !=
> +	     cl_qmap_end(&pm->path_rec_map)) {
> +		pr_map_item_t *pr = (pr_map_item_t *)mi;
> +		return (&pr->pr);
> +	}
> +	return (NULL);
> +}
> +
> +static int8_t get_sl(osm_perfmgr_t *pm, monitored_node_t * mon_node, uint8_t port)
> +{
> +	uint16_t dlid;
> +	ib_path_rec_t *pr;
> +
> +	if (!mon_node || port >= mon_node->num_ports)
> +		return (-1);
> +
> +	dlid = mon_node->port[port].redirection ?
> +				mon_node->port[port].lid :
> +				mon_node->port[port].orig_lid;
> +	pr = get_pr_from_pr_map(pm, dlid);
> +	if (pr) {
> +		OSM_LOG(pm->log, OSM_LOG_DEBUG, "PM %s port %d -> SL 0x%x\n",
> +			mon_node->name, port, ib_path_rec_sl(pr));
> +		return ((int8_t)ib_path_rec_sl(pr));
> +	}
> +
> +	OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 54FD: "
> +		"PM failed to find SL for %s port %d\n",
> +		mon_node->name, port);
> +	return (-1);
> +}
> +
>  static ib_net16_t get_base_lid(osm_node_t * p_node, uint8_t port)
>  {
>  	switch (p_node->node_info.node_type) {
> @@ -683,6 +953,7 @@ static void perfmgr_query_counters(cl_map_item_t * p_map_item, void *context)
>  	/* issue the query for each port */
>  	for (port = mon_node->esp0 ? 0 : 1; port < num_ports; port++) {
>  		ib_net16_t lid;
> +		int8_t sl;
>  
>  		if (!osm_node_get_physp_ptr(node, port))
>  			continue;
> @@ -700,6 +971,9 @@ static void perfmgr_query_counters(cl_map_item_t * p_map_item, void *context)
>  		}
>  
>  		remote_qp = get_qp(mon_node, port);
> +		sl = get_sl(pm, mon_node, port);
> +		if (sl < 0)
> +			continue;
>  
>  		mad_context.perfmgr_context.node_guid = node_guid;
>  		mad_context.perfmgr_context.port = port;
> @@ -709,7 +983,7 @@ static void perfmgr_query_counters(cl_map_item_t * p_map_item, void *context)
>  			status = perfmgr_send_cpi_mad(pm, lid, remote_qp,
>  						mon_node->port[port].pkey_ix,
>  						port, &mad_context,
> -						0); /* FIXME SL != 0 */
> +						sl);
>  			if (status != IB_SUCCESS)
>  				OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5410: "
>  					"Failed to issue ClassPortInfo query "
> @@ -733,7 +1007,7 @@ static void perfmgr_query_counters(cl_map_item_t * p_map_item, void *context)
>  						     port, IB_MAD_METHOD_GET,
>  						     0xffff,
>  						     &mad_context,
> -						     0); /* FIXME SL != 0 */
> +						     sl);
>  			if (status != IB_SUCCESS)
>  				OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5409: "
>  					"Failed to issue port counter query for node 0x%"
> @@ -751,7 +1025,7 @@ static void perfmgr_query_counters(cl_map_item_t * p_map_item, void *context)
>  							      port,
>  							      IB_MAD_METHOD_GET,
>  							      &mad_context,
> -							      0); /* FIXME SL != 0 */
> +							      sl);
>  				if (status != IB_SUCCESS)
>  					OSM_LOG(pm->log, OSM_LOG_ERROR,
>  						"ERR 5417: Failed to issue "
> @@ -1007,8 +1281,7 @@ void osm_perfmgr_process(osm_perfmgr_t * pm)
>  	pm->sweep_state = PERFMGR_SWEEP_ACTIVE;
>  	cl_spinlock_release(&pm->lock);
>  
> -	if (pm->subn->sm_state == IB_SMINFO_STATE_STANDBY ||
> -	    pm->subn->sm_state == IB_SMINFO_STATE_NOTACTIVE)
> +	if (sm_not_active(pm))
>  		perfmgr_discovery(pm->subn->p_osm);
>  
>  	/* if redirection enabled, determine local port */
> @@ -1034,6 +1307,18 @@ void osm_perfmgr_process(osm_perfmgr_t * pm)
>  #ifdef ENABLE_OSM_PERF_MGR_PROFILE
>  	gettimeofday(&before, NULL);
>  #endif
> +	pm->pr_query_outstanding = 1;
> +	if (sm_not_active(pm)) {
> +		/* FIXME register for UnPath/RePath rather than reissue query */
> +		if (send_sa_pr_query(pm)) {
> +			OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 542F: "
> +					"PM PathRecord query send failed\n");
> +			pm->pr_query_outstanding = -1;
> +		}
> +	} else {
> +		get_internal_pr(pm);
> +	}
> +
>  	/* With the global lock held, collect the node guids */
>  	/* FIXME we should be able to track SA notices
>  	 * and not have to sweep the node_guid_tbl each pass
> @@ -1043,8 +1328,15 @@ void osm_perfmgr_process(osm_perfmgr_t * pm)
>  	cl_qmap_apply_func(&pm->subn->node_guid_tbl, collect_guids, pm);
>  	cl_plock_release(&pm->osm->lock);
>  
> -	/* then for each node query their counters */
> -	cl_qmap_apply_func(&pm->monitored_map, perfmgr_query_counters, pm);
> +	/* Wait for PR query to complete */
> +	while(pm->pr_query_outstanding == 1)
> +		;

A better way to wait for PR response/timeout should be used.

-- Hal

> +
> +	if (pm->pr_query_outstanding == 0) {
> +		cl_qmap_apply_func(&pm->monitored_map, perfmgr_query_counters, pm);
> +	} else {
> +		pm->pr_query_outstanding = 0;
> +	}
>  
>  	/* clean out any nodes found to be removed during the sweep */
>  	remove_marked_nodes(pm);
> @@ -1235,6 +1527,7 @@ static void perfmgr_check_overflow(osm_perfmgr_t * pm,
>  	     counter_overflow_32(pc->rcv_pkts)))) {
>  		osm_node_t *p_node = NULL;
>  		ib_net16_t lid = 0;
> +		int8_t sl;
>  
>  		if (!mon_node->port[port].valid)
>  			goto Exit;
> @@ -1244,6 +1537,9 @@ static void perfmgr_check_overflow(osm_perfmgr_t * pm,
>  			   ") port %d; clearing counters\n",
>  			   mon_node->name, mon_node->guid, port);
>  
> +		if ((sl = get_sl(pm, mon_node, port)) < 0)
> +			goto Exit;
> +
>  		cl_plock_acquire(&pm->osm->lock);
>  		p_node =
>  		    osm_get_node_by_guid(pm->subn, cl_hton64(mon_node->guid));
> @@ -1276,8 +1572,7 @@ static void perfmgr_check_overflow(osm_perfmgr_t * pm,
>  		status = perfmgr_send_pc_mad(pm, lid, remote_qp, pkey_ix,
>  					     port, IB_MAD_METHOD_SET,
>  					     counter_select,
> -					     &mad_context,
> -					     0); /* FIXME SL != 0 */
> +					     &mad_context, sl);
>  		if (status != IB_SUCCESS)
>  			OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 5411: "
>  				"Failed to send clear counters MAD for %s (0x%"
> @@ -1320,6 +1615,7 @@ static void perfmgr_check_pce_overflow(osm_perfmgr_t * pm,
>  	    counter_overflow_64(pc->multicast_rcv_pkts)))) {
>  		osm_node_t *p_node = NULL;
>  		ib_net16_t lid = 0;
> +		int8_t sl;
>  
>  		if (!mon_node->port[port].valid)
>  			goto Exit;
> @@ -1329,6 +1625,9 @@ static void perfmgr_check_pce_overflow(osm_perfmgr_t * pm,
>  			PRIx64 ") port %d; clearing counters\n",
>  			mon_node->name, mon_node->guid, port);
>  
> +		if ((sl = get_sl(pm, mon_node, port)) < 0)
> +			goto Exit;
> +
>  		cl_plock_acquire(&pm->osm->lock);
>  		p_node =
>  		    osm_get_node_by_guid(pm->subn, cl_hton64(mon_node->guid));
> @@ -1350,8 +1649,7 @@ static void perfmgr_check_pce_overflow(osm_perfmgr_t * pm,
>  		/* clear port counters */
>  		status = perfmgr_send_pce_mad(pm, lid, remote_qp, pkey_ix,
>  					      port, IB_MAD_METHOD_SET,
> -					      &mad_context,
> -					      0); /* FIXME SL != 0 */
> +					      &mad_context, sl);
>  		if (status != IB_SUCCESS)
>  			OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 5419: "
>  				"Failed to send clear counters MAD for %s (0x%"
> @@ -1475,6 +1773,7 @@ static boolean_t handle_redirect(osm_perfmgr_t *pm,
>  	boolean_t valid = TRUE;
>  	int16_t pkey_ix = 0;
>  	uint8_t mad_method;
> +	int8_t sl;
>  
>  	OSM_LOG(pm->log, OSM_LOG_VERBOSE,
>  		"Redirection to LID %u GID %s QP 0x%x received\n",
> @@ -1528,6 +1827,12 @@ static boolean_t handle_redirect(osm_perfmgr_t *pm,
>  	if (!valid)
>  		goto Exit;
>  
> +	sl = get_sl(pm, p_mon_node, port);
> +	if (sl < 0) {
> +		valid = FALSE;
> +		goto Exit;
> +	}
> +
>  	/* LID redirection support (easier than GID redirection) */
>  	cl_plock_acquire(&pm->osm->lock);
>  	p_mon_node->port[port].redirection = TRUE;
> @@ -1550,7 +1855,7 @@ static boolean_t handle_redirect(osm_perfmgr_t *pm,
>  		status = perfmgr_send_cpi_mad(pm, cpi->redir_lid,
>  						cpi->redir_qp, pkey_ix,
>  						port, mad_context,
> -						0); /* FIXME SL != 0 */
> +						sl);
>  	} else {
>  		/* reissue the original query to the redirected location */
>  		mad_method = mad_context->perfmgr_context.mad_method;
> @@ -1561,14 +1866,14 @@ static boolean_t handle_redirect(osm_perfmgr_t *pm,
>  						     mad_method,
>  						     0xffff,
>  						     mad_context,
> -						     0); /* FIXME SL != 0 */
> +						     sl);
>  		} else {
>  			status = perfmgr_send_pce_mad(pm, cpi->redir_lid,
>  						      cpi->redir_qp,
>  						      pkey_ix, port,
>  						      mad_method,
>  						      mad_context,
> -						      0); /* FIXME SL != 0 */
> +						      sl);
>  		}
>  	}
>  	if (status != IB_SUCCESS)

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

       reply	other threads:[~2013-03-19 16:33 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <51485F74.1010701@dev.mellanox.co.il>
     [not found] ` <51485F74.1010701-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2013-03-19 16:33   ` Hal Rosenstock [this message]
     [not found]     ` <5148936C.4010605-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2013-03-20  1:00       ` [PATCH 07/07] opensm/perfmgr: add sl support Weiny, Ira
     [not found]         ` <2807E5FD2F6FDA4886F6618EAC48510EBB3F3B-8k97q/ur5Z1cIJlls4ac1rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2013-03-21 15:00           ` Hal Rosenstock
2013-03-01  1:09 Ira Weiny

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5148936C.4010605@dev.mellanox.co.il \
    --to=hal-ldsdmyg8hgv8yrgs2mwiifqbs+8scbdb@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.