Merge pull request #11500 from fantom-x/irqbalance-backport
Irqbalance: backport to 19.07
This commit is contained in:
commit
ce9229d2e0
7 changed files with 51 additions and 497 deletions
|
@ -5,14 +5,14 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=irqbalance
|
PKG_NAME:=irqbalance
|
||||||
PKG_VERSION:=1.2.0
|
PKG_VERSION:=1.6.0
|
||||||
PKG_RELEASE:=4
|
PKG_RELEASE:=7
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_URL:=https://github.com/Irqbalance/irqbalance.git
|
PKG_SOURCE_URL:=https://github.com/Irqbalance/irqbalance.git
|
||||||
PKG_SOURCE_VERSION:=0e0dd4cfe5464de2f81eaef504eab7183f1fb030
|
PKG_SOURCE_VERSION:=b47eea84cbb93f533b0cba2f1aaf9ca4da8706b9
|
||||||
PKG_MIRROR_HASH:=c826e78babfc26f777a5791b2a6ea95b61453ba3e3c5803d4428cc803216bc5c
|
PKG_MIRROR_HASH:=ce1cd84cd315492d4260786735eae81e49515ec3eebe652920a7dc57b93c0c2c
|
||||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||||
PKG_LICENSE:=GPLv2
|
PKG_LICENSE:=GPLv2
|
||||||
|
|
||||||
|
@ -23,9 +23,13 @@ PKG_REMOVE_FILES:=autogen.sh
|
||||||
|
|
||||||
PKG_BUILD_PARALLEL:=1
|
PKG_BUILD_PARALLEL:=1
|
||||||
|
|
||||||
|
# -liconv due to glib2, to be revisited later
|
||||||
|
include $(INCLUDE_DIR)/nls.mk
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
define Package/irqbalance
|
define Package/irqbalance
|
||||||
|
PKG_BUILD_DEPENDS:=glib2
|
||||||
SECTION:=utils
|
SECTION:=utils
|
||||||
CATEGORY:=Utilities
|
CATEGORY:=Utilities
|
||||||
TITLE:=IRQ usage balancing for multi-core systems
|
TITLE:=IRQ usage balancing for multi-core systems
|
||||||
|
@ -42,7 +46,12 @@ CONFIGURE_ARGS+= \
|
||||||
--disable-numa \
|
--disable-numa \
|
||||||
--with-libcap_ng=no \
|
--with-libcap_ng=no \
|
||||||
--with-systemd=no \
|
--with-systemd=no \
|
||||||
--without-glib2
|
--without-irqbalance-ui \
|
||||||
|
--enable-static=glib2
|
||||||
|
|
||||||
|
CONFIGURE_VARS += \
|
||||||
|
GLIB2_LIBS="$(STAGING_DIR)/usr/lib/libglib-2.0.a \
|
||||||
|
$(STAGING_DIR)/usr/lib/libiconv-stub/lib/libiconv.a"
|
||||||
|
|
||||||
define Package/irqbalance/install
|
define Package/irqbalance/install
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
config irqbalance 'irqbalance'
|
config irqbalance 'irqbalance'
|
||||||
option enabled '0'
|
option enabled '0'
|
||||||
|
|
||||||
|
# The default value is 10 seconds
|
||||||
|
#option interval '10'
|
||||||
|
|
||||||
|
# List of IRQ's to ignore
|
||||||
|
#list banirq '36'
|
||||||
|
#list banirq '69'
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,34 @@
|
||||||
#!/bin/sh /etc/rc.common
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
START=11
|
START=90
|
||||||
|
STOP=10
|
||||||
|
|
||||||
USE_PROCD=1
|
USE_PROCD=1
|
||||||
|
|
||||||
|
service_triggers()
|
||||||
|
{
|
||||||
|
procd_add_reload_trigger "irqbalance"
|
||||||
|
}
|
||||||
|
|
||||||
start_service() {
|
start_service() {
|
||||||
local enabled
|
local enabled
|
||||||
config_load 'irqbalance'
|
config_load 'irqbalance'
|
||||||
config_get_bool enabled irqbalance enabled 0
|
config_get_bool enabled irqbalance enabled 0
|
||||||
[ "$enabled" -gt 0 ] || return 0
|
[ "$enabled" -gt 0 ] || return 0
|
||||||
|
|
||||||
|
# 10 is the default
|
||||||
|
config_get interval irqbalance interval 10
|
||||||
|
|
||||||
|
# A list of IRQ's to ignore
|
||||||
|
banirq=""
|
||||||
|
handle_banirq_value()
|
||||||
|
{
|
||||||
|
banirq="$banirq -i $1"
|
||||||
|
}
|
||||||
|
config_list_foreach irqbalance banirq handle_banirq_value
|
||||||
|
|
||||||
procd_open_instance "irqbalance"
|
procd_open_instance "irqbalance"
|
||||||
procd_set_param command /usr/sbin/irqbalance -f
|
procd_set_param command /usr/sbin/irqbalance -f -t "$interval" "$banirq"
|
||||||
procd_set_param respawn
|
procd_set_param respawn
|
||||||
procd_close_instance
|
procd_close_instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
Revert upstream commit bf9297132d219539e07506c125c6801dd77202f4
|
|
||||||
to prevent building the UI component. Also disable manpage.
|
|
||||||
|
|
||||||
--- a/Makefile.am
|
|
||||||
+++ b/Makefile.am
|
|
||||||
@@ -24,19 +24,14 @@ AUTOMAKE_OPTIONS = no-dependencies
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
EXTRA_DIST = COPYING autogen.sh misc/irqbalance.service misc/irqbalance.env
|
|
||||||
|
|
||||||
-UI_DIR = ui
|
|
||||||
AM_CFLAGS = $(LIBCAP_NG_CFLAGS) $(GLIB_CFLAGS)
|
|
||||||
AM_CPPFLAGS = -I${top_srcdir} -W -Wall -Wshadow -Wformat -Wundef -D_GNU_SOURCE
|
|
||||||
noinst_HEADERS = bitmap.h constants.h cpumask.h irqbalance.h non-atomic.h \
|
|
||||||
- types.h $(UI_DIR)/helpers.h $(UI_DIR)/irqbalance-ui.h $(UI_DIR)/ui.h
|
|
||||||
-sbin_PROGRAMS = irqbalance irqbalance-ui
|
|
||||||
+ types.h
|
|
||||||
+sbin_PROGRAMS = irqbalance
|
|
||||||
irqbalance_SOURCES = activate.c bitmap.c classify.c cputree.c irqbalance.c \
|
|
||||||
irqlist.c numa.c placement.c procinterrupts.c
|
|
||||||
irqbalance_LDADD = $(LIBCAP_NG_LIBS) $(GLIB_LIBS)
|
|
||||||
-irqbalance_ui_SOURCES = $(UI_DIR)/helpers.c $(UI_DIR)/irqbalance-ui.c \
|
|
||||||
- $(UI_DIR)/ui.c
|
|
||||||
-irqbalance_ui_LDADD = $(GLIB_LIBS) $(CURSES_LIBS)
|
|
||||||
-dist_man_MANS = irqbalance.1
|
|
||||||
|
|
||||||
CONFIG_CLEAN_FILES = debug*.list config/*
|
|
||||||
clean-generic:
|
|
||||||
--- a/configure.ac
|
|
||||||
+++ b/configure.ac
|
|
||||||
@@ -3,7 +3,7 @@ AC_PREREQ(2.12)dnl
|
|
||||||
AM_CONFIG_HEADER(config.h)
|
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
-AM_INIT_AUTOMAKE([foreign] [subdir-objects])
|
|
||||||
+AM_INIT_AUTOMAKE([foreign])
|
|
||||||
AM_PROG_LIBTOOL
|
|
||||||
AC_SUBST(LIBTOOL_DEPS)
|
|
||||||
|
|
||||||
@@ -26,8 +26,6 @@ AC_CHECK_FUNCS(getopt_long)
|
|
||||||
AC_CHECK_LIB(numa, numa_available)
|
|
||||||
AC_CHECK_LIB(m, floor)
|
|
||||||
|
|
||||||
-AC_CHECK_LIB(curses, mvprintw)
|
|
||||||
-
|
|
||||||
AC_C_CONST
|
|
||||||
AC_C_INLINE
|
|
||||||
AM_PROG_CC_C_O
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -32,7 +32,7 @@
|
||||||
|
AS_IF([test "x$has_ncursesw" = "xyes"], [
|
||||||
|
AC_SUBST([NCURSESW_CFLAGS])
|
||||||
|
AC_SUBST([NCURSESW_LIBS])
|
||||||
|
- LIBS="$LIBS $NCURSESW_LIBS"
|
||||||
|
+ LIBS="$LIBS"
|
||||||
|
AC_SUBST([LIBS])
|
||||||
|
])
|
|
@ -1,421 +0,0 @@
|
||||||
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,
|
|
|
@ -1,21 +0,0 @@
|
||||||
From b0f77c10fc4561463b59b12cba0bfd69d7c73934 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Timo Teräs <timo.teras@iki.fi>
|
|
||||||
Date: Tue, 10 Jan 2017 09:51:32 +0200
|
|
||||||
Subject: [PATCH] fix aarch64 compile error due to undefined variable
|
|
||||||
|
|
||||||
fixes #36
|
|
||||||
|
|
||||||
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
|
|
||||||
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -148,6 +148,9 @@ GList* collect_full_irq_list()
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
char *irq_name, *irq_mod, *savedptr, *last_token, *p;
|
|
||||||
+#ifdef AARCH64
|
|
||||||
+ char *tmp;
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
file = fopen("/proc/interrupts", "r");
|
|
||||||
if (!file)
|
|
Loading…
Reference in a new issue