Lines Matching +full:use +full:- +full:sw +full:- +full:pm
3 * Copyright (c) 2007-2009 Voltaire, Inc. All rights reserved.
6 * Copyright (c) 2011-2014 Mellanox Technologies LTD. All rights reserved.
14 * Redistribution and use in source and binary forms, with or
18 * - Redistributions of source code must retain the above
22 * - Redistributions in binary form must reproduce the above
33 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
88 double new = (diff->tv_sec * 1000000) + diff->tv_usec; in update_mad_stats()
113 if (tmp.tv_usec < before->tv_usec) { in diff_time()
114 tmp.tv_sec--; in diff_time()
117 diff->tv_sec = tmp.tv_sec - before->tv_sec; in diff_time()
118 diff->tv_usec = tmp.tv_usec - before->tv_usec; in diff_time()
125 static void init_monitored_nodes(osm_perfmgr_t * pm) in init_monitored_nodes() argument
127 cl_qmap_init(&pm->monitored_map); in init_monitored_nodes()
128 pm->remove_list = NULL; in init_monitored_nodes()
129 cl_event_construct(&pm->sig_query); in init_monitored_nodes()
130 cl_event_init(&pm->sig_query, FALSE); in init_monitored_nodes()
133 static void mark_for_removal(osm_perfmgr_t * pm, monitored_node_t * node) in mark_for_removal() argument
135 if (pm->remove_list) { in mark_for_removal()
136 node->next = pm->remove_list; in mark_for_removal()
137 pm->remove_list = node; in mark_for_removal()
139 node->next = NULL; in mark_for_removal()
140 pm->remove_list = node; in mark_for_removal()
144 static void remove_marked_nodes(osm_perfmgr_t * pm) in remove_marked_nodes() argument
146 while (pm->remove_list) { in remove_marked_nodes()
147 monitored_node_t *next = pm->remove_list->next; in remove_marked_nodes()
150 cl_qmap_remove_item(&pm->monitored_map, in remove_marked_nodes()
151 (cl_map_item_t *) (pm->remove_list)); in remove_marked_nodes()
153 if (pm->rm_nodes) in remove_marked_nodes()
154 perfmgr_db_delete_entry(pm->db, pm->remove_list->guid); in remove_marked_nodes()
156 perfmgr_db_mark_active(pm->db, pm->remove_list->guid, FALSE); in remove_marked_nodes()
158 if (pm->remove_list->name) in remove_marked_nodes()
159 free(pm->remove_list->name); in remove_marked_nodes()
161 for (port = pm->remove_list->esp0 ? 0 : 1; in remove_marked_nodes()
162 port < pm->remove_list->num_ports; in remove_marked_nodes()
164 if (pm->remove_list->port[port].remote_name) in remove_marked_nodes()
165 free(pm->remove_list->port[port].remote_name); in remove_marked_nodes()
168 free(pm->remove_list); in remove_marked_nodes()
169 pm->remove_list = next; in remove_marked_nodes()
173 static inline void decrement_outstanding_queries(osm_perfmgr_t * pm) in decrement_outstanding_queries() argument
175 cl_atomic_dec(&pm->outstanding_queries); in decrement_outstanding_queries()
177 if (!pm->outstanding_queries) { in decrement_outstanding_queries()
178 cl_spinlock_acquire(&pm->lock); in decrement_outstanding_queries()
179 if (pm->sweep_state == PERFMGR_SWEEP_POST_PROCESSING) { in decrement_outstanding_queries()
180 pm->sweep_state = PERFMGR_SWEEP_SLEEP; in decrement_outstanding_queries()
181 OSM_LOG(pm->log, OSM_LOG_INFO, in decrement_outstanding_queries()
182 "PM sweep state exiting Post Processing\n"); in decrement_outstanding_queries()
184 cl_spinlock_release(&pm->lock); in decrement_outstanding_queries()
187 cl_event_signal(&pm->sig_query); in decrement_outstanding_queries()
197 osm_perfmgr_t *pm = (osm_perfmgr_t *) bind_context; in perfmgr_mad_recv_callback() local
199 OSM_LOG_ENTER(pm->log); in perfmgr_mad_recv_callback()
205 osm_mad_pool_put(pm->mad_pool, p_req_madw); in perfmgr_mad_recv_callback()
207 decrement_outstanding_queries(pm); in perfmgr_mad_recv_callback()
210 if (cl_disp_post(pm->pc_disp_h, OSM_MSG_MAD_PORT_COUNTERS, in perfmgr_mad_recv_callback()
212 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5401: " in perfmgr_mad_recv_callback()
214 osm_mad_pool_put(pm->mad_pool, p_madw); in perfmgr_mad_recv_callback()
216 OSM_LOG_EXIT(pm->log); in perfmgr_mad_recv_callback()
225 osm_perfmgr_t *pm = (osm_perfmgr_t *) bind_context; in perfmgr_mad_send_err_callback() local
226 osm_madw_context_t *context = &p_madw->context; in perfmgr_mad_send_err_callback()
227 uint64_t node_guid = context->perfmgr_context.node_guid; in perfmgr_mad_send_err_callback()
228 uint8_t port = context->perfmgr_context.port; in perfmgr_mad_send_err_callback()
233 OSM_LOG_ENTER(pm->log); in perfmgr_mad_send_err_callback()
239 if ((p_node = cl_qmap_get(&pm->monitored_map, node_guid)) == in perfmgr_mad_send_err_callback()
240 cl_qmap_end(&pm->monitored_map)) { in perfmgr_mad_send_err_callback()
241 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5415: GUID 0x%016" in perfmgr_mad_send_err_callback()
247 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5402: %s (0x%" PRIx64 in perfmgr_mad_send_err_callback()
249 p_mon_node->name, p_mon_node->guid, port, in perfmgr_mad_send_err_callback()
250 cl_ntoh16(p_madw->mad_addr.dest_lid), in perfmgr_mad_send_err_callback()
251 cl_ntoh64(p_madw->p_mad->trans_id)); in perfmgr_mad_send_err_callback()
253 if (pm->subn->opt.perfmgr_redir && p_madw->status == IB_TIMEOUT) { in perfmgr_mad_send_err_callback()
255 cl_plock_acquire(&pm->osm->lock); in perfmgr_mad_send_err_callback()
257 if (port >= p_mon_node->num_ports) { in perfmgr_mad_send_err_callback()
258 cl_plock_release(&pm->osm->lock); in perfmgr_mad_send_err_callback()
259 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5416: " in perfmgr_mad_send_err_callback()
262 p_mon_node->name, p_mon_node->guid, in perfmgr_mad_send_err_callback()
263 p_mon_node->num_ports); in perfmgr_mad_send_err_callback()
267 orig_lid = p_mon_node->port[port].orig_lid; in perfmgr_mad_send_err_callback()
268 memset(&p_mon_node->port[port], 0, sizeof(monitored_port_t)); in perfmgr_mad_send_err_callback()
269 p_mon_node->port[port].orig_lid = orig_lid; in perfmgr_mad_send_err_callback()
270 p_mon_node->port[port].valid = TRUE; in perfmgr_mad_send_err_callback()
271 cl_plock_release(&pm->osm->lock); in perfmgr_mad_send_err_callback()
275 osm_mad_pool_put(pm->mad_pool, p_madw); in perfmgr_mad_send_err_callback()
277 decrement_outstanding_queries(pm); in perfmgr_mad_send_err_callback()
279 OSM_LOG_EXIT(pm->log); in perfmgr_mad_send_err_callback()
285 ib_api_status_t osm_perfmgr_bind(osm_perfmgr_t * pm, ib_net64_t port_guid) in osm_perfmgr_bind() argument
290 OSM_LOG_ENTER(pm->log); in osm_perfmgr_bind()
292 if (pm->bind_handle != OSM_BIND_INVALID_HANDLE) { in osm_perfmgr_bind()
293 OSM_LOG(pm->log, OSM_LOG_ERROR, in osm_perfmgr_bind()
299 bind_info.port_guid = pm->port_guid = port_guid; in osm_perfmgr_bind()
307 bind_info.timeout = pm->subn->opt.transaction_timeout; in osm_perfmgr_bind()
308 bind_info.retries = pm->subn->opt.transaction_retries; in osm_perfmgr_bind()
310 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in osm_perfmgr_bind()
313 pm->bind_handle = osm_vendor_bind(pm->vendor, &bind_info, pm->mad_pool, in osm_perfmgr_bind()
315 perfmgr_mad_send_err_callback, pm); in osm_perfmgr_bind()
317 if (pm->bind_handle == OSM_BIND_INVALID_HANDLE) { in osm_perfmgr_bind()
319 OSM_LOG(pm->log, OSM_LOG_ERROR, in osm_perfmgr_bind()
325 OSM_LOG_EXIT(pm->log); in osm_perfmgr_bind()
332 static void perfmgr_mad_unbind(osm_perfmgr_t * pm) in perfmgr_mad_unbind() argument
334 OSM_LOG_ENTER(pm->log); in perfmgr_mad_unbind()
335 if (pm->bind_handle == OSM_BIND_INVALID_HANDLE) { in perfmgr_mad_unbind()
336 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5405: No previous bind\n"); in perfmgr_mad_unbind()
339 osm_vendor_unbind(pm->bind_handle); in perfmgr_mad_unbind()
341 OSM_LOG_EXIT(pm->log); in perfmgr_mad_unbind()
351 if (mon_node && mon_node->num_ports && port < mon_node->num_ports && in get_qp()
352 mon_node->port[port].redirection && mon_node->port[port].qp) in get_qp()
353 qp = mon_node->port[port].qp; in get_qp()
360 switch (p_node->node_info.node_type) { in get_base_lid()
378 if (mon_node && mon_node->num_ports && port < mon_node->num_ports && in get_lid()
379 mon_node->port[port].lid) in get_lid()
380 return mon_node->port[port].lid; in get_lid()
401 OSM_LOG_ENTER(perfmgr->log); in perfmgr_build_mad()
403 p_madw = osm_mad_pool_get(perfmgr->mad_pool, perfmgr->bind_handle, in perfmgr_build_mad()
411 pm_mad->header.base_ver = 1; in perfmgr_build_mad()
412 pm_mad->header.mgmt_class = IB_MCLASS_PERF; in perfmgr_build_mad()
413 pm_mad->header.class_ver = 1; in perfmgr_build_mad()
414 pm_mad->header.method = mad_method; in perfmgr_build_mad()
415 pm_mad->header.status = 0; in perfmgr_build_mad()
416 pm_mad->header.class_spec = 0; in perfmgr_build_mad()
417 pm_mad->header.trans_id = in perfmgr_build_mad()
418 cl_hton64((uint64_t) cl_atomic_inc(&perfmgr->trans_id) & in perfmgr_build_mad()
420 if (perfmgr->trans_id == 0) in perfmgr_build_mad()
421 pm_mad->header.trans_id = in perfmgr_build_mad()
422 cl_hton64((uint64_t) cl_atomic_inc(&perfmgr->trans_id) & in perfmgr_build_mad()
424 pm_mad->header.attr_id = attr_id; in perfmgr_build_mad()
425 pm_mad->header.resv = 0; in perfmgr_build_mad()
426 pm_mad->header.attr_mod = 0; in perfmgr_build_mad()
428 p_madw->mad_addr.dest_lid = dest_lid; in perfmgr_build_mad()
429 p_madw->mad_addr.addr_type.gsi.remote_qp = dest_qp; in perfmgr_build_mad()
430 p_madw->mad_addr.addr_type.gsi.remote_qkey = in perfmgr_build_mad()
432 p_madw->mad_addr.addr_type.gsi.pkey_ix = pkey_ix; in perfmgr_build_mad()
433 p_madw->mad_addr.addr_type.gsi.service_level = sl; in perfmgr_build_mad()
434 p_madw->mad_addr.addr_type.gsi.global_route = FALSE; in perfmgr_build_mad()
435 p_madw->resp_expected = TRUE; in perfmgr_build_mad()
438 p_madw->context = *p_context; in perfmgr_build_mad()
443 OSM_LOG_EXIT(perfmgr->log); in perfmgr_build_mad()
455 ib_api_status_t status = osm_vendor_send(perfmgr->bind_handle, p_madw, in perfmgr_send_mad()
459 cl_atomic_inc(&(perfmgr->outstanding_queries)); in perfmgr_send_mad()
460 while (perfmgr->outstanding_queries > in perfmgr_send_mad()
461 (int32_t)perfmgr->max_outstanding_queries) { in perfmgr_send_mad()
462 cl_spinlock_acquire(&perfmgr->lock); in perfmgr_send_mad()
463 if (perfmgr->sweep_state == PERFMGR_SWEEP_SLEEP) { in perfmgr_send_mad()
464 perfmgr->sweep_state = PERFMGR_SWEEP_POST_PROCESSING; in perfmgr_send_mad()
465 OSM_LOG(perfmgr->log, OSM_LOG_INFO, in perfmgr_send_mad()
466 "PM sweep state going into Post Processing\n"); in perfmgr_send_mad()
467 } else if (perfmgr->sweep_state == PERFMGR_SWEEP_ACTIVE) in perfmgr_send_mad()
468 perfmgr->sweep_state = PERFMGR_SWEEP_SUSPENDED; in perfmgr_send_mad()
469 cl_spinlock_release(&perfmgr->lock); in perfmgr_send_mad()
471 sts = cl_event_wait_on(&perfmgr->sig_query, in perfmgr_send_mad()
476 cl_spinlock_acquire(&perfmgr->lock); in perfmgr_send_mad()
477 if (perfmgr->sweep_state == PERFMGR_SWEEP_SUSPENDED) in perfmgr_send_mad()
478 perfmgr->sweep_state = PERFMGR_SWEEP_ACTIVE; in perfmgr_send_mad()
479 cl_spinlock_release(&perfmgr->lock); in perfmgr_send_mad()
503 OSM_LOG_ENTER(perfmgr->log); in perfmgr_send_pc_mad()
505 p_context->perfmgr_context.mad_attr_id = IB_MAD_ATTR_PORT_CNTRS; in perfmgr_send_pc_mad()
512 port_counter = (ib_port_counters_t *) & pm_mad->data; in perfmgr_send_pc_mad()
514 port_counter->port_select = port; in perfmgr_send_pc_mad()
515 port_counter->counter_select = cl_hton16(counter_select); in perfmgr_send_pc_mad()
516 port_counter->counter_select2 = counter_select2; in perfmgr_send_pc_mad()
520 OSM_LOG_EXIT(perfmgr->log); in perfmgr_send_pc_mad()
530 uint64_t node_guid = cl_ntoh64(node->node_info.node_guid); in collect_guids()
531 osm_perfmgr_t *pm = (osm_perfmgr_t *) context; in collect_guids() local
536 OSM_LOG_ENTER(pm->log); in collect_guids()
538 if (cl_qmap_get(&pm->monitored_map, node_guid) == in collect_guids()
539 cl_qmap_end(&pm->monitored_map)) { in collect_guids()
541 if (pm->ignore_cas && in collect_guids()
542 (node->node_info.node_type == IB_NODE_TYPE_CA)) in collect_guids()
550 OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 5406: " in collect_guids()
552 "(GUID 0x%" PRIx64 ")\n", node->print_desc, in collect_guids()
558 mon_node->guid = node_guid; in collect_guids()
559 mon_node->name = strdup(node->print_desc); in collect_guids()
560 mon_node->num_ports = num_ports; in collect_guids()
561 mon_node->node_type = node->node_info.node_type; in collect_guids()
563 mon_node->esp0 = (node->sw && in collect_guids()
564 ib_switch_info_is_enhanced_port0(&node->sw-> in collect_guids()
566 for (port = mon_node->esp0 ? 0 : 1; port < num_ports; port++) { in collect_guids()
567 monitored_port_t *mon_port = &mon_node->port[port]; in collect_guids()
568 osm_physp_t *p_physp = &node->physp_table[port]; in collect_guids()
569 osm_physp_t *p_remote_physp = p_physp->p_remote_physp; in collect_guids()
571 mon_port->orig_lid = 0; in collect_guids()
572 mon_port->valid = FALSE; in collect_guids()
574 mon_port->orig_lid = get_base_lid(node, port); in collect_guids()
575 mon_port->valid = TRUE; in collect_guids()
577 mon_port->remote_valid = FALSE; in collect_guids()
578 mon_port->remote_name = NULL; in collect_guids()
580 osm_node_t *p_remote_node = p_remote_physp->p_node; in collect_guids()
581 mon_port->remote_valid = TRUE; in collect_guids()
582 mon_port->remote_guid = p_remote_node->node_info.node_guid; in collect_guids()
583 mon_port->remote_name = strdup(p_remote_node->print_desc); in collect_guids()
584 mon_port->remote_port = p_remote_physp->port_num; in collect_guids()
588 cl_qmap_insert(&pm->monitored_map, node_guid, in collect_guids()
593 OSM_LOG_EXIT(pm->log); in collect_guids()
599 static ib_api_status_t perfmgr_send_cpi_mad(osm_perfmgr_t * pm, in perfmgr_send_cpi_mad() argument
610 OSM_LOG_ENTER(pm->log); in perfmgr_send_cpi_mad()
612 p_context->perfmgr_context.mad_attr_id = IB_MAD_ATTR_CLASS_PORT_INFO; in perfmgr_send_cpi_mad()
613 p_madw = perfmgr_build_mad(pm, dest_lid, sl, dest_qp, in perfmgr_send_cpi_mad()
620 status = perfmgr_send_mad(pm, p_madw); in perfmgr_send_cpi_mad()
622 OSM_LOG_EXIT(pm->log); in perfmgr_send_cpi_mad()
631 monitored_port_t *mon_port = &(mon_node->port[port]); in pce_supported()
632 return (mon_port->cpi_valid in pce_supported()
633 && (mon_port->cap_mask & IB_PM_EXT_WIDTH_SUPPORTED in pce_supported()
634 || mon_port->cap_mask & IB_PM_EXT_WIDTH_NOIETF_SUP)); in pce_supported()
642 monitored_port_t *mon_port = &(mon_node->port[port]); in xmit_wait_supported()
643 return (mon_port->cpi_valid in xmit_wait_supported()
644 && (mon_port->cap_mask & IB_PM_PC_XMIT_WAIT_SUP)); in xmit_wait_supported()
652 monitored_port_t *mon_port = &(mon_node->port[port]); in ietf_supported()
653 return (mon_port->cpi_valid in ietf_supported()
654 && (mon_port->cap_mask & IB_PM_EXT_WIDTH_SUPPORTED)); in ietf_supported()
673 OSM_LOG_ENTER(perfmgr->log); in perfmgr_send_pce_mad()
675 p_context->perfmgr_context.mad_attr_id = IB_MAD_ATTR_PORT_CNTRS_EXT; in perfmgr_send_pce_mad()
682 port_counter_ext = (ib_port_counters_ext_t *) & pm_mad->data; in perfmgr_send_pce_mad()
684 port_counter_ext->port_select = port; in perfmgr_send_pce_mad()
685 port_counter_ext->counter_select = cl_hton16(0x00FF); in perfmgr_send_pce_mad()
689 OSM_LOG_EXIT(perfmgr->log); in perfmgr_send_pce_mad()
699 osm_perfmgr_t *pm = context; in perfmgr_query_counters() local
707 OSM_LOG_ENTER(pm->log); in perfmgr_query_counters()
709 cl_plock_acquire(&pm->osm->lock); in perfmgr_query_counters()
710 node = osm_get_node_by_guid(pm->subn, cl_hton64(mon_node->guid)); in perfmgr_query_counters()
712 OSM_LOG(pm->log, OSM_LOG_ERROR, in perfmgr_query_counters()
715 mon_node->name, mon_node->guid); in perfmgr_query_counters()
716 mark_for_removal(pm, mon_node); in perfmgr_query_counters()
721 node_guid = cl_ntoh64(node->node_info.node_guid); in perfmgr_query_counters()
724 if (perfmgr_db_create_entry(pm->db, node_guid, mon_node->esp0, in perfmgr_query_counters()
725 num_ports, node->print_desc) != in perfmgr_query_counters()
727 OSM_LOG(pm->log, OSM_LOG_ERROR, in perfmgr_query_counters()
729 PRIx64 " (%s) : %s\n", node_guid, node->print_desc, in perfmgr_query_counters()
734 perfmgr_db_mark_active(pm->db, node_guid, TRUE); in perfmgr_query_counters()
737 for (port = mon_node->esp0 ? 0 : 1; port < num_ports; port++) { in perfmgr_query_counters()
743 if (!mon_node->port[port].valid) in perfmgr_query_counters()
748 OSM_LOG(pm->log, OSM_LOG_DEBUG, "WARN: node 0x%" PRIx64 in perfmgr_query_counters()
750 cl_ntoh64(node->node_info.node_guid), port, in perfmgr_query_counters()
751 node->print_desc); in perfmgr_query_counters()
761 if (pm->query_cpi && !mon_node->port[port].cpi_valid) { in perfmgr_query_counters()
762 status = perfmgr_send_cpi_mad(pm, lid, remote_qp, in perfmgr_query_counters()
763 mon_node->port[port].pkey_ix, in perfmgr_query_counters()
767 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5410: " in perfmgr_query_counters()
771 node->node_info.node_guid, port, in perfmgr_query_counters()
772 node->print_desc); in perfmgr_query_counters()
773 if (mon_node->node_type == IB_NODE_TYPE_SWITCH) in perfmgr_query_counters()
781 OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Getting stats for node 0x%" in perfmgr_query_counters()
784 node->print_desc); in perfmgr_query_counters()
785 status = perfmgr_send_pc_mad(pm, lid, remote_qp, in perfmgr_query_counters()
786 mon_node->port[port].pkey_ix, in perfmgr_query_counters()
793 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5409: " in perfmgr_query_counters()
796 node->node_info.node_guid, port, in perfmgr_query_counters()
797 node->print_desc); in perfmgr_query_counters()
804 status = perfmgr_send_pce_mad(pm, lid, remote_qp, in perfmgr_query_counters()
805 mon_node->port[port].pkey_ix, in perfmgr_query_counters()
811 OSM_LOG(pm->log, OSM_LOG_ERROR, in perfmgr_query_counters()
816 node->node_info.node_guid, in perfmgr_query_counters()
818 node->print_desc); in perfmgr_query_counters()
823 cl_plock_release(&pm->osm->lock); in perfmgr_query_counters()
824 OSM_LOG_EXIT(pm->log); in perfmgr_query_counters()
847 port_guid = sm->p_subn->sm_port_guid; in sweep_hop_1()
849 p_port = osm_get_port_by_guid(sm->p_subn, port_guid); in sweep_hop_1()
851 OSM_LOG(sm->p_log, OSM_LOG_ERROR, in sweep_hop_1()
853 return -1; in sweep_hop_1()
856 p_node = p_port->p_node; in sweep_hop_1()
857 port_num = ib_node_info_get_local_port_num(&p_node->node_info); in sweep_hop_1()
859 OSM_LOG(sm->p_log, OSM_LOG_DEBUG, in sweep_hop_1()
864 * Currently - legal nodes that can host SM are SW and CA */ in sweep_hop_1()
875 CL_PLOCK_ACQUIRE(sm->p_lock); in sweep_hop_1()
878 CL_PLOCK_RELEASE(sm->p_lock); in sweep_hop_1()
881 OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 5482: " in sweep_hop_1()
898 (&p_ext_physp->port_info) <= IB_LINK_DOWN) in sweep_hop_1()
909 CL_PLOCK_ACQUIRE(sm->p_lock); in sweep_hop_1()
913 CL_PLOCK_RELEASE(sm->p_lock); in sweep_hop_1()
916 OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 5484: " in sweep_hop_1()
922 OSM_LOG(sm->p_log, OSM_LOG_ERROR, in sweep_hop_1()
935 port_guid = sm->p_subn->sm_port_guid; in is_sm_port_down()
939 CL_PLOCK_ACQUIRE(sm->p_lock); in is_sm_port_down()
940 p_port = osm_get_port_by_guid(sm->p_subn, port_guid); in is_sm_port_down()
942 CL_PLOCK_RELEASE(sm->p_lock); in is_sm_port_down()
943 OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 5485: " in is_sm_port_down()
948 CL_PLOCK_RELEASE(sm->p_lock); in is_sm_port_down()
950 if (p_port->p_node->sw && in is_sm_port_down()
951 !ib_switch_info_is_enhanced_port0(&p_port->p_node->sw->switch_info)) in is_sm_port_down()
954 return osm_physp_get_port_state(p_port->p_physp) == IB_LINK_DOWN; in is_sm_port_down()
966 h_bind = osm_sm_mad_ctrl_get_bind_handle(&sm->mad_ctrl); in sweep_hop_0()
968 OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "No bound ports\n"); in sweep_hop_0()
969 return -1; in sweep_hop_0()
973 CL_PLOCK_ACQUIRE(sm->p_lock); in sweep_hop_0()
976 CL_PLOCK_RELEASE(sm->p_lock); in sweep_hop_0()
979 OSM_LOG(sm->p_log, OSM_LOG_ERROR, in sweep_hop_0()
988 p_node->discovery_count = 0; in reset_node_count()
990 memset(p_node->physp_discovered, 0, in reset_node_count()
991 sizeof(uint8_t) * p_node->physp_tbl_size); in reset_node_count()
997 p_port->discovery_count = 0; in reset_port_count()
1003 p_sw->need_update = 0; in reset_switch_count()
1010 CL_PLOCK_ACQUIRE(&osm->lock); in perfmgr_discovery()
1011 cl_qmap_apply_func(&osm->subn.node_guid_tbl, reset_node_count, NULL); in perfmgr_discovery()
1012 cl_qmap_apply_func(&osm->subn.port_guid_tbl, reset_port_count, NULL); in perfmgr_discovery()
1013 cl_qmap_apply_func(&osm->subn.sw_guid_tbl, reset_switch_count, NULL); in perfmgr_discovery()
1014 CL_PLOCK_RELEASE(&osm->lock); in perfmgr_discovery()
1016 osm->subn.in_sweep_hop_0 = TRUE; in perfmgr_discovery()
1018 ret = sweep_hop_0(&osm->sm); in perfmgr_discovery()
1022 if (wait_for_pending_transactions(&osm->stats)) in perfmgr_discovery()
1025 if (is_sm_port_down(&osm->sm)) { in perfmgr_discovery()
1026 OSM_LOG(&osm->log, OSM_LOG_VERBOSE, "SM port is down\n"); in perfmgr_discovery()
1030 osm->subn.in_sweep_hop_0 = FALSE; in perfmgr_discovery()
1032 ret = sweep_hop_1(&osm->sm); in perfmgr_discovery()
1036 if (wait_for_pending_transactions(&osm->stats)) in perfmgr_discovery()
1040 osm_drop_mgr_process(&osm->sm); in perfmgr_discovery()
1047 * Main PerfMgr processor - query the performance counters
1049 void osm_perfmgr_process(osm_perfmgr_t * pm) in osm_perfmgr_process() argument
1055 if (pm->state != PERFMGR_STATE_ENABLED) in osm_perfmgr_process()
1058 cl_spinlock_acquire(&pm->lock); in osm_perfmgr_process()
1059 if (pm->sweep_state == PERFMGR_SWEEP_ACTIVE || in osm_perfmgr_process()
1060 pm->sweep_state == PERFMGR_SWEEP_SUSPENDED || in osm_perfmgr_process()
1061 pm->sweep_state == PERFMGR_SWEEP_POST_PROCESSING) { in osm_perfmgr_process()
1062 cl_spinlock_release(&pm->lock); in osm_perfmgr_process()
1063 OSM_LOG(pm->log, OSM_LOG_INFO, in osm_perfmgr_process()
1064 "PM sweep state %d, skipping sweep\n", in osm_perfmgr_process()
1065 pm->sweep_state); in osm_perfmgr_process()
1069 pm->sweep_state = PERFMGR_SWEEP_ACTIVE; in osm_perfmgr_process()
1070 cl_spinlock_release(&pm->lock); in osm_perfmgr_process()
1072 if (pm->subn->sm_state == IB_SMINFO_STATE_STANDBY || in osm_perfmgr_process()
1073 pm->subn->sm_state == IB_SMINFO_STATE_NOTACTIVE) in osm_perfmgr_process()
1074 perfmgr_discovery(pm->subn->p_osm); in osm_perfmgr_process()
1077 if (pm->subn->opt.perfmgr_redir && pm->local_port == -1) { in osm_perfmgr_process()
1081 CL_PLOCK_ACQUIRE(pm->sm->p_lock); in osm_perfmgr_process()
1082 p_port = osm_get_port_by_guid(pm->subn, pm->port_guid); in osm_perfmgr_process()
1084 p_node = p_port->p_node; in osm_perfmgr_process()
1086 pm->local_port = in osm_perfmgr_process()
1087 ib_node_info_get_local_port_num(&p_node->node_info); in osm_perfmgr_process()
1089 OSM_LOG(pm->log, OSM_LOG_ERROR, in osm_perfmgr_process()
1092 cl_ntoh64(pm->port_guid)); in osm_perfmgr_process()
1093 CL_PLOCK_RELEASE(pm->sm->p_lock); in osm_perfmgr_process()
1103 OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Gathering PerfMgr stats\n"); in osm_perfmgr_process()
1104 cl_plock_acquire(&pm->osm->lock); in osm_perfmgr_process()
1105 cl_qmap_apply_func(&pm->subn->node_guid_tbl, collect_guids, pm); in osm_perfmgr_process()
1106 cl_plock_release(&pm->osm->lock); in osm_perfmgr_process()
1109 cl_qmap_apply_func(&pm->monitored_map, perfmgr_query_counters, pm); in osm_perfmgr_process()
1112 remove_marked_nodes(pm); in osm_perfmgr_process()
1117 osm_log_v2(pm->log, OSM_LOG_INFO, FILE_ID, in osm_perfmgr_process()
1127 cl_spinlock_acquire(&pm->lock); in osm_perfmgr_process()
1128 pm->sweep_state = PERFMGR_SWEEP_SLEEP; in osm_perfmgr_process()
1129 cl_spinlock_release(&pm->lock); in osm_perfmgr_process()
1133 * PerfMgr timer - loop continuously and signal SM to run PerfMgr
1138 osm_perfmgr_t *pm = arg; in perfmgr_sweep() local
1140 osm_sm_signal(pm->sm, OSM_SIGNAL_PERFMGR_SWEEP); in perfmgr_sweep()
1141 cl_timer_start(&pm->sweep_timer, pm->sweep_time_s * 1000); in perfmgr_sweep()
1144 void osm_perfmgr_shutdown(osm_perfmgr_t * pm) in osm_perfmgr_shutdown() argument
1146 OSM_LOG_ENTER(pm->log); in osm_perfmgr_shutdown()
1147 cl_timer_stop(&pm->sweep_timer); in osm_perfmgr_shutdown()
1148 cl_disp_unregister(pm->pc_disp_h); in osm_perfmgr_shutdown()
1149 perfmgr_mad_unbind(pm); in osm_perfmgr_shutdown()
1150 OSM_LOG_EXIT(pm->log); in osm_perfmgr_shutdown()
1153 void osm_perfmgr_destroy(osm_perfmgr_t * pm) in osm_perfmgr_destroy() argument
1155 OSM_LOG_ENTER(pm->log); in osm_perfmgr_destroy()
1156 perfmgr_db_destroy(pm->db); in osm_perfmgr_destroy()
1157 cl_timer_destroy(&pm->sweep_timer); in osm_perfmgr_destroy()
1158 OSM_LOG_EXIT(pm->log); in osm_perfmgr_destroy()
1170 static void perfmgr_check_oob_clear(osm_perfmgr_t * pm, in perfmgr_check_oob_clear() argument
1176 if (perfmgr_db_get_prev_err(pm->db, mon_node->guid, port, &prev_err) in perfmgr_check_oob_clear()
1178 OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Failed to find previous " in perfmgr_check_oob_clear()
1180 mon_node->name, mon_node->guid, port); in perfmgr_check_oob_clear()
1184 OSM_LOG(pm->log, OSM_LOG_DEBUG, in perfmgr_check_oob_clear()
1200 mon_node->name, mon_node->guid, port, in perfmgr_check_oob_clear()
1201 cr->symbol_err_cnt, prev_err.symbol_err_cnt, in perfmgr_check_oob_clear()
1202 cr->link_err_recover, prev_err.link_err_recover, in perfmgr_check_oob_clear()
1203 cr->link_downed, prev_err.link_downed, in perfmgr_check_oob_clear()
1204 cr->rcv_err, prev_err.rcv_err, in perfmgr_check_oob_clear()
1205 cr->rcv_rem_phys_err, prev_err.rcv_rem_phys_err, in perfmgr_check_oob_clear()
1206 cr->rcv_switch_relay_err, prev_err.rcv_switch_relay_err, in perfmgr_check_oob_clear()
1207 cr->xmit_discards, prev_err.xmit_discards, in perfmgr_check_oob_clear()
1208 cr->xmit_constraint_err, prev_err.xmit_constraint_err, in perfmgr_check_oob_clear()
1209 cr->rcv_constraint_err, prev_err.rcv_constraint_err, in perfmgr_check_oob_clear()
1210 cr->link_integrity, prev_err.link_integrity, in perfmgr_check_oob_clear()
1211 cr->buffer_overrun, prev_err.buffer_overrun, in perfmgr_check_oob_clear()
1212 cr->vl15_dropped, prev_err.vl15_dropped, in perfmgr_check_oob_clear()
1213 cr->xmit_wait, prev_err.xmit_wait); in perfmgr_check_oob_clear()
1215 if (cr->symbol_err_cnt < prev_err.symbol_err_cnt || in perfmgr_check_oob_clear()
1216 cr->link_err_recover < prev_err.link_err_recover || in perfmgr_check_oob_clear()
1217 cr->link_downed < prev_err.link_downed || in perfmgr_check_oob_clear()
1218 cr->rcv_err < prev_err.rcv_err || in perfmgr_check_oob_clear()
1219 cr->rcv_rem_phys_err < prev_err.rcv_rem_phys_err || in perfmgr_check_oob_clear()
1220 cr->rcv_switch_relay_err < prev_err.rcv_switch_relay_err || in perfmgr_check_oob_clear()
1221 cr->xmit_discards < prev_err.xmit_discards || in perfmgr_check_oob_clear()
1222 cr->xmit_constraint_err < prev_err.xmit_constraint_err || in perfmgr_check_oob_clear()
1223 cr->rcv_constraint_err < prev_err.rcv_constraint_err || in perfmgr_check_oob_clear()
1224 cr->link_integrity < prev_err.link_integrity || in perfmgr_check_oob_clear()
1225 cr->buffer_overrun < prev_err.buffer_overrun || in perfmgr_check_oob_clear()
1226 cr->vl15_dropped < prev_err.vl15_dropped || in perfmgr_check_oob_clear()
1227 cr->xmit_wait < prev_err.xmit_wait) { in perfmgr_check_oob_clear()
1228 OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 540A: " in perfmgr_check_oob_clear()
1231 mon_node->name, mon_node->guid, port); in perfmgr_check_oob_clear()
1232 perfmgr_db_clear_prev_err(pm->db, mon_node->guid, port); in perfmgr_check_oob_clear()
1247 return (val >= (UINT8_MAX - (UINT8_MAX / 4))); in counter_overflow_8()
1252 return (cl_ntoh16(val) >= (UINT16_MAX - (UINT16_MAX / 4))); in counter_overflow_16()
1257 return (cl_ntoh32(val) >= (UINT32_MAX - (UINT32_MAX / 4))); in counter_overflow_32()
1262 return (cl_ntoh64(val) >= (UINT64_MAX - (UINT64_MAX / 4))); in counter_overflow_64()
1269 static void perfmgr_check_overflow(osm_perfmgr_t * pm, in perfmgr_check_overflow() argument
1280 OSM_LOG_ENTER(pm->log); in perfmgr_check_overflow()
1282 if (counter_overflow_16(pc->symbol_err_cnt) || in perfmgr_check_overflow()
1283 counter_overflow_8(pc->link_err_recover) || in perfmgr_check_overflow()
1284 counter_overflow_8(pc->link_downed) || in perfmgr_check_overflow()
1285 counter_overflow_16(pc->rcv_err) || in perfmgr_check_overflow()
1286 counter_overflow_16(pc->rcv_rem_phys_err) || in perfmgr_check_overflow()
1287 counter_overflow_16(pc->rcv_switch_relay_err) || in perfmgr_check_overflow()
1288 counter_overflow_16(pc->xmit_discards) || in perfmgr_check_overflow()
1289 counter_overflow_8(pc->xmit_constraint_err) || in perfmgr_check_overflow()
1290 counter_overflow_8(pc->rcv_constraint_err) || in perfmgr_check_overflow()
1291 counter_overflow_4(PC_LINK_INT(pc->link_int_buffer_overrun)) || in perfmgr_check_overflow()
1292 counter_overflow_4(PC_BUF_OVERRUN(pc->link_int_buffer_overrun)) || in perfmgr_check_overflow()
1293 counter_overflow_16(pc->vl15_dropped) || in perfmgr_check_overflow()
1294 (xmit_wait_sup && counter_overflow_32(pc->xmit_wait)) || in perfmgr_check_overflow()
1296 (counter_overflow_32(pc->xmit_data) || in perfmgr_check_overflow()
1297 counter_overflow_32(pc->rcv_data) || in perfmgr_check_overflow()
1298 counter_overflow_32(pc->xmit_pkts) || in perfmgr_check_overflow()
1299 counter_overflow_32(pc->rcv_pkts)))) { in perfmgr_check_overflow()
1303 if (!mon_node->port[port].valid) in perfmgr_check_overflow()
1306 osm_log_v2(pm->log, OSM_LOG_VERBOSE, FILE_ID, in perfmgr_check_overflow()
1309 mon_node->name, mon_node->guid, port); in perfmgr_check_overflow()
1311 cl_plock_acquire(&pm->osm->lock); in perfmgr_check_overflow()
1313 osm_get_node_by_guid(pm->subn, cl_hton64(mon_node->guid)); in perfmgr_check_overflow()
1315 OSM_LOG(pm->log, OSM_LOG_ERROR, in perfmgr_check_overflow()
1319 mon_node->name, mon_node->guid); in perfmgr_check_overflow()
1323 cl_plock_release(&pm->osm->lock); in perfmgr_check_overflow()
1325 OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 540C: " in perfmgr_check_overflow()
1328 mon_node->name, mon_node->guid, port); in perfmgr_check_overflow()
1334 mad_context.perfmgr_context.node_guid = mon_node->guid; in perfmgr_check_overflow()
1353 status = perfmgr_send_pc_mad(pm, lid, remote_qp, pkey_ix, in perfmgr_check_overflow()
1360 OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 5411: " in perfmgr_check_overflow()
1363 mon_node->name, mon_node->guid, port); in perfmgr_check_overflow()
1365 perfmgr_db_clear_prev_err(pm->db, mon_node->guid, port); in perfmgr_check_overflow()
1367 perfmgr_db_clear_prev_dc(pm->db, mon_node->guid, port); in perfmgr_check_overflow()
1371 OSM_LOG_EXIT(pm->log); in perfmgr_check_overflow()
1378 static void perfmgr_check_pce_overflow(osm_perfmgr_t * pm, in perfmgr_check_pce_overflow() argument
1388 OSM_LOG_ENTER(pm->log); in perfmgr_check_pce_overflow()
1390 if (counter_overflow_64(pc->xmit_data) || in perfmgr_check_pce_overflow()
1391 counter_overflow_64(pc->rcv_data) || in perfmgr_check_pce_overflow()
1392 counter_overflow_64(pc->xmit_pkts) || in perfmgr_check_pce_overflow()
1393 counter_overflow_64(pc->rcv_pkts) || in perfmgr_check_pce_overflow()
1395 (counter_overflow_64(pc->unicast_xmit_pkts) || in perfmgr_check_pce_overflow()
1396 counter_overflow_64(pc->unicast_rcv_pkts) || in perfmgr_check_pce_overflow()
1397 counter_overflow_64(pc->multicast_xmit_pkts) || in perfmgr_check_pce_overflow()
1398 counter_overflow_64(pc->multicast_rcv_pkts)))) { in perfmgr_check_pce_overflow()
1402 if (!mon_node->port[port].valid) in perfmgr_check_pce_overflow()
1405 osm_log(pm->log, OSM_LOG_VERBOSE, in perfmgr_check_pce_overflow()
1408 mon_node->name, mon_node->guid, port); in perfmgr_check_pce_overflow()
1410 cl_plock_acquire(&pm->osm->lock); in perfmgr_check_pce_overflow()
1412 osm_get_node_by_guid(pm->subn, cl_hton64(mon_node->guid)); in perfmgr_check_pce_overflow()
1414 OSM_LOG(pm->log, OSM_LOG_ERROR, in perfmgr_check_pce_overflow()
1418 mon_node->name, mon_node->guid); in perfmgr_check_pce_overflow()
1422 cl_plock_release(&pm->osm->lock); in perfmgr_check_pce_overflow()
1424 OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 5418: " in perfmgr_check_pce_overflow()
1427 mon_node->name, mon_node->guid, port); in perfmgr_check_pce_overflow()
1433 mad_context.perfmgr_context.node_guid = mon_node->guid; in perfmgr_check_pce_overflow()
1437 status = perfmgr_send_pce_mad(pm, lid, remote_qp, pkey_ix, in perfmgr_check_pce_overflow()
1442 OSM_LOG(pm->log, OSM_LOG_ERROR, "PerfMgr: ERR 5419: " in perfmgr_check_pce_overflow()
1445 mon_node->name, mon_node->guid, port); in perfmgr_check_pce_overflow()
1447 perfmgr_db_clear_prev_dc(pm->db, mon_node->guid, port); in perfmgr_check_pce_overflow()
1451 OSM_LOG_EXIT(pm->log); in perfmgr_check_pce_overflow()
1457 static void perfmgr_log_errors(osm_perfmgr_t * pm, in perfmgr_log_errors() argument
1463 perfmgr_db_get_prev_err(pm->db, mon_node->guid, port, &prev_read); in perfmgr_log_errors()
1467 OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Failed to find previous " in perfmgr_log_errors()
1469 mon_node->name, mon_node->guid, port); in perfmgr_log_errors()
1474 if (reading->counter_name > prev_read.counter_name) { \ in perfmgr_log_errors()
1475 if (mon_node->port[port].remote_valid == TRUE) \ in perfmgr_log_errors()
1476 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR %s: " \ in perfmgr_log_errors()
1481 reading->counter_name - prev_read.counter_name, \ in perfmgr_log_errors()
1482 mon_node->name, mon_node->guid, port, \ in perfmgr_log_errors()
1483 mon_node->port[port].remote_name, \ in perfmgr_log_errors()
1484 mon_node->port[port].remote_guid, \ in perfmgr_log_errors()
1485 mon_node->port[port].remote_port); \ in perfmgr_log_errors()
1487 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR %s: " \ in perfmgr_log_errors()
1491 reading->counter_name - prev_read.counter_name, \ in perfmgr_log_errors()
1492 mon_node->name, mon_node->guid, port); \ in perfmgr_log_errors()
1508 cur = reading->xmit_wait; in perfmgr_log_errors()
1510 if (pm->xmit_wait_log && cur > prev && in perfmgr_log_errors()
1511 (cur - prev) >= pm->xmit_wait_threshold) { in perfmgr_log_errors()
1512 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 543D: XmitWait : %" PRIu64 in perfmgr_log_errors()
1514 cur - prev, mon_node->name, mon_node->guid, port); in perfmgr_log_errors()
1518 static int16_t validate_redir_pkey(osm_perfmgr_t *pm, ib_net16_t pkey) in validate_redir_pkey() argument
1520 int16_t pkey_ix = -1; in validate_redir_pkey()
1527 OSM_LOG_ENTER(pm->log); in validate_redir_pkey()
1529 CL_PLOCK_ACQUIRE(pm->sm->p_lock); in validate_redir_pkey()
1530 p_port = osm_get_port_by_guid(pm->subn, pm->port_guid); in validate_redir_pkey()
1532 CL_PLOCK_RELEASE(pm->sm->p_lock); in validate_redir_pkey()
1533 OSM_LOG(pm->log, OSM_LOG_ERROR, in validate_redir_pkey()
1537 if (p_port->p_physp && osm_physp_is_valid(p_port->p_physp)) { in validate_redir_pkey()
1538 p_pkey_tbl = &p_port->p_physp->pkeys; in validate_redir_pkey()
1540 CL_PLOCK_RELEASE(pm->sm->p_lock); in validate_redir_pkey()
1541 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in validate_redir_pkey()
1545 p_orig_pkey = cl_map_get(&p_pkey_tbl->keys, in validate_redir_pkey()
1548 CL_PLOCK_RELEASE(pm->sm->p_lock); in validate_redir_pkey()
1549 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in validate_redir_pkey()
1556 CL_PLOCK_RELEASE(pm->sm->p_lock); in validate_redir_pkey()
1559 CL_PLOCK_RELEASE(pm->sm->p_lock); in validate_redir_pkey()
1560 OSM_LOG(pm->log, OSM_LOG_ERROR, in validate_redir_pkey()
1566 CL_PLOCK_RELEASE(pm->sm->p_lock); in validate_redir_pkey()
1567 OSM_LOG(pm->log, OSM_LOG_ERROR, in validate_redir_pkey()
1572 OSM_LOG_EXIT(pm->log); in validate_redir_pkey()
1576 static boolean_t handle_redirect(osm_perfmgr_t *pm, in handle_redirect() argument
1588 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in handle_redirect()
1590 cl_ntoh16(cpi->redir_lid), in handle_redirect()
1591 inet_ntop(AF_INET6, cpi->redir_gid.raw, gid_str, in handle_redirect()
1592 sizeof gid_str), cl_ntoh32(cpi->redir_qp)); in handle_redirect()
1594 if (!pm->subn->opt.perfmgr_redir) { in handle_redirect()
1595 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in handle_redirect()
1601 if (cpi->redir_lid == 0) { in handle_redirect()
1602 if (!ib_gid_is_notzero(&cpi->redir_gid)) { in handle_redirect()
1603 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in handle_redirect()
1609 if (cpi->redir_qp == 0) { in handle_redirect()
1610 OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid RedirectQP\n"); in handle_redirect()
1613 if (cpi->redir_pkey == 0) { in handle_redirect()
1614 OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid RedirectP_Key\n"); in handle_redirect()
1617 if (cpi->redir_qkey != IB_QP1_WELL_KNOWN_Q_KEY) { in handle_redirect()
1618 OSM_LOG(pm->log, OSM_LOG_VERBOSE, "Invalid RedirectQ_Key\n"); in handle_redirect()
1622 pkey_ix = validate_redir_pkey(pm, cpi->redir_pkey); in handle_redirect()
1623 if (pkey_ix == -1) { in handle_redirect()
1624 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in handle_redirect()
1626 cl_ntoh16(cpi->redir_pkey)); in handle_redirect()
1630 if (cpi->redir_lid == 0) { in handle_redirect()
1632 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in handle_redirect()
1641 cl_plock_acquire(&pm->osm->lock); in handle_redirect()
1642 p_mon_node->port[port].redirection = TRUE; in handle_redirect()
1643 p_mon_node->port[port].valid = valid; in handle_redirect()
1644 memcpy(&p_mon_node->port[port].gid, &cpi->redir_gid, in handle_redirect()
1646 p_mon_node->port[port].lid = cpi->redir_lid; in handle_redirect()
1647 p_mon_node->port[port].qp = cpi->redir_qp; in handle_redirect()
1648 p_mon_node->port[port].pkey = cpi->redir_pkey; in handle_redirect()
1649 if (pkey_ix != -1) in handle_redirect()
1650 p_mon_node->port[port].pkey_ix = pkey_ix; in handle_redirect()
1651 cl_plock_release(&pm->osm->lock); in handle_redirect()
1654 if (pm->query_cpi) in handle_redirect()
1658 p_mon_node->port[port].cpi_valid = FALSE; in handle_redirect()
1659 status = perfmgr_send_cpi_mad(pm, cpi->redir_lid, in handle_redirect()
1660 cpi->redir_qp, pkey_ix, in handle_redirect()
1672 mad_method = mad_context->perfmgr_context.mad_method; in handle_redirect()
1673 if (mad_context->perfmgr_context.mad_attr_id in handle_redirect()
1675 status = perfmgr_send_pc_mad(pm, cpi->redir_lid, in handle_redirect()
1676 cpi->redir_qp, in handle_redirect()
1684 status = perfmgr_send_pce_mad(pm, cpi->redir_lid, in handle_redirect()
1685 cpi->redir_qp, in handle_redirect()
1693 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5414: " in handle_redirect()
1697 mad_method, p_mon_node->name, p_mon_node->guid, port); in handle_redirect()
1711 static void perfmgr_check_data_cnt_oob_clear(osm_perfmgr_t * pm, in perfmgr_check_data_cnt_oob_clear() argument
1718 if (perfmgr_db_get_prev_dc(pm->db, mon_node->guid, port, &prev_dc) in perfmgr_check_data_cnt_oob_clear()
1720 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in perfmgr_check_data_cnt_oob_clear()
1723 mon_node->name, mon_node->guid, port); in perfmgr_check_data_cnt_oob_clear()
1727 OSM_LOG(pm->log, OSM_LOG_DEBUG, in perfmgr_check_data_cnt_oob_clear()
1738 mon_node->name, mon_node->guid, port, in perfmgr_check_data_cnt_oob_clear()
1739 dc->xmit_data, prev_dc.xmit_data, in perfmgr_check_data_cnt_oob_clear()
1740 dc->rcv_data, prev_dc.rcv_data, in perfmgr_check_data_cnt_oob_clear()
1741 dc->xmit_pkts, prev_dc.xmit_pkts, in perfmgr_check_data_cnt_oob_clear()
1742 dc->rcv_pkts, prev_dc.rcv_pkts, in perfmgr_check_data_cnt_oob_clear()
1743 dc->unicast_xmit_pkts, prev_dc.unicast_xmit_pkts, in perfmgr_check_data_cnt_oob_clear()
1744 dc->unicast_rcv_pkts, prev_dc.unicast_rcv_pkts, in perfmgr_check_data_cnt_oob_clear()
1745 dc->multicast_xmit_pkts, prev_dc.multicast_xmit_pkts, in perfmgr_check_data_cnt_oob_clear()
1746 dc->multicast_rcv_pkts, prev_dc.multicast_rcv_pkts); in perfmgr_check_data_cnt_oob_clear()
1748 if (dc->xmit_data < prev_dc.xmit_data || in perfmgr_check_data_cnt_oob_clear()
1749 dc->rcv_data < prev_dc.rcv_data || in perfmgr_check_data_cnt_oob_clear()
1750 dc->xmit_pkts < prev_dc.xmit_pkts || in perfmgr_check_data_cnt_oob_clear()
1751 dc->rcv_pkts < prev_dc.rcv_pkts || in perfmgr_check_data_cnt_oob_clear()
1753 (dc->unicast_xmit_pkts < prev_dc.unicast_xmit_pkts || in perfmgr_check_data_cnt_oob_clear()
1754 dc->unicast_rcv_pkts < prev_dc.unicast_rcv_pkts || in perfmgr_check_data_cnt_oob_clear()
1755 dc->multicast_xmit_pkts < prev_dc.multicast_xmit_pkts || in perfmgr_check_data_cnt_oob_clear()
1756 dc->multicast_rcv_pkts < prev_dc.multicast_rcv_pkts))) { in perfmgr_check_data_cnt_oob_clear()
1757 OSM_LOG(pm->log, OSM_LOG_ERROR, in perfmgr_check_data_cnt_oob_clear()
1760 mon_node->name, mon_node->guid, port); in perfmgr_check_data_cnt_oob_clear()
1762 perfmgr_db_clear_prev_dc(pm->db, mon_node->guid, port); in perfmgr_check_data_cnt_oob_clear()
1772 osm_perfmgr_t *pm = context; in pc_recv_process() local
1774 osm_madw_context_t *mad_context = &p_madw->context; in pc_recv_process()
1776 uint64_t node_guid = mad_context->perfmgr_context.node_guid; in pc_recv_process()
1777 uint8_t port = mad_context->perfmgr_context.port; in pc_recv_process()
1784 OSM_LOG_ENTER(pm->log); in pc_recv_process()
1790 if ((p_node = cl_qmap_get(&pm->monitored_map, node_guid)) == in pc_recv_process()
1791 cl_qmap_end(&pm->monitored_map)) { in pc_recv_process()
1792 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5412: GUID 0x%016" in pc_recv_process()
1798 OSM_LOG(pm->log, OSM_LOG_VERBOSE, in pc_recv_process()
1800 PRIx64 " port %u\n", cl_ntoh16(p_mad->status), node_guid, port); in pc_recv_process()
1802 CL_ASSERT(p_mad->attr_id == IB_MAD_ATTR_PORT_CNTRS || in pc_recv_process()
1803 p_mad->attr_id == IB_MAD_ATTR_PORT_CNTRS_EXT || in pc_recv_process()
1804 p_mad->attr_id == IB_MAD_ATTR_CLASS_PORT_INFO); in pc_recv_process()
1806 cl_plock_acquire(&pm->osm->lock); in pc_recv_process()
1808 if (port >= p_mon_node->num_ports) { in pc_recv_process()
1809 cl_plock_release(&pm->osm->lock); in pc_recv_process()
1810 OSM_LOG(pm->log, OSM_LOG_ERROR, "ERR 5413: " in pc_recv_process()
1813 p_mon_node->num_ports); in pc_recv_process()
1816 cl_plock_release(&pm->osm->lock); in pc_recv_process()
1819 if (p_mad->attr_id == IB_MAD_ATTR_CLASS_PORT_INFO) { in pc_recv_process()
1823 (osm_madw_get_perfmgt_mad_ptr(p_madw)->data); in pc_recv_process()
1826 if (p_mad->status & IB_MAD_STATUS_REDIRECT) in pc_recv_process()
1827 cpi_valid = handle_redirect(pm, cpi, p_mon_node, port, in pc_recv_process()
1830 if (pm->query_cpi && cpi_valid) { in pc_recv_process()
1831 cl_plock_acquire(&pm->osm->lock); in pc_recv_process()
1832 if (p_mon_node->node_type == IB_NODE_TYPE_SWITCH) { in pc_recv_process()
1834 for (i = p_mon_node->esp0 ? 0 : 1; in pc_recv_process()
1835 i < p_mon_node->num_ports; in pc_recv_process()
1837 p_mon_node->port[i].cap_mask = cpi->cap_mask; in pc_recv_process()
1838 p_mon_node->port[i].cpi_valid = cpi_valid; in pc_recv_process()
1841 p_mon_node->port[port].cap_mask = cpi->cap_mask; in pc_recv_process()
1842 p_mon_node->port[port].cpi_valid = cpi_valid; in pc_recv_process()
1844 cl_plock_release(&pm->osm->lock); in pc_recv_process()
1849 if (p_mad->attr_id == IB_MAD_ATTR_PORT_CNTRS_EXT) { in pc_recv_process()
1852 &osm_madw_get_perfmgt_mad_ptr(p_madw)->data; in pc_recv_process()
1860 if (mad_context->perfmgr_context.mad_method in pc_recv_process()
1863 perfmgr_check_data_cnt_oob_clear(pm, p_mon_node, port, in pc_recv_process()
1866 perfmgr_db_add_dc_reading(pm->db, node_guid, port, in pc_recv_process()
1871 perfmgr_db_clear_prev_dc(pm->db, node_guid, port); in pc_recv_process()
1874 perfmgr_check_pce_overflow(pm, p_mon_node, in pc_recv_process()
1875 p_mon_node->port[port].pkey_ix, in pc_recv_process()
1882 &osm_madw_get_perfmgt_mad_ptr(p_madw)->data; in pc_recv_process()
1888 if (mad_context->perfmgr_context.mad_method == IB_MAD_METHOD_GET) { in pc_recv_process()
1890 perfmgr_check_oob_clear(pm, p_mon_node, port, &err_reading); in pc_recv_process()
1892 perfmgr_check_data_cnt_oob_clear(pm, p_mon_node, port, in pc_recv_process()
1896 if (pm->subn->opt.perfmgr_log_errors) in pc_recv_process()
1897 perfmgr_log_errors(pm, p_mon_node, port, &err_reading); in pc_recv_process()
1899 perfmgr_db_add_err_reading(pm->db, node_guid, port, in pc_recv_process()
1902 perfmgr_db_add_dc_reading(pm->db, node_guid, port, in pc_recv_process()
1905 perfmgr_db_clear_prev_err(pm->db, node_guid, port); in pc_recv_process()
1907 perfmgr_db_clear_prev_dc(pm->db, node_guid, port); in pc_recv_process()
1910 perfmgr_check_overflow(pm, p_mon_node, p_mon_node->port[port].pkey_ix, in pc_recv_process()
1919 diff_time(&p_madw->context.perfmgr_context.query_start, in pc_recv_process()
1926 osm_mad_pool_put(pm->mad_pool, p_madw); in pc_recv_process()
1928 OSM_LOG_EXIT(pm->log); in pc_recv_process()
1934 ib_api_status_t osm_perfmgr_init(osm_perfmgr_t * pm, osm_opensm_t * osm, in osm_perfmgr_init() argument
1939 OSM_LOG_ENTER(&osm->log); in osm_perfmgr_init()
1941 OSM_LOG(&osm->log, OSM_LOG_VERBOSE, "Initializing PerfMgr\n"); in osm_perfmgr_init()
1943 memset(pm, 0, sizeof(*pm)); in osm_perfmgr_init()
1945 pm->subn = &osm->subn; in osm_perfmgr_init()
1946 pm->sm = &osm->sm; in osm_perfmgr_init()
1947 pm->log = &osm->log; in osm_perfmgr_init()
1948 pm->mad_pool = &osm->mad_pool; in osm_perfmgr_init()
1949 pm->vendor = osm->p_vendor; in osm_perfmgr_init()
1950 pm->trans_id = PERFMGR_INITIAL_TID_VALUE; in osm_perfmgr_init()
1951 pm->state = in osm_perfmgr_init()
1952 p_opt->perfmgr ? PERFMGR_STATE_ENABLED : PERFMGR_STATE_DISABLE; in osm_perfmgr_init()
1953 pm->sweep_state = PERFMGR_SWEEP_SLEEP; in osm_perfmgr_init()
1954 status = cl_spinlock_init(&pm->lock); in osm_perfmgr_init()
1957 pm->sweep_time_s = p_opt->perfmgr_sweep_time_s; in osm_perfmgr_init()
1958 pm->max_outstanding_queries = p_opt->perfmgr_max_outstanding_queries; in osm_perfmgr_init()
1959 pm->ignore_cas = p_opt->perfmgr_ignore_cas; in osm_perfmgr_init()
1960 pm->osm = osm; in osm_perfmgr_init()
1961 pm->local_port = -1; in osm_perfmgr_init()
1963 status = cl_timer_init(&pm->sweep_timer, perfmgr_sweep, pm); in osm_perfmgr_init()
1968 pm->db = perfmgr_db_construct(pm); in osm_perfmgr_init()
1969 if (!pm->db) { in osm_perfmgr_init()
1970 pm->state = PERFMGR_STATE_NO_DB; in osm_perfmgr_init()
1974 pm->pc_disp_h = cl_disp_register(&osm->disp, OSM_MSG_MAD_PORT_COUNTERS, in osm_perfmgr_init()
1975 pc_recv_process, pm); in osm_perfmgr_init()
1976 if (pm->pc_disp_h == CL_DISP_INVALID_HANDLE) { in osm_perfmgr_init()
1977 perfmgr_db_destroy(pm->db); in osm_perfmgr_init()
1981 init_monitored_nodes(pm); in osm_perfmgr_init()
1983 if (pm->state == PERFMGR_STATE_ENABLED) in osm_perfmgr_init()
1984 cl_timer_start(&pm->sweep_timer, pm->sweep_time_s * 1000); in osm_perfmgr_init()
1986 pm->rm_nodes = p_opt->perfmgr_rm_nodes; in osm_perfmgr_init()
1987 pm->query_cpi = p_opt->perfmgr_query_cpi; in osm_perfmgr_init()
1988 pm->xmit_wait_log = p_opt->perfmgr_xmit_wait_log; in osm_perfmgr_init()
1989 pm->xmit_wait_threshold = p_opt->perfmgr_xmit_wait_threshold; in osm_perfmgr_init()
1992 OSM_LOG_EXIT(pm->log); in osm_perfmgr_init()
1999 void osm_perfmgr_clear_counters(osm_perfmgr_t * pm) in osm_perfmgr_clear_counters() argument
2004 perfmgr_db_clear_counters(pm->db); in osm_perfmgr_clear_counters()
2005 osm_log_v2(pm->log, OSM_LOG_INFO, FILE_ID, "PerfMgr counters cleared\n"); in osm_perfmgr_clear_counters()
2011 void osm_perfmgr_dump_counters(osm_perfmgr_t * pm, perfmgr_db_dump_t dump_type) in osm_perfmgr_dump_counters() argument
2015 if (pm->subn->opt.event_db_dump_file) in osm_perfmgr_dump_counters()
2016 file_name = pm->subn->opt.event_db_dump_file; in osm_perfmgr_dump_counters()
2019 pm->subn->opt.dump_files_dir, in osm_perfmgr_dump_counters()
2023 if (perfmgr_db_dump(pm->db, file_name, dump_type) != 0) in osm_perfmgr_dump_counters()
2024 OSM_LOG(pm->log, OSM_LOG_ERROR, "Failed to dump file %s : %s", in osm_perfmgr_dump_counters()
2031 void osm_perfmgr_print_counters(osm_perfmgr_t * pm, char *nodename, FILE * fp, in osm_perfmgr_print_counters() argument
2038 perfmgr_db_print_by_name(pm->db, nodename, fp, port, in osm_perfmgr_print_counters()
2041 perfmgr_db_print_by_guid(pm->db, guid, fp, port, in osm_perfmgr_print_counters()
2044 perfmgr_db_print_all(pm->db, fp, err_only); in osm_perfmgr_print_counters()
2047 void osm_perfmgr_update_nodename(osm_perfmgr_t *pm, uint64_t node_guid, in osm_perfmgr_update_nodename() argument
2050 if (pm->db) in osm_perfmgr_update_nodename()
2051 perfmgr_db_update_name(pm->db, node_guid, nodename); in osm_perfmgr_update_nodename()