/* * Validate the cpus and select the frequency to set * Called from task cgroup cpuset code with string containing * the list of cpus to be used by this step */ void cpu_freq_cgroup_validate(stepd_step_rec_t *job, char *step_alloc_cores) { uint16_t start = USHRT_MAX; uint16_t end = USHRT_MAX; uint16_t cpuidx = 0; char *core_range; debug2("cpu_freq_cgroup_validate: request value = %12d %8x", job->cpu_freq, job->cpu_freq); debug2(" jobid=%u, stepid=%u, tasks=%u cpu/task=%u, cpus=%u", job->jobid,job->stepid,job->node_tasks, job->cpus_per_task,job->cpus); debug2(" cpu_bind_type=%4x, cpu_bind map=%s", job->cpu_bind_type, job->cpu_bind); debug2(" step logical cores = %s, step physical cores = %s", job->step_alloc_cores, step_alloc_cores); if (!cpu_freq_count) return; /* set entries in cpu frequency table for this step's cpus */ core_range = step_alloc_cores; while ( (cpuidx = _cpu_freq_next_cpu(&core_range, &cpuidx, &start, &end)) != USHRT_MAX) { if (cpuidx >= cpu_freq_count) { error("cpu_freq_validate: index %u exceeds cpu count %u", cpuidx, cpu_freq_count); return; } _cpu_freq_find_valid(job->cpu_freq, cpuidx); } cpu_freq_set(job); return; }
static int _handle_resume(int fd, stepd_step_rec_t *job, uid_t uid) { int rc = SLURM_SUCCESS; int errnum = 0; debug("_handle_resume for job %u.%u", job->jobid, job->stepid); debug3(" uid = %d", uid); if (!_slurm_authorized_user(uid)) { debug("job step resume request from uid %ld for job %u.%u ", (long)uid, job->jobid, job->stepid); rc = -1; errnum = EPERM; goto done; } if (job->cont_id == 0) { debug ("step %u.%u invalid container [cont_id:%"PRIu64"]", job->jobid, job->stepid, job->cont_id); rc = -1; errnum = ESLURMD_JOB_NOTRUNNING; goto done; } acct_gather_resume_poll(); /* * Signal the container */ pthread_mutex_lock(&suspend_mutex); if (!suspended) { rc = -1; errnum = ESLURMD_STEP_NOTSUSPENDED; pthread_mutex_unlock(&suspend_mutex); goto done; } else { if (proctrack_g_signal(job->cont_id, SIGCONT) < 0) { verbose("Error resuming %u.%u: %m", job->jobid, job->stepid); } else { verbose("Resumed %u.%u", job->jobid, job->stepid); } suspended = false; } /* set the cpu frequencies if cpu_freq option used */ if (job->cpu_freq != NO_VAL) cpu_freq_set(job); pthread_mutex_unlock(&suspend_mutex); done: /* Send the return code and errno */ safe_write(fd, &rc, sizeof(int)); safe_write(fd, &errnum, sizeof(int)); return SLURM_SUCCESS; rwfail: return SLURM_FAILURE; }
/* * Validate the cpus and select the frequency to set * Called from task cgroup cpuset code with string containing * the list of cpus to be used by this step */ extern void cpu_freq_cgroup_validate(stepd_step_rec_t *job, char *step_alloc_cores) { uint16_t start = USHRT_MAX; uint16_t end = USHRT_MAX; uint16_t cpuidx = 0; char *core_range; debug_flags = slurm_get_debug_flags(); /* init for slurmstepd */ if (debug_flags & DEBUG_FLAG_CPU_FREQ) { info("cpu_freq_cgroup_validate: request: min=(%12d %8x) " "max=(%12d %8x) governor=%8x", job->cpu_freq_min, job->cpu_freq_min, job->cpu_freq_max, job->cpu_freq_max, job->cpu_freq_gov); info(" jobid=%u, stepid=%u, tasks=%u cpu/task=%u, cpus=%u", job->jobid,job->stepid,job->node_tasks, job->cpus_per_task,job->cpus); info(" cpu_bind_type=%4x, cpu_bind map=%s", job->cpu_bind_type, job->cpu_bind); info(" step logical cores = %s, step physical cores = %s", job->step_alloc_cores, step_alloc_cores); } if (!cpu_freq_count) return; for (cpuidx = 0; cpuidx < cpu_freq_count; cpuidx++) { _cpu_freq_init_data(cpuidx); } /* set entries in cpu frequency table for this step's cpus */ core_range = step_alloc_cores; while ( (cpuidx = _cpu_freq_next_cpu(&core_range, &cpuidx, &start, &end)) != USHRT_MAX) { if (cpuidx >= cpu_freq_count) { error("cpu_freq_validate: index %u exceeds cpu count %u", cpuidx, cpu_freq_count); return; } _cpu_freq_setup_data(job, cpuidx); } cpu_freq_set(job); return; }
/* * Validate the cpus and select the frequency to set * Called from task cpuset code with task launch request containing * a pointer to a hex map string of the cpus to be used by this step */ extern void cpu_freq_cpuset_validate(stepd_step_rec_t *job) { int cpuidx, cpu_num; bitstr_t *cpus_to_set; bitstr_t *cpu_map; char *cpu_bind; char *cpu_str; char *savestr = NULL; debug_flags = slurm_get_debug_flags(); /* init for slurmstepd */ if (debug_flags & DEBUG_FLAG_CPU_FREQ) { info("cpu_freq_cpuset_validate: request: min=(%12d %8x) " "max=(%12d %8x) governor=%8x", job->cpu_freq_min, job->cpu_freq_min, job->cpu_freq_max, job->cpu_freq_max, job->cpu_freq_gov); info(" jobid=%u, stepid=%u, tasks=%u cpu/task=%u, cpus=%u", job->jobid, job->stepid, job->node_tasks, job->cpus_per_task, job->cpus); info(" cpu_bind_type=%4x, cpu_bind map=%s", job->cpu_bind_type, job->cpu_bind); } if (!cpu_freq_count) return; if (job->cpu_bind == NULL) { error("cpu_freq_cpuset_validate: cpu_bind string is null"); return; } cpu_bind = xstrdup(job->cpu_bind); if ( (cpu_str = strtok_r(cpu_bind, ",", &savestr) ) == NULL) { error("cpu_freq_cpuset_validate: cpu_bind string invalid"); xfree(cpu_bind); return; } cpu_map = (bitstr_t *) bit_alloc(cpu_freq_count); cpus_to_set = (bitstr_t *) bit_alloc(cpu_freq_count); do { debug3(" cpu_str = %s", cpu_str); if ((job->cpu_bind_type & CPU_BIND_MAP) == CPU_BIND_MAP) { cpu_num = atoi(cpu_str); if (cpu_num >= cpu_freq_count) { error("cpu_freq_cpuset_validate: invalid cpu " "number %d", cpu_num); bit_free(cpu_map); bit_free(cpus_to_set); xfree(cpu_bind); return; } bit_set(cpu_map, (bitoff_t)cpu_num); } else { if (bit_unfmt_hexmask(cpu_map, cpu_str) == -1) { error("cpu_freq_cpuset_validate: invalid cpu " "mask %s", cpu_bind); bit_free(cpu_map); bit_free(cpus_to_set); xfree(cpu_bind); return; } } bit_or(cpus_to_set, cpu_map); } while ( (cpu_str = strtok_r(NULL, ",", &savestr) ) != NULL); for (cpuidx = 0; cpuidx < cpu_freq_count; cpuidx++) { _cpu_freq_init_data(cpuidx); if (bit_test(cpus_to_set, cpuidx)) { _cpu_freq_setup_data(job, cpuidx); } } cpu_freq_set(job); bit_free(cpu_map); bit_free(cpus_to_set); xfree(cpu_bind); return; }
/* * Validate the cpus and select the frequency to set * Called from task cpuset code with task launch request containing * a pointer to a hex map string of the cpus to be used by this step */ void cpu_freq_cpuset_validate(stepd_step_rec_t *job) { int cpuidx, cpu_num; bitstr_t *cpus_to_set; bitstr_t *cpu_map; char *cpu_bind; char *cpu_str; char *savestr = NULL; debug2("cpu_freq_cpuset_validate: request = %12d %8x", job->cpu_freq, job->cpu_freq); debug2(" jobid=%u, stepid=%u, tasks=%u cpu/task=%u, cpus=%u", job->jobid, job->stepid, job->node_tasks, job->cpus_per_task,job->cpus); debug2(" cpu_bind_type=%4x, cpu_bind map=%s", job->cpu_bind_type, job->cpu_bind); if (!cpu_freq_count) return; if (job->cpu_bind == NULL) { error("cpu_freq_cpuset_validate: cpu_bind string is null"); return; } cpu_bind = xstrdup(job->cpu_bind); if ( (cpu_str = strtok_r(cpu_bind, ",", &savestr) ) == NULL) { error("cpu_freq_cpuset_validate: cpu_bind string invalid"); xfree(cpu_bind); return; } cpu_map = (bitstr_t *) bit_alloc(cpu_freq_count); cpus_to_set = (bitstr_t *) bit_alloc(cpu_freq_count); do { debug3(" cpu_str = %s", cpu_str); if ((job->cpu_bind_type & CPU_BIND_MAP) == CPU_BIND_MAP) { cpu_num = atoi(cpu_str); if (cpu_num >= cpu_freq_count) { error("cpu_freq_cpuset_validate: invalid cpu " "number %d", cpu_num); bit_free(cpu_map); bit_free(cpus_to_set); xfree(cpu_bind); return; } bit_set(cpu_map, (bitoff_t)cpu_num); } else { if (bit_unfmt_hexmask(cpu_map, cpu_str) == -1) { error("cpu_freq_cpuset_validate: invalid cpu " "mask %s", cpu_bind); bit_free(cpu_map); bit_free(cpus_to_set); xfree(cpu_bind); return; } } bit_or(cpus_to_set, cpu_map); } while ( (cpu_str = strtok_r(NULL, ",", &savestr) ) != NULL); for (cpuidx=0; cpuidx < cpu_freq_count; cpuidx++) { if (bit_test(cpus_to_set, cpuidx)) { _cpu_freq_find_valid(job->cpu_freq, cpuidx); } } cpu_freq_set(job); bit_free(cpu_map); bit_free(cpus_to_set); xfree(cpu_bind); return; }