/* * set one of scalling_min_freq, scaling_max_freq, scaling_setspeed * -- assume governor already set to userspace --- * */ static int _cpu_freq_set_scaling_freq(stepd_step_rec_t *job, int cpx, uint32_t freq, char* option) { char path[SYSFS_PATH_MAX]; FILE *fp; int fd, rc; uint32_t newfreq; rc = SLURM_SUCCESS; snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/cpufreq/%s", cpx, option); fd = _set_cpu_owner_lock(cpx, job->jobid); if ((fp = fopen(path, "w"))) { fprintf(fp, "%u\n", freq); fclose(fp); } else { error("%s: Can not set %s: %m", __func__, option); rc = SLURM_FAILURE; } (void) close(fd); if (debug_flags & DEBUG_FLAG_CPU_FREQ) { newfreq = _cpu_freq_get_scaling_freq(cpx, option); if (newfreq != freq) { error("Failed to set freq_scaling %s to %u (org=%u)", option, freq, newfreq); } } return rc; }
/* * set cpu governor */ static int _cpu_freq_set_gov(stepd_step_rec_t *job, int cpuidx, char* gov ) { char path[PATH_MAX]; FILE *fp; int fd, rc; rc = SLURM_SUCCESS; snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/cpufreq/scaling_governor", cpuidx); fd = _set_cpu_owner_lock(cpuidx, job->jobid); if ((fp = fopen(path, "w"))) { fputs(gov, fp); fputc('\n', fp); fclose(fp); } else { error("%s: Can not set CPU governor: %m", __func__); rc = SLURM_FAILURE; } if (fd >= 0) { (void) fd_release_lock(fd); (void) close(fd); } return rc; }