/** =========================================================================== */ static int extract_alloc_tbls(osm_subn_t *p_subn, struct ssa_db_extract *p_ssa_db) { const osm_pkey_tbl_t *p_pkey_tbl; osm_switch_t *p_sw; osm_port_t *p_port; uint64_t links, ports, lft_blocks; uint32_t guids, nodes, lft_tops; uint32_t switch_ports_num = 0; uint32_t pkey_cnt = 0; uint16_t lids; nodes = (uint32_t) cl_qmap_count(&p_subn->node_guid_tbl); if (!p_ssa_db->p_node_tbl) { p_ssa_db->p_node_tbl = (struct smdb_node *) malloc(sizeof(*p_ssa_db->p_node_tbl) * nodes); if (!p_ssa_db->p_node_tbl) { ssa_log(SSA_LOG_DEFAULT, "ERROR - unable to allocate nodes table\n"); goto err0; } } lft_tops = (uint32_t) cl_qmap_count(&p_subn->sw_guid_tbl); if (!ssa_db->p_lft_db->p_db_lft_top_tbl) { ssa_db->p_lft_db->p_db_lft_top_tbl = (struct smdb_lft_top *) malloc(sizeof(*ssa_db->p_lft_db->p_db_lft_top_tbl) * lft_tops); if (!ssa_db->p_lft_db->p_db_lft_top_tbl) { ssa_log(SSA_LOG_DEFAULT, "ERROR - unable to allocate LFT tops table\n"); goto err1; } } lids = (uint16_t) cl_ptr_vector_get_size(&p_subn->port_lid_tbl); lft_blocks = ((lids % IB_SMP_DATA_SIZE) ? (lids / IB_SMP_DATA_SIZE + 1) : (lids / IB_SMP_DATA_SIZE)); lft_blocks = (uint64_t) lft_tops * lft_blocks * (1 << p_ssa_db->lmc); if (!ssa_db->p_lft_db->p_db_lft_block_tbl) { ssa_db->p_lft_db->p_db_lft_block_tbl = (struct smdb_lft_block *) malloc(sizeof(*ssa_db->p_lft_db->p_db_lft_block_tbl) * lft_blocks); if (!ssa_db->p_lft_db->p_db_lft_block_tbl) { ssa_log(SSA_LOG_DEFAULT, "ERROR - unable to allocate LFT blocks table\n"); goto err2; } } guids = (uint32_t) cl_qmap_count(&p_subn->port_guid_tbl); if (!p_ssa_db->p_guid_to_lid_tbl) { p_ssa_db->p_guid_to_lid_tbl = (struct smdb_guid2lid *) malloc(sizeof(*p_ssa_db->p_guid_to_lid_tbl) * guids); if (!p_ssa_db->p_guid_to_lid_tbl) { ssa_log(SSA_LOG_DEFAULT, "ERROR - unable to allocate GUID to LID table\n"); goto err3; } } for (p_sw = (osm_switch_t *)cl_qmap_head(&p_subn->sw_guid_tbl); p_sw != (osm_switch_t *)cl_qmap_end(&p_subn->sw_guid_tbl); p_sw = (osm_switch_t *)cl_qmap_next(&p_sw->map_item)) switch_ports_num += p_sw->num_ports; links = guids + switch_ports_num; if (!p_ssa_db->p_link_tbl) { p_ssa_db->p_link_tbl = (struct smdb_link *) malloc(sizeof(*p_ssa_db->p_link_tbl) * links); if (!p_ssa_db->p_link_tbl) { ssa_log(SSA_LOG_DEFAULT, "ERROR - unable to allocate links table\n"); goto err4; } } ports = links; if (!p_ssa_db->p_port_tbl) { p_ssa_db->p_port_tbl = (struct smdb_port *) malloc(sizeof(*p_ssa_db->p_port_tbl) * ports); if (!p_ssa_db->p_port_tbl) { ssa_log(SSA_LOG_DEFAULT, "ERROR - unable to allocate ports table\n"); goto err5; } } for (p_port = (osm_port_t *)cl_qmap_head(&p_subn->port_guid_tbl); p_port != (osm_port_t *)cl_qmap_end(&p_subn->port_guid_tbl); p_port = (osm_port_t *)cl_qmap_next(&p_port->map_item)) { p_pkey_tbl = osm_physp_get_pkey_tbl(p_port->p_physp); pkey_cnt += (uint32_t) cl_map_count((const cl_map_t *) &p_pkey_tbl->keys); } if (!p_ssa_db->p_pkey_tbl) { p_ssa_db->p_pkey_tbl = (uint16_t *) malloc(sizeof(*p_ssa_db->p_pkey_tbl) * pkey_cnt); if (!p_ssa_db->p_pkey_tbl) { ssa_log(SSA_LOG_DEFAULT, "ERROR - unable to allocate pkeys table\n"); goto err6; } } p_ssa_db->pkey_tbl_rec_num = pkey_cnt; return 0; err6: free(p_ssa_db->p_port_tbl); err5: free(p_ssa_db->p_link_tbl); err4: free(p_ssa_db->p_guid_to_lid_tbl); err3: free(ssa_db->p_lft_db->p_db_lft_block_tbl); err2: free(ssa_db->p_lft_db->p_db_lft_top_tbl); err1: free(p_ssa_db->p_node_tbl); err0: return -1; }
ib_api_status_t osm_prtn_make_partitions(osm_log_t * p_log, osm_subn_t * p_subn) { struct stat statbuf; const char *file_name; boolean_t is_config = TRUE; boolean_t is_wrong_config = FALSE; ib_api_status_t status = IB_SUCCESS; cl_map_item_t *p_next; osm_prtn_t *p; file_name = p_subn->opt.partition_config_file ? p_subn->opt.partition_config_file : OSM_DEFAULT_PARTITION_CONFIG_FILE; if (stat(file_name, &statbuf)) { OSM_LOG(p_log, OSM_LOG_VERBOSE, "Partition configuration " "%s is not accessible (%s)\n", file_name, strerror(errno)); is_config = FALSE; } retry_default: /* clean up current port maps */ p_next = cl_qmap_head(&p_subn->prtn_pkey_tbl); while (p_next != cl_qmap_end(&p_subn->prtn_pkey_tbl)) { p = (osm_prtn_t *) p_next; p_next = cl_qmap_next(&p->map_item); cl_map_remove_all(&p->part_guid_tbl); cl_map_remove_all(&p->full_guid_tbl); } global_pkey_counter = 0; status = prtn_make_default(p_log, p_subn, !is_config); if (status != IB_SUCCESS) goto _err; if (is_config && osm_prtn_config_parse_file(p_log, p_subn, file_name)) { OSM_LOG(p_log, OSM_LOG_VERBOSE, "Partition configuration " "was not fully processed\n"); is_wrong_config = TRUE; } /* and now clean up empty partitions */ p_next = cl_qmap_head(&p_subn->prtn_pkey_tbl); while (p_next != cl_qmap_end(&p_subn->prtn_pkey_tbl)) { p = (osm_prtn_t *) p_next; p_next = cl_qmap_next(&p->map_item); if (cl_map_count(&p->part_guid_tbl) == 0 && cl_map_count(&p->full_guid_tbl) == 0) { cl_qmap_remove_item(&p_subn->prtn_pkey_tbl, (cl_map_item_t *) p); osm_prtn_delete(p_subn, &p); } } if (is_config && is_wrong_config) { OSM_LOG(p_log, OSM_LOG_ERROR, "Partition configuration " "in error; retrying with default config\n"); is_config = FALSE; goto retry_default; } _err: return status; }