| /* |
| * stalld code to handle automatically turning off RT throttling while running |
| * |
| * SPDX-License-Identifier: GPL-2.0 |
| * |
| * Copyright (C) 2020 Red Hat Inc, Daniel Bristot de Oliveira <bristot@redhat.com> |
| * |
| */ |
| |
| #define _GNU_SOURCE |
| #include <ctype.h> |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <getopt.h> |
| #include <pthread.h> |
| #include <sched.h> |
| #include <signal.h> |
| #include <stdarg.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <syslog.h> |
| #include <sys/param.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| #include <time.h> |
| #include <unistd.h> |
| #include <linux/sched.h> |
| |
| #include "stalld.h" |
| |
| #define RT_RUNTIME_PATH "/proc/sys/kernel/sched_rt_runtime_us" |
| |
| static long rt_runtime_us = 0; |
| |
| static void restore_rt_throttling(int status, void *arg) |
| { |
| if (rt_runtime_us != -1) { |
| int fd = open(RT_RUNTIME_PATH, O_WRONLY); |
| char buffer[80]; |
| |
| if (fd < 0) |
| die("restore_rt_throttling: failed to open %s\n", RT_RUNTIME_PATH); |
| sprintf(buffer, "%ld", rt_runtime_us); |
| write(fd, buffer, strlen(buffer)); |
| close(fd); |
| log_msg("RT Throttling runtime restored to %d\n", rt_runtime_us); |
| } |
| } |
| |
| int turn_off_rt_throttling(void) |
| { |
| int fd; |
| char buffer[80]; |
| int status; |
| |
| |
| /* get the current value of the throttling runtime */ |
| fd = open(RT_RUNTIME_PATH, O_RDWR); |
| status = read(fd, buffer, sizeof(buffer)); |
| if (status < 0) |
| die("turn_off_rt_throttling: failed to read %s\n", |
| RT_RUNTIME_PATH); |
| |
| rt_runtime_us = strtol(buffer, NULL, 10); |
| |
| if (rt_runtime_us == -1) { |
| log_msg("RT throttling already disabled, doing nothing\n"); |
| close(fd); |
| return 0; |
| } |
| |
| /* turn off throttling and register an exit handler to restore it */ |
| status = lseek(fd, 0, SEEK_SET); |
| if (status < 0) |
| die("turn_off_rt_throttling: unable to seek on %s", RT_RUNTIME_PATH); |
| status = write(fd, "-1", 2); |
| if (status < 0) |
| die("turn_off_rt_throttling: unable to write -1 to %s", RT_RUNTIME_PATH); |
| close(fd); |
| on_exit(restore_rt_throttling, NULL); |
| log_msg("RT Throttling disabled\n"); |
| return 0; |
| } |