static int _split_block(List block_list, List new_blocks, bg_record_t *bg_record, int cnodes) { bool full_mp = false; bitoff_t start = 0; select_ba_request_t blockreq; memset(&blockreq, 0, sizeof(select_ba_request_t)); switch(bg_record->cnode_cnt) { #ifdef HAVE_BGL case 32: error("We got a 32 we should never have this"); goto finished; break; case 128: switch(cnodes) { case 32: blockreq.small32 = 4; break; default: error("We don't make a %d from size %d", cnodes, bg_record->cnode_cnt); goto finished; break; } break; default: switch(cnodes) { case 32: blockreq.small32 = 4; blockreq.small128 = 3; break; case 128: blockreq.small128 = 4; break; default: error("We don't make a %d from size %d", cnodes, bg_record->cnode_cnt); goto finished; break; } full_mp = true; break; #else case 16: error("We got a 16 we should never have this"); goto finished; break; case 32: switch(cnodes) { case 16: blockreq.small16 = 2; break; default: error("We don't make a %d from size %d", cnodes, bg_record->cnode_cnt); goto finished; break; } break; case 64: switch(cnodes) { case 16: blockreq.small16 = 2; blockreq.small32 = 1; break; case 32: blockreq.small32 = 2; break; default: error("We don't make a %d from size %d", cnodes, bg_record->cnode_cnt); goto finished; break; } break; case 128: switch(cnodes) { case 16: blockreq.small16 = 2; blockreq.small32 = 1; blockreq.small64 = 1; break; case 32: blockreq.small32 = 2; blockreq.small64 = 1; break; case 64: blockreq.small64 = 2; break; default: error("We don't make a %d from size %d", cnodes, bg_record->cnode_cnt); goto finished; break; } break; case 256: switch(cnodes) { case 16: blockreq.small16 = 2; blockreq.small32 = 1; blockreq.small64 = 1; blockreq.small128 = 1; break; case 32: blockreq.small32 = 2; blockreq.small64 = 1; blockreq.small128 = 1; break; case 64: blockreq.small64 = 2; blockreq.small128 = 1; break; case 128: blockreq.small128 = 2; break; default: error("We don't make a %d from size %d", cnodes, bg_record->cnode_cnt); goto finished; break; } break; default: switch(cnodes) { case 16: blockreq.small16 = 2; blockreq.small32 = 1; blockreq.small64 = 1; blockreq.small128 = 1; blockreq.small256 = 1; break; case 32: blockreq.small32 = 2; blockreq.small64 = 1; blockreq.small128 = 1; blockreq.small256 = 1; break; case 64: blockreq.small64 = 2; blockreq.small128 = 1; blockreq.small256 = 1; break; case 128: blockreq.small128 = 2; blockreq.small256 = 1; break; case 256: blockreq.small256 = 2; break; default: error("We don't make a %d from size %d", cnodes, bg_record->cnode_cnt); goto finished; break; } full_mp = true; break; #endif } if (!full_mp && bg_record->ionode_bitmap) { if ((start = bit_ffs(bg_record->ionode_bitmap)) == -1) start = 0; } #ifdef HAVE_BGL if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) info("Asking for %u 32CNBlocks, and %u 128CNBlocks " "from a %u block, starting at ionode %d.", blockreq.small32, blockreq.small128, bg_record->cnode_cnt, start); #else if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) info("Asking for %u 16CNBlocks, %u 32CNBlocks, " "%u 64CNBlocks, %u 128CNBlocks, and %u 256CNBlocks " "from a %u block, starting at ionode %d.", blockreq.small16, blockreq.small32, blockreq.small64, blockreq.small128, blockreq.small256, bg_record->cnode_cnt, start); #endif handle_small_record_request(new_blocks, &blockreq, bg_record, start); finished: return SLURM_SUCCESS; }
/* block_state_mutex must be locked before calling this. */ extern int add_bg_record(List records, List *used_nodes, select_ba_request_t *blockreq, bool no_check, bitoff_t io_start) { bg_record_t *bg_record = NULL; ba_mp_t *ba_mp = NULL; ListIterator itr; uid_t pw_uid; int i, len; int small_count = 0; xassert(bg_conf->slurm_user_name); if (!records) { fatal("add_bg_record: no records list given"); } bg_record = (bg_record_t*) xmalloc(sizeof(bg_record_t)); bg_record->magic = BLOCK_MAGIC; bg_record->user_name = xstrdup(bg_conf->slurm_user_name); bg_record->target_name = xstrdup(bg_conf->slurm_user_name); if (uid_from_string (bg_record->user_name, &pw_uid) < 0) error("add_bg_record: No such user: %s", bg_record->user_name); else bg_record->user_uid = pw_uid; if (used_nodes && *used_nodes) { #ifdef HAVE_BGQ bg_record->ba_mp_list = *used_nodes; *used_nodes = NULL; #else bg_record->ba_mp_list = list_create(destroy_ba_mp); if (copy_node_path(*used_nodes, &bg_record->ba_mp_list) == SLURM_ERROR) error("add_bg_record: " "couldn't copy the path for the allocation"); #endif } else bg_record->ba_mp_list = list_create(destroy_ba_mp); /* bg_record->boot_state = 0; Implicit */ bg_record->state = BG_BLOCK_FREE; #ifdef HAVE_BGL if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) info("add_bg_record: asking for %s %d %d %s", blockreq->save_name, blockreq->small32, blockreq->small128, conn_type_string(blockreq->conn_type[0])); #else if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) info("add_bg_record: asking for %s %d %d %d %d %d %s", blockreq->save_name, blockreq->small256, blockreq->small128, blockreq->small64, blockreq->small32, blockreq->small16, conn_type_string(blockreq->conn_type[0])); #endif /* Set the bitmap blank here if it is a full node we don't want anything set we also don't want the bg_record->ionode_str set. */ bg_record->ionode_bitmap = bit_alloc(bg_conf->ionodes_per_mp); bg_record->mp_used_bitmap = bit_alloc(node_record_count); len = strlen(blockreq->save_name); i=0; while (i<len && blockreq->save_name[i] != '[' && (blockreq->save_name[i] < '0' || blockreq->save_name[i] > 'Z' || (blockreq->save_name[i] > '9' && blockreq->save_name[i] < 'A'))) i++; if (i<len) { len -= i; len += strlen(bg_conf->slurm_node_prefix)+1; bg_record->mp_str = xmalloc(len); snprintf(bg_record->mp_str, len, "%s%s", bg_conf->slurm_node_prefix, blockreq->save_name+i); } else fatal("add_bg_record: MPs=%s is in a weird format", blockreq->save_name); process_nodes(bg_record, false); #ifdef HAVE_BGL bg_record->node_use = SELECT_COPROCESSOR_MODE; #endif memcpy(bg_record->conn_type, blockreq->conn_type, sizeof(bg_record->conn_type)); bg_record->cpu_cnt = bg_conf->cpus_per_mp * bg_record->mp_count; bg_record->cnode_cnt = bg_conf->mp_cnode_cnt * bg_record->mp_count; bg_record->job_running = NO_JOB_RUNNING; #ifdef HAVE_BGL if (blockreq->blrtsimage) bg_record->blrtsimage = xstrdup(blockreq->blrtsimage); else bg_record->blrtsimage = xstrdup(bg_conf->default_blrtsimage); #endif #ifdef HAVE_BG_L_P if (blockreq->linuximage) bg_record->linuximage = xstrdup(blockreq->linuximage); else bg_record->linuximage = xstrdup(bg_conf->default_linuximage); if (blockreq->ramdiskimage) bg_record->ramdiskimage = xstrdup(blockreq->ramdiskimage); else bg_record->ramdiskimage = xstrdup(bg_conf->default_ramdiskimage); #endif if (blockreq->mloaderimage) bg_record->mloaderimage = xstrdup(blockreq->mloaderimage); else bg_record->mloaderimage = xstrdup(bg_conf->default_mloaderimage); if (bg_record->conn_type[0] < SELECT_SMALL) { /* this needs to be an append so we keep things in the order we got them, they will be sorted later */ list_append(records, bg_record); /* this isn't a correct list so we need to set it later for now we just used it to be the mp number */ if (!used_nodes) { debug4("add_bg_record: " "we didn't get a request list so we are " "destroying this mp list"); list_destroy(bg_record->ba_mp_list); bg_record->ba_mp_list = NULL; } } else { List ba_mp_list = NULL; if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) info("add_bg_record: adding a small block"); if (no_check) goto no_check; /* if the ionode cnt for small32 is 0 then don't allow a sub quarter allocation */ if (bg_conf->nodecard_ionode_cnt < 2) { if (!bg_conf->nodecard_ionode_cnt && blockreq->small32) fatal("add_bg_record: " "There is an error in your " "bluegene.conf file.\n" "Can't create a 32 node block with " "IonodesPerMP=%u. (Try setting it " "to at least 16)", bg_conf->ionodes_per_mp); #ifndef HAVE_BGL if (blockreq->small16) fatal("add_bg_record: " "There is an error in your " "bluegene.conf file.\n" "Can't create a 16 node block with " "IonodesPerMP=%u. (Try setting it to " "at least 32)", bg_conf->ionodes_per_mp); if ((bg_conf->io_ratio < 0.5) && blockreq->small64) fatal("add_bg_record: " "There is an error in your " "bluegene.conf file.\n" "Can't create a 64 node block with " "IonodesPerMP=%u. (Try setting it " "to at least 8)", bg_conf->ionodes_per_mp); #endif } #ifdef HAVE_BGL if (blockreq->small32==0 && blockreq->small128==0) { info("add_bg_record: " "No specs given for this small block, " "I am spliting this block into 4 128CnBlocks"); blockreq->small128=4; } i = (blockreq->small32*bg_conf->nodecard_cnode_cnt) + (blockreq->small128*bg_conf->quarter_cnode_cnt); if (i != bg_conf->mp_cnode_cnt) fatal("add_bg_record: " "There is an error in your bluegene.conf file.\n" "I am unable to request %d nodes consisting of " "%u 32CnBlocks and\n%u 128CnBlocks in one " "base partition with %u nodes.", i, blockreq->small32, blockreq->small128, bg_conf->mp_cnode_cnt); small_count = blockreq->small32+blockreq->small128; #else if (!blockreq->small16 && !blockreq->small32 && !blockreq->small64 && !blockreq->small128 && !blockreq->small256) { info("add_bg_record: " "No specs given for this small block, " "I am spliting this block into 2 256CnBlocks"); blockreq->small256=2; } i = (blockreq->small16*16) + (blockreq->small32*32) + (blockreq->small64*64) + (blockreq->small128*128) + (blockreq->small256*256); if (i != bg_conf->mp_cnode_cnt) fatal("add_bg_record: " "There is an error in your bluegene.conf file.\n" "I am unable to request %d nodes consisting of " "%u 16CNBlocks, %u 32CNBlocks,\n" "%u 64CNBlocks, %u 128CNBlocks, " "and %u 256CNBlocks\n" "in one base partition with %u nodes.", i, blockreq->small16, blockreq->small32, blockreq->small64, blockreq->small128, blockreq->small256, bg_conf->mp_cnode_cnt); small_count = blockreq->small16 + blockreq->small32 + blockreq->small64 + blockreq->small128 + blockreq->small256; #endif no_check: /* Automatically create 2-way split if * conn_type == SELECT_SMALL in bluegene.conf * Here we go through each node listed and do the same thing * for each node. */ ba_mp_list = bg_record->ba_mp_list; bg_record->ba_mp_list = list_create(NULL); itr = list_iterator_create(ba_mp_list); while ((ba_mp = list_next(itr)) != NULL) { xfree(bg_record->mp_str); bg_record->mp_str = xstrdup_printf( "%s%s", bg_conf->slurm_node_prefix, ba_mp->coord_str); list_append(bg_record->ba_mp_list, ba_mp); handle_small_record_request(records, blockreq, bg_record, io_start); list_flush(bg_record->ba_mp_list); } list_iterator_destroy(itr); destroy_bg_record(bg_record); list_destroy(ba_mp_list); } return SLURM_SUCCESS; }