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 #include -#include #include #include @@ -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 #include #include -#include -#include #include #ifdef HAVE_GETOPT_LONG #include @@ -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,