diff --git a/src/plugins/switch/nrt/nrt.c b/src/plugins/switch/nrt/nrt.c index 068755c85d0da3c3856a61a6b6f3a108bb2c810e..a614c612fb2f92d1e762413ec60927682b38fd5d 100644 --- a/src/plugins/switch/nrt/nrt.c +++ b/src/plugins/switch/nrt/nrt.c @@ -487,16 +487,7 @@ _free_resources_by_job(slurm_nrt_jobinfo_t *jp, char *node_name) for (i = 0; i < node->adapter_count; i++) { adapter = &node->adapter_list[i]; - if (!_free_block_use(jp, adapter)) { -error("NO FREE"); ; /* No RDMA or CAU for this job no on this adapter */ - } else if (jp->cau_indexes > adapter->cau_indexes_used) { - error("switch/nrt: cau_indexes_used underflow"); - adapter->cau_indexes_used = 0; - } else { -error("DECR CAU"); - adapter->cau_indexes_used -= jp->cau_indexes; - } - + (void) _free_block_use(jp, adapter); if (adapter->window_list == NULL) { error("switch/nrt: _free_resources_by_job, " "window_list NULL for node %s adapter %s", @@ -725,7 +716,6 @@ _window_state_set(slurm_nrt_jobinfo_t *jp, char *hostname, win_state_t state) } /* for each task */ if (adapter_found) { _add_block_use(jp, adapter); - adapter->cau_indexes_used += jp->cau_indexes; } else { error("switch/nrt: Did not find adapter %s of " "type %s with lid %hu ", @@ -845,53 +835,77 @@ static int _add_block_use(slurm_nrt_jobinfo_t *jp, slurm_nrt_adapter_t *adapter) { int i; - uint64_t blocks_free; slurm_nrt_block_t *block_ptr, *free_block; + nrt_cau_index_t new_cau_count = 0; + uint64_t new_rcontext_blocks = 0; + + /* Validate sufficient CAU resources */ + if (jp->cau_indexes) { + new_cau_count = adapter->cau_indexes_used + jp->cau_indexes; + if (adapter->cau_indexes_avail < new_cau_count) { + info("switch/nrt: Insufficient cau_indexes resources " + "on adapter %s (%hu < %hu)", + adapter->adapter_name, adapter->cau_indexes_avail, + new_cau_count); + return SLURM_ERROR; + } + } - if ((jp->bulk_xfer && jp->bulk_xfer_resources) || jp->cau_indexes) { - blocks_free = adapter->rcontext_block_count - - adapter->rcontext_block_used; - if (blocks_free < jp->bulk_xfer_resources) { + /* Validate sufficient RDMA resources */ + if (jp->bulk_xfer && jp->bulk_xfer_resources) { + new_rcontext_blocks = adapter->rcontext_block_used + + jp->bulk_xfer_resources; + if (adapter->rcontext_block_count < new_rcontext_blocks) { info("switch/nrt: Insufficient bulk_xfer resources on " - "adapter %s (%"PRIu64" < %u)", - adapter->adapter_name, blocks_free, - jp->bulk_xfer_resources); + "adapter %s (%"PRIu64" < %"PRIu64")", + adapter->adapter_name, + adapter->rcontext_block_count, + new_rcontext_blocks); return SLURM_ERROR; } + } else { + jp->bulk_xfer_resources = 0; /* match jp->bulk_xfer */ + } - free_block = NULL; - block_ptr = adapter->block_list; - for (i = 0; i < adapter->block_count; i++, block_ptr++) { - if (block_ptr->job_key == jp->job_key) { - free_block = block_ptr; - break; - } else if ((block_ptr->job_key == 0) && - (free_block == 0)) { - free_block = block_ptr; - } + if ((new_cau_count == 0) && (new_rcontext_blocks == 0)) + return SLURM_SUCCESS; /* No work */ + + /* Add job_key to our table and update the resource used information */ + free_block = NULL; + block_ptr = adapter->block_list; + for (i = 0; i < adapter->block_count; i++, block_ptr++) { + if (block_ptr->job_key == jp->job_key) { + free_block = block_ptr; + break; + } else if ((block_ptr->job_key == 0) && (free_block == 0)) { + free_block = block_ptr; } - if (free_block == NULL) { - xrealloc(adapter->block_list, - sizeof(slurm_nrt_block_t) * + } + if (free_block == NULL) { + xrealloc(adapter->block_list, + sizeof(slurm_nrt_block_t) * (adapter->block_count + 8)); - free_block = adapter->block_list + adapter->block_count; - adapter->block_count += 8; - } - free_block->job_key = jp->job_key; - free_block->rcontext_block_use = jp->bulk_xfer_resources; - adapter->rcontext_block_used += jp->bulk_xfer_resources; + free_block = adapter->block_list + adapter->block_count; + adapter->block_count += 8; + } + + free_block->job_key = jp->job_key; + free_block->rcontext_block_use = jp->bulk_xfer_resources; + if (new_cau_count) + adapter->cau_indexes_used = new_cau_count; + if (new_rcontext_blocks) + adapter->rcontext_block_used = new_rcontext_blocks; + #if 0 - block_ptr = adapter->block_list; - for (i = 0; i < adapter->block_count; i++, block_ptr++) { - if (block_ptr->job_key) { - info("adapter:%s block:%d job_key:%u blocks:%u", - adapter->adapter_name, i, - block_ptr->job_key, - free_block->rcontext_block_use); - } + block_ptr = adapter->block_list; + for (i = 0; i < adapter->block_count; i++, block_ptr++) { + if (block_ptr->job_key) { + info("adapter:%s block:%d job_key:%u blocks:%u", + adapter->adapter_name, i, block_ptr->job_key, + free_block->rcontext_block_use); } -#endif } +#endif return SLURM_SUCCESS; } static bool @@ -906,8 +920,23 @@ _free_block_use(slurm_nrt_jobinfo_t *jp, slurm_nrt_adapter_t *adapter) for (i = 0; i < adapter->block_count; i++, block_ptr++) { if (block_ptr->job_key != jp->job_key) continue; - adapter->rcontext_block_used -= block_ptr-> - rcontext_block_use; + + if (jp->cau_indexes > adapter->cau_indexes_used) { + error("switch/nrt: cau_indexes_used underflow"); + adapter->cau_indexes_used = 0; + } else { + adapter->cau_indexes_used -= jp->cau_indexes; + } + + if (block_ptr->rcontext_block_use > + adapter->rcontext_block_used) { + error("switch/nrt: rcontext_block_used " + "underflow"); + adapter->rcontext_block_used = 0; + } else { + adapter->rcontext_block_used -= + block_ptr->rcontext_block_use; + } block_ptr->job_key = 0; block_ptr->rcontext_block_use = 0; found_job = true; @@ -977,7 +1006,6 @@ _allocate_windows_all(slurm_nrt_jobinfo_t *jp, char *hostname, if (context_id == 0) { if (_add_block_use(jp, adapter)) return SLURM_ERROR; - adapter->cau_indexes_used += jp->cau_indexes; } for (j = 0; j < instances; j++) { table_id++; @@ -1170,7 +1198,6 @@ _allocate_window_single(char *adapter_name, slurm_nrt_jobinfo_t *jp, if (context_id == 0) { if (_add_block_use(jp, adapter)) return SLURM_ERROR; - adapter->cau_indexes_used += jp->cau_indexes; } for (table_id = 0; table_id < instances; table_id++) { table_inx++;