On 2/21/2013 4:33 PM, Ira Weiny wrote:
>
>
> Signed-off-by: Ira Weiny <[email protected]>
> ---
> opensm/osm_perfmgr.c | 200
> ++++++++++++++++++++++++--------------------------
> 1 files changed, 96 insertions(+), 104 deletions(-)
>
> diff --git a/opensm/osm_perfmgr.c b/opensm/osm_perfmgr.c
> index c71111f..69b3d77 100644
> --- a/opensm/osm_perfmgr.c
> +++ b/opensm/osm_perfmgr.c
> @@ -1263,6 +1263,96 @@ Exit:
> return pkey_ix;
> }
>
> +static void handle_redirect(osm_perfmgr_t *pm,
> + ib_class_port_info_t *cpi,
> + monitored_node_t *p_mon_node,
> + uint8_t port,
> + osm_madw_context_t *mad_context)
> +{
> + char gid_str[INET6_ADDRSTRLEN];
> + ib_api_status_t status;
> + boolean_t valid = TRUE;
> + int16_t pkey_ix = 0;
> +
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> + "Redirection to LID %u GID %s QP 0x%x received\n",
> + cl_ntoh16(cpi->redir_lid),
> + inet_ntop(AF_INET6, cpi->redir_gid.raw, gid_str,
> + sizeof gid_str), cl_ntoh32(cpi->redir_qp));
> +
> + if (!pm->subn->opt.perfmgr_redir) {
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> + "Redirection requested but disabled\n");
> + valid = FALSE;
> + }
> +
> + /* valid redirection ? */
> + if (cpi->redir_lid == 0) {
> + if (!ib_gid_is_notzero(&cpi->redir_gid)) {
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> + "Invalid redirection "
> + "(both redirect LID and GID are zero)\n");
> + valid = FALSE;
> + }
> + }
> + if (cpi->redir_qp == 0) {
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid RedirectQP\n");
> + valid = FALSE;
> + }
> + if (cpi->redir_pkey == 0) {
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid RedirectP_Key\n");
> + valid = FALSE;
> + }
> + if (cpi->redir_qkey != IB_QP1_WELL_KNOWN_Q_KEY) {
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid RedirectQ_Key\n");
> + valid = FALSE;
> + }
> +
> + pkey_ix = validate_redir_pkey(pm, cpi->redir_pkey);
> + if (pkey_ix == -1) {
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> + "Index for Pkey 0x%x not found\n",
> + cl_ntoh16(cpi->redir_pkey));
> + valid = FALSE;
> + }
> +
> + if (cpi->redir_lid == 0) {
> + /* GID redirection: get PathRecord information */
> + OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> + "GID redirection not currently supported\n");
> + return;
> + }
> +
Better with:
if (!valid)
return;
here ?
> + /* LID redirection support (easier than GID redirection) */
> + cl_plock_acquire(&pm->osm->lock);
Port number is already validated before handle_redirect is called, right ?
> + p_mon_node->port[port].redirection = TRUE;
> + p_mon_node->port[port].valid = valid;
> + memcpy(&p_mon_node->port[port].gid, &cpi->redir_gid,
> + sizeof(ib_gid_t));
> + p_mon_node->port[port].lid = cpi->redir_lid;
> + p_mon_node->port[port].qp = cpi->redir_qp;
> + p_mon_node->port[port].pkey = cpi->redir_pkey;
> + if (pkey_ix != -1)
> + p_mon_node->port[port].pkey_ix = pkey_ix;
Add:
p_mon_node->port[port].cpi_valid = FALSE;
here
> + cl_plock_release(&pm->osm->lock);
> +
> + if (valid) {
If check for valid above LID redirection comment, don't need if (valid)
clause here.
> + /* Finally, issue a CPI query to the redirected location */
> + cl_plock_acquire(&pm->osm->lock);
> + p_mon_node->port[port].cpi_valid = FALSE;
> + cl_plock_release(&pm->osm->lock);
Eliminate extra lock/unlock and move cpi_valid above where indicated.
-- Hal
> + status = perfmgr_send_cpi_mad(pm, cpi->redir_lid,
> + cpi->redir_qp, pkey_ix,
> + port, mad_context,
> + 0); /* FIXME SL != 0 */
> + if (status != IB_SUCCESS)
> + OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5414: "
> + "Failed to send redirected CPI MAD "
> + "for node %s (0x%" PRIx64 ") port %d\n",
> + p_mon_node->name, p_mon_node->guid, port);
> + }
> +}
> +
> /**********************************************************************
> * The dispatcher uses a thread pool which will call this function when
> * there is a thread available to process the mad received on the wire.
> @@ -1281,8 +1371,6 @@ static void pc_recv_process(void *context, void *data)
> perfmgr_db_data_cnt_reading_t data_reading;
> cl_map_item_t *p_node;
> monitored_node_t *p_mon_node;
> - int16_t pkey_ix = 0;
> - boolean_t valid = TRUE;
> ib_class_port_info_t *cpi = NULL;
>
> OSM_LOG_ENTER(pm->log);
> @@ -1334,112 +1422,15 @@ static void pc_recv_process(void *context, void
> *data)
> p_mon_node->port[port].cpi_valid = TRUE;
> }
> cl_plock_release(&pm->osm->lock);
> - }
> -
> - /* Response could also be redirection (IBM eHCA PMA does this) */
> - if (p_mad->status & IB_MAD_STATUS_REDIRECT) {
> - char gid_str[INET6_ADDRSTRLEN];
> - ib_api_status_t status;
>
> - CL_ASSERT(cpi); /* Redirect should have returned CPI
> - (processed in previous block) */
> -
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> - "Redirection to LID %u GID %s QP 0x%x received\n",
> - cl_ntoh16(cpi->redir_lid),
> - inet_ntop(AF_INET6, cpi->redir_gid.raw, gid_str,
> - sizeof gid_str), cl_ntoh32(cpi->redir_qp));
> + /* Response could also be redirection (IBM eHCA PMA does this)
> */
> + if (p_mad->status & IB_MAD_STATUS_REDIRECT)
> + handle_redirect(pm, cpi, p_mon_node, port,
> + mad_context);
>
> - if (!pm->subn->opt.perfmgr_redir) {
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> - "Redirection requested but disabled\n");
> - valid = FALSE;
> - }
> -
> - /* valid redirection ? */
> - if (cpi->redir_lid == 0) {
> - if (!ib_gid_is_notzero(&cpi->redir_gid)) {
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> - "Invalid redirection "
> - "(both redirect LID and GID are
> zero)\n");
> - valid = FALSE;
> - }
> - }
> - if (cpi->redir_qp == 0) {
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid
> RedirectQP\n");
> - valid = FALSE;
> - }
> - if (cpi->redir_pkey == 0) {
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid
> RedirectP_Key\n");
> - valid = FALSE;
> - }
> - if (cpi->redir_qkey != IB_QP1_WELL_KNOWN_Q_KEY) {
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid
> RedirectQ_Key\n");
> - valid = FALSE;
> - }
> -
> - pkey_ix = validate_redir_pkey(pm, cpi->redir_pkey);
> - if (pkey_ix == -1) {
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> - "Index for Pkey 0x%x not found\n",
> - cl_ntoh16(cpi->redir_pkey));
> - valid = FALSE;
> - }
> -
> - if (cpi->redir_lid == 0) {
> - /* GID redirection: get PathRecord information */
> - OSM_LOG(pm->log, OSM_LOG_VERBOSE,
> - "GID redirection not currently supported\n");
> - goto Exit;
> - }
> -
> - /* LID redirection support (easier than GID redirection) */
> - cl_plock_acquire(&pm->osm->lock);
> - /* Now, validate port number */
> - if (port >= p_mon_node->num_ports) {
> - cl_plock_release(&pm->osm->lock);
> - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5413: "
> - "Invalid port num %d for GUID 0x%016"
> - PRIx64 " num ports %d\n", port, node_guid,
> - p_mon_node->num_ports);
> - goto Exit;
> - }
> - p_mon_node->port[port].redirection = TRUE;
> - p_mon_node->port[port].valid = valid;
> - memcpy(&p_mon_node->port[port].gid, &cpi->redir_gid,
> - sizeof(ib_gid_t));
> - p_mon_node->port[port].lid = cpi->redir_lid;
> - p_mon_node->port[port].qp = cpi->redir_qp;
> - p_mon_node->port[port].pkey = cpi->redir_pkey;
> - if (pkey_ix != -1)
> - p_mon_node->port[port].pkey_ix = pkey_ix;
> - cl_plock_release(&pm->osm->lock);
> -
> - if (!valid)
> - goto Exit;
> -
> - /* Finally, issue a CPI query to the redirected location */
> - p_mon_node->port[port].cpi_valid = FALSE;
> - status = perfmgr_send_cpi_mad(pm, cpi->redir_lid,
> - cpi->redir_qp, pkey_ix,
> - port, mad_context,
> - 0); /* FIXME SL != 0 */
> - if (status != IB_SUCCESS)
> - OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5414: "
> - "Failed to send redirected MAD "
> - "with method 0x%x for node %s "
> - "(NodeGuid 0x%" PRIx64 ") port %d\n",
> - mad_context->perfmgr_context.mad_method,
> - p_mon_node->name, node_guid, port);
> goto Exit;
> }
>
> - /* ClassPortInfo needed to process optional Redirection
> - * now exit normally
> - */
> - if (p_mad->attr_id == IB_MAD_ATTR_CLASS_PORT_INFO)
> - goto Exit;
> -
> perfmgr_db_fill_err_read(wire_read, &err_reading);
> /* FIXME separate query for extended counters if they are supported
> * on the port.
> @@ -1465,7 +1456,8 @@ static void pc_recv_process(void *context, void *data)
> perfmgr_db_clear_prev_dc(pm->db, node_guid, port);
> }
>
> - perfmgr_check_overflow(pm, p_mon_node, pkey_ix, port, wire_read);
> + perfmgr_check_overflow(pm, p_mon_node, p_mon_node->port[port].pkey_ix,
> + port, wire_read);
>
> #ifdef ENABLE_OSM_PERF_MGR_PROFILE
> do {
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html