|
|
- Revert upstream commit d1993bcde2a524346a9508754671f096ec129ad1
- to avoid glib dependency. That commit polluted the main code
- with glib types.
-
- --- a/irqbalance.h
- +++ b/irqbalance.h
- @@ -8,7 +8,6 @@
-
- #include <stdint.h>
- #include <glib.h>
- -#include <glib-unix.h>
- #include <syslog.h>
- #include <limits.h>
-
- @@ -63,7 +62,6 @@ extern GList *packages;
- extern GList *cache_domains;
- extern GList *cpus;
- extern int numa_avail;
- -extern GList *cl_banned_irqs;
-
- extern int debug_mode;
- extern int journal_logging;
- @@ -171,7 +169,5 @@ extern unsigned int log_mask;
- }while(0)
- #endif /* HAVE_LIBSYSTEMD */
-
- -#define SOCKET_PATH "irqbalance"
- -
- #endif /* __INCLUDE_GUARD_IRQBALANCE_H_ */
-
- --- a/irqbalance.c
- +++ b/irqbalance.c
- @@ -31,8 +31,6 @@
- #include <time.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- -#include <sys/socket.h>
- -#include <sys/un.h>
- #include <fcntl.h>
- #ifdef HAVE_GETOPT_LONG
- #include <getopt.h>
- @@ -44,7 +42,6 @@
- #include "irqbalance.h"
-
- volatile int keep_going = 1;
- -int socket_fd;
- int one_shot_mode;
- int debug_mode;
- int foreground_mode;
- @@ -61,9 +58,6 @@ char *banscript = NULL;
- char *polscript = NULL;
- long HZ;
- int sleep_interval = SLEEP_INTERVAL;
- -GMainLoop *main_loop;
- -
- -char *banned_cpumask_from_ui = NULL;
-
- static void sleep_approx(int seconds)
- {
- @@ -236,224 +230,22 @@ static void force_rebalance_irq(struct i
- info->assigned_obj = NULL;
- }
-
- -gboolean handler(gpointer data __attribute__((unused)))
- +static void handler(int signum)
- {
- + (void)signum;
- keep_going = 0;
- - g_main_loop_quit(main_loop);
- - return TRUE;
- }
-
- -gboolean force_rescan(gpointer data __attribute__((unused)))
- +static void force_rescan(int signum)
- {
- + (void)signum;
- if (cycle_count)
- need_rescan = 1;
- - return TRUE;
- -}
- -
- -gboolean scan(gpointer data)
- -{
- - log(TO_CONSOLE, LOG_INFO, "\n\n\n-----------------------------------------------------------------------------\n");
- - clear_work_stats();
- - parse_proc_interrupts();
- - parse_proc_stat();
- -
- -
- - /* cope with cpu hotplug -- detected during /proc/interrupts parsing */
- - if (need_rescan) {
- - need_rescan = 0;
- - cycle_count = 0;
- - log(TO_CONSOLE, LOG_INFO, "Rescanning cpu topology \n");
- - clear_work_stats();
- -
- - free_object_tree();
- - build_object_tree();
- - for_each_irq(NULL, force_rebalance_irq, NULL);
- - parse_proc_interrupts();
- - parse_proc_stat();
- - sleep_approx(sleep_interval);
- - clear_work_stats();
- - parse_proc_interrupts();
- - parse_proc_stat();
- - }
- -
- - if (cycle_count)
- - update_migration_status();
- -
- - calculate_placement();
- - activate_mappings();
- -
- - if (debug_mode)
- - dump_tree();
- - if (one_shot_mode)
- - keep_going = 0;
- - cycle_count++;
- -
- - if (data != &sleep_interval) {
- - data = &sleep_interval;
- - g_timeout_add_seconds(sleep_interval, scan, data);
- - return FALSE;
- - }
- -
- - if (keep_going)
- - return TRUE;
- - else
- - return FALSE;
- -}
- -
- -void get_irq_data(struct irq_info *irq, void *data)
- -{
- - sprintf(data + strlen(data),
- - "IRQ %d LOAD %lu DIFF %lu CLASS %d ", irq->irq, irq->load,
- - (irq->irq_count - irq->last_irq_count), irq->class);
- -}
- -
- -void get_object_stat(struct topo_obj *object, void *data)
- -{
- - char irq_data[1024] = "\0";
- -
- - if (g_list_length(object->interrupts) > 0) {
- - for_each_irq(object->interrupts, get_irq_data, irq_data);
- - }
- - sprintf(data + strlen(data), "TYPE %d NUMBER %d LOAD %lu SAVE_MODE %d %s",
- - object->obj_type, object->number, object->load,
- - object->powersave_mode, irq_data);
- - if (object->obj_type != OBJ_TYPE_CPU) {
- - for_each_object(object->children, get_object_stat, data);
- - }
- -}
- -
- -gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attribute__((unused)))
- -{
- - char buff[500];
- - int sock;
- - int recv_size = 0;
- - int valid_user = 0;
- -
- - struct iovec iov = { buff, 500 };
- - struct msghdr msg = { NULL, 0, &iov, 1, NULL, 0, 0 };
- - msg.msg_control = malloc(CMSG_SPACE(sizeof(struct ucred)));
- - msg.msg_controllen = CMSG_SPACE(sizeof(struct ucred));
- -
- - struct cmsghdr *cmsg;
- -
- - if (condition == G_IO_IN) {
- - sock = accept(fd, NULL, NULL);
- - if (sock < 0) {
- - log(TO_ALL, LOG_WARNING, "Connection couldn't be accepted.\n");
- - return TRUE;
- - }
- - if ((recv_size = recvmsg(sock, &msg, 0)) < 0) {
- - log(TO_ALL, LOG_WARNING, "Error while receiving data.\n");
- - return TRUE;
- - }
- - cmsg = CMSG_FIRSTHDR(&msg);
- - if ((cmsg->cmsg_level == SOL_SOCKET) &&
- - (cmsg->cmsg_type == SCM_CREDENTIALS)) {
- - struct ucred *credentials = (struct ucred *) CMSG_DATA(cmsg);
- - if (!credentials->uid) {
- - valid_user = 1;
- - }
- - }
- - if (!valid_user) {
- - log(TO_ALL, LOG_INFO, "Permission denied for user to connect to socket.\n");
- - return TRUE;
- - }
- -
- - if (!strncmp(buff, "stats", strlen("stats"))) {
- - char stats[2048] = "\0";
- - for_each_object(numa_nodes, get_object_stat, stats);
- - send(sock, stats, strlen(stats), 0);
- - }
- - if (!strncmp(buff, "settings ", strlen("settings "))) {
- - if (!(strncmp(buff + strlen("settings "), "sleep ",
- - strlen("sleep ")))) {
- - char *sleep_string = malloc(
- - sizeof(char) * (recv_size - strlen("settings sleep ")));
- - strncpy(sleep_string, buff + strlen("settings sleep "),
- - recv_size - strlen("settings sleep "));
- - int new_iterval = strtoul(sleep_string, NULL, 10);
- - if (new_iterval >= 1) {
- - sleep_interval = new_iterval;
- - }
- - } else if (!(strncmp(buff + strlen("settings "), "ban irqs ",
- - strlen("ban irqs ")))) {
- - char *end;
- - char *irq_string = malloc(
- - sizeof(char) * (recv_size - strlen("settings ban irqs ")));
- - strncpy(irq_string, buff + strlen("settings ban irqs "),
- - recv_size - strlen("settings ban irqs "));
- - g_list_free_full(cl_banned_irqs, free);
- - cl_banned_irqs = NULL;
- - need_rescan = 1;
- - if (!strncmp(irq_string, "NONE", strlen("NONE"))) {
- - return TRUE;
- - }
- - int irq = strtoul(irq_string, &end, 10);
- - do {
- - add_cl_banned_irq(irq);
- - } while((irq = strtoul(end, &end, 10)));
- - } else if (!(strncmp(buff + strlen("settings "), "cpus ",
- - strlen("cpus")))) {
- - char *cpu_ban_string = malloc(
- - sizeof(char) * (recv_size - strlen("settings cpus ")));
- - strncpy(cpu_ban_string, buff + strlen("settings cpus "),
- - recv_size - strlen("settings cpus "));
- - banned_cpumask_from_ui = strtok(cpu_ban_string, " ");
- - if (!strncmp(banned_cpumask_from_ui, "NULL", strlen("NULL"))) {
- - banned_cpumask_from_ui = NULL;
- - }
- - need_rescan = 1;
- - }
- - }
- - if (!strncmp(buff, "setup", strlen("setup"))) {
- - char setup[2048] = "\0";
- - snprintf(setup, 2048, "SLEEP %d ", sleep_interval);
- - if(g_list_length(cl_banned_irqs) > 0) {
- - for_each_irq(cl_banned_irqs, get_irq_data, setup);
- - }
- - char banned[512];
- - cpumask_scnprintf(banned, 512, banned_cpus);
- - snprintf(setup + strlen(setup), 2048 - strlen(setup),
- - "BANNED %s", banned);
- - send(sock, setup, strlen(setup), 0);
- - }
- -
- - close(sock);
- - }
- - return TRUE;
- -}
- -
- -int init_socket(char *socket_name)
- -{
- - struct sockaddr_un addr;
- - memset(&addr, 0, sizeof(struct sockaddr_un));
- -
- - socket_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
- - if (socket_fd < 0) {
- - log(TO_ALL, LOG_WARNING, "Socket couldn't be created.\n");
- - return 1;
- - }
- -
- - addr.sun_family = AF_UNIX;
- - addr.sun_path[0] = '\0';
- - strncpy(addr.sun_path + 1, socket_name, strlen(socket_name));
- - if (bind(socket_fd, (struct sockaddr *)&addr,
- - sizeof(sa_family_t) + strlen(socket_name) + 1) < 0) {
- - log(TO_ALL, LOG_WARNING, "Daemon couldn't be bound to the socket.\n");
- - return 1;
- - }
- - int optval = 1;
- - if (setsockopt(socket_fd, SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) < 0) {
- - log(TO_ALL, LOG_WARNING, "Unable to set socket options.\n");
- - return 1;
- - }
- - listen(socket_fd, 1);
- - g_unix_fd_add(socket_fd, G_IO_IN, sock_handle, NULL);
- - return 0;
- }
-
- int main(int argc, char** argv)
- {
- + struct sigaction action, hupaction;
- sigset_t sigset, old_sigset;
-
- sigemptyset(&sigset);
- @@ -553,11 +345,19 @@ int main(int argc, char** argv)
- }
- }
-
- - g_unix_signal_add(SIGINT, handler, NULL);
- - g_unix_signal_add(SIGTERM, handler, NULL);
- - g_unix_signal_add(SIGUSR1, handler, NULL);
- - g_unix_signal_add(SIGUSR2, handler, NULL);
- - g_unix_signal_add(SIGHUP, force_rescan, NULL);
- + action.sa_handler = handler;
- + sigemptyset(&action.sa_mask);
- + action.sa_flags = 0;
- + sigaction(SIGINT, &action, NULL);
- + sigaction(SIGTERM, &action, NULL);
- + sigaction(SIGUSR1, &action, NULL);
- + sigaction(SIGUSR2, &action, NULL);
- +
- + hupaction.sa_handler = force_rescan;
- + sigemptyset(&hupaction.sa_mask);
- + hupaction.sa_flags = 0;
- + sigaction(SIGHUP, &hupaction, NULL);
- +
- sigprocmask(SIG_SETMASK, &old_sigset, NULL);
-
- #ifdef HAVE_LIBCAP_NG
- @@ -566,32 +366,58 @@ int main(int argc, char** argv)
- capng_lock();
- capng_apply(CAPNG_SELECT_BOTH);
- #endif
- +
- for_each_irq(NULL, force_rebalance_irq, NULL);
-
- parse_proc_interrupts();
- parse_proc_stat();
-
- - char socket_name[64];
- - snprintf(socket_name, 64, "%s%d.sock", SOCKET_PATH, getpid());
- + while (keep_going) {
- + sleep_approx(sleep_interval);
- + log(TO_CONSOLE, LOG_INFO, "\n\n\n-----------------------------------------------------------------------------\n");
-
- - if (init_socket(socket_name)) {
- - return EXIT_FAILURE;
- - }
- - main_loop = g_main_loop_new(NULL, FALSE);
- - int *last_interval = &sleep_interval;
- - g_timeout_add_seconds(sleep_interval, scan, last_interval);
- - g_main_loop_run(main_loop);
-
- - g_main_loop_quit(main_loop);
- + clear_work_stats();
- + parse_proc_interrupts();
- + parse_proc_stat();
- +
- + /* cope with cpu hotplug -- detected during /proc/interrupts parsing */
- + if (need_rescan) {
- + need_rescan = 0;
- + cycle_count = 0;
- + log(TO_CONSOLE, LOG_INFO, "Rescanning cpu topology \n");
- + clear_work_stats();
- +
- + free_object_tree();
- + build_object_tree();
- + for_each_irq(NULL, force_rebalance_irq, NULL);
- + parse_proc_interrupts();
- + parse_proc_stat();
- + sleep_approx(sleep_interval);
- + clear_work_stats();
- + parse_proc_interrupts();
- + parse_proc_stat();
- + }
- +
- + if (cycle_count)
- + update_migration_status();
- +
- + calculate_placement();
- + activate_mappings();
-
- + if (debug_mode)
- + dump_tree();
- + if (one_shot_mode)
- + keep_going = 0;
- + cycle_count++;
- +
- + }
- free_object_tree();
- free_cl_opts();
-
- /* Remove pidfile */
- if (!foreground_mode && pidfile)
- unlink(pidfile);
- - /* Remove socket */
- - close(socket_fd);
-
- return EXIT_SUCCESS;
- }
- --- a/cputree.c
- +++ b/cputree.c
- @@ -38,7 +38,6 @@
-
- #include "irqbalance.h"
-
- -extern char *banned_cpumask_from_ui;
-
- GList *cpus;
- GList *cache_domains;
- @@ -77,15 +76,11 @@ static void setup_banned_cpus(void)
- cpus_clear(nohz_full);
-
- /* A manually specified cpumask overrides auto-detection. */
- - if (banned_cpumask_from_ui != NULL) {
- - cpulist_parse(banned_cpumask_from_ui,
- - strlen(banned_cpumask_from_ui), banned_cpus);
- - goto out;
- - }
- if (getenv("IRQBALANCE_BANNED_CPUS")) {
- cpumask_parse_user(getenv("IRQBALANCE_BANNED_CPUS"), strlen(getenv("IRQBALANCE_BANNED_CPUS")), banned_cpus);
- goto out;
- }
- +
- file = fopen("/sys/devices/system/cpu/isolated", "r");
- if (file) {
- if (getline(&line, &size, file) > 0) {
- @@ -117,8 +112,6 @@ out:
- log(TO_CONSOLE, LOG_INFO, "Isolated CPUs: %s\n", buffer);
- cpumask_scnprintf(buffer, 4096, nohz_full);
- log(TO_CONSOLE, LOG_INFO, "Adaptive-ticks CPUs: %s\n", buffer);
- - cpumask_scnprintf(buffer, 4096, banned_cpus);
- - log(TO_CONSOLE, LOG_INFO, "Banned CPUs: %s\n", buffer);
- }
-
- static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
|