static void _append_ba_mps(List my_list, int dim, uint16_t *start, uint16_t *end, uint16_t *coords) { ba_mp_t *curr_mp; if (dim > SYSTEM_DIMENSIONS) return; if (dim < SYSTEM_DIMENSIONS) { for (coords[dim] = start[dim]; coords[dim] <= end[dim]; coords[dim]++) { /* handle the outter dims here */ _append_ba_mps(my_list, dim+1, start, end, coords); } return; } curr_mp = ba_copy_mp(coord2ba_mp(coords)); if (curr_mp) { curr_mp->used = 1; list_append(my_list, curr_mp); } }
extern bg_record_t *create_small_record(bg_record_t *bg_record, bitstr_t *ionodes, int size) { bg_record_t *found_record = NULL; ba_mp_t *new_ba_mp = NULL; ba_mp_t *ba_mp = NULL; found_record = (bg_record_t*) xmalloc(sizeof(bg_record_t)); found_record->magic = BLOCK_MAGIC; /* This will be a list containing jobs running on this block */ if (bg_conf->sub_blocks) found_record->job_list = list_create(NULL); found_record->job_running = NO_JOB_RUNNING; #ifdef HAVE_BGL found_record->node_use = SELECT_COPROCESSOR_MODE; found_record->blrtsimage = xstrdup(bg_record->blrtsimage); #endif #ifdef HAVE_BG_L_P found_record->linuximage = xstrdup(bg_record->linuximage); found_record->ramdiskimage = xstrdup(bg_record->ramdiskimage); #endif found_record->mloaderimage = xstrdup(bg_record->mloaderimage); if (bg_record->conn_type[0] >= SELECT_SMALL) found_record->conn_type[0] = bg_record->conn_type[0]; else found_record->conn_type[0] = SELECT_SMALL; xassert(bg_conf->cpu_ratio); found_record->cpu_cnt = bg_conf->cpu_ratio * size; found_record->cnode_cnt = size; found_record->ionode_bitmap = bit_copy(ionodes); ba_set_ionode_str(found_record); found_record->ba_mp_list = list_create(destroy_ba_mp); slurm_mutex_lock(&ba_system_mutex); if (bg_record->ba_mp_list) ba_mp = list_peek(bg_record->ba_mp_list); if (!ba_mp) { if (bg_record->mp_str) { int j = 0, dim; char *nodes = bg_record->mp_str; uint16_t coords[SYSTEM_DIMENSIONS]; while (nodes[j] != '\0') { if ((nodes[j] >= '0' && nodes[j] <= '9') || (nodes[j] >= 'A' && nodes[j] <= 'Z')) { break; } j++; } if (nodes[j] && ((strlen(nodes) - (j + SYSTEM_DIMENSIONS)) >= 0)) { for (dim = 0; dim < SYSTEM_DIMENSIONS; dim++, j++) coords[dim] = select_char2coord( nodes[j]); ba_mp = coord2ba_mp(coords); } error("you gave me a list with no ba_mps using %s", ba_mp->coord_str); } else { ba_mp = coord2ba_mp(found_record->start); error("you gave me a record with no ba_mps " "and no nodes either using %s", ba_mp->coord_str); } } xassert(ba_mp); new_ba_mp = ba_copy_mp(ba_mp); slurm_mutex_unlock(&ba_system_mutex); /* We need to have this node wrapped in Q to handle wires correctly when creating around the midplane. */ ba_setup_mp(new_ba_mp, false, true); new_ba_mp->used = BA_MP_USED_TRUE; /* Create these now so we can deal with error cnodes if/when they happen. Since this is the easiest place to figure it out for blocks that don't use the entire block */ if ((new_ba_mp->cnode_bitmap = ba_create_ba_mp_cnode_bitmap(found_record))) { new_ba_mp->cnode_err_bitmap = bit_alloc(bg_conf->mp_cnode_cnt); new_ba_mp->cnode_usable_bitmap = bit_copy(new_ba_mp->cnode_bitmap); } list_append(found_record->ba_mp_list, new_ba_mp); found_record->mp_count = 1; found_record->mp_str = xstrdup_printf( "%s%s", bg_conf->slurm_node_prefix, new_ba_mp->coord_str); process_nodes(found_record, false); /* Force small blocks to always be non-full system blocks. * This really only plays a part on sub-midplane systems. */ found_record->full_block = 0; if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) info("made small block of %s[%s]", found_record->mp_str, found_record->ionode_str); return found_record; }