diff --git a/SOURCES/irqbalance-1.0.8-separate-cmomand-line-banned-irqs.patch b/SOURCES/irqbalance-1.0.8-separate-cmomand-line-banned-irqs.patch new file mode 100644 index 0000000..0c1f85d --- /dev/null +++ b/SOURCES/irqbalance-1.0.8-separate-cmomand-line-banned-irqs.patch @@ -0,0 +1,152 @@ +From 7f072d94c93174d30eb18426ee8f8727a9081c40 Mon Sep 17 00:00:00 2001 +From: Neil Horman +Date: Fri, 16 May 2014 10:10:36 -0400 +Subject: [PATCH] irqbalance: separate cmomand line banned irqs from listed + banned irqs + +irqbalance was using one list for tracking banned irqs, but the list was being +used for disperate pruposes in different places. It was tracking command line +banned irqs and irqs that were banned via banscript and policyscript. The +former needs to be remembered accross db rebuilds, while the latter needs to be +rebuilt every time. This patch separates the two in to two lists, so that we +don't stop banning command line specified irqs after the first db rebuild. + +Signed-off-by: Neil Horman +--- + classify.c | 38 +++++++++++++++++++++++++++++--------- + irqbalance.c | 2 +- + irqbalance.h | 2 +- + 3 files changed, 31 insertions(+), 11 deletions(-) + +diff --git a/classify.c b/classify.c +index 94b53b8..8c7d482 100644 +--- a/classify.c ++++ b/classify.c +@@ -59,8 +59,9 @@ struct user_irq_policy { + int numa_node; + }; + +-static GList *interrupts_db; +-static GList *banned_irqs; ++static GList *interrupts_db = NULL; ++static GList *banned_irqs = NULL; ++static GList *cl_banned_irqs = NULL; + + #define SYSDEV_DIR "/sys/bus/pci/devices" + +@@ -72,13 +73,13 @@ static gint compare_ints(gconstpointer a, gconstpointer b) + return ai->irq - bi->irq; + } + +-void add_banned_irq(int irq) ++void add_banned_irq(int irq, GList **list) + { + struct irq_info find, *new; + GList *entry; + + find.irq = irq; +- entry = g_list_find_custom(banned_irqs, &find, compare_ints); ++ entry = g_list_find_custom(*list, &find, compare_ints); + if (entry) + return; + +@@ -91,10 +92,16 @@ void add_banned_irq(int irq) + new->irq = irq; + new->flags |= IRQ_FLAG_BANNED; + +- banned_irqs = g_list_append(banned_irqs, new); ++ *list = g_list_append(*list, new); + return; + } + ++void add_cl_banned_irq(int irq) ++{ ++ add_banned_irq(irq, &cl_banned_irqs); ++} ++ ++ + static int is_banned_irq(int irq) + { + GList *entry; +@@ -324,10 +331,23 @@ static int check_for_irq_ban(char *path, int irq) + { + char *cmd; + int rc; ++ struct irq_info find; ++ GList *entry; ++ ++ /* ++ * Check to see if we banned this irq on the command line ++ */ ++ find.irq = irq; ++ entry = g_list_find_custom(cl_banned_irqs, &find, compare_ints); ++ if (entry) ++ return 1; + + if (!banscript) + return 0; + ++ if (!path) ++ return 0; ++ + cmd = alloca(strlen(path)+strlen(banscript)+32); + if (!cmd) + return 0; +@@ -382,7 +402,7 @@ static void build_one_dev_entry(const char *dirname) + continue; + get_irq_user_policy(devpath, irqnum, &pol); + if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum))) { +- add_banned_irq(irqnum); ++ add_banned_irq(irqnum, &banned_irqs); + continue; + } + new = add_one_irq_to_db(devpath, irqnum, &pol); +@@ -411,7 +431,7 @@ static void build_one_dev_entry(const char *dirname) + goto done; + get_irq_user_policy(devpath, irqnum, &pol); + if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum))) { +- add_banned_irq(irqnum); ++ add_banned_irq(irqnum, &banned_irqs); + goto done; + } + +@@ -497,8 +517,8 @@ struct irq_info *add_new_irq(int irq, struct irq_info *hint) + return NULL; + + get_irq_user_policy("/sys", irq, &pol); +- if (pol.ban == 1) { +- add_banned_irq(irq); ++ if ((pol.ban == 1) || check_for_irq_ban(NULL, irq)) { ++ add_banned_irq(irq, &banned_irqs); + new = get_irq_info(irq); + } else + new = add_one_irq_to_db("/sys", irq, &pol); +diff --git a/irqbalance.c b/irqbalance.c +index 2532242..e0b3cbe 100644 +--- a/irqbalance.c ++++ b/irqbalance.c +@@ -151,7 +151,7 @@ static void parse_command_line(int argc, char **argv) + usage(); + exit(1); + } +- add_banned_irq((int)val); ++ add_cl_banned_irq((int)val); + break; + case 'l': + polscript = strdup(optarg); +diff --git a/irqbalance.h b/irqbalance.h +index 04cf9d8..cb648a5 100644 +--- a/irqbalance.h ++++ b/irqbalance.h +@@ -106,7 +106,7 @@ extern int get_cpu_count(void); + */ + extern void rebuild_irq_db(void); + extern void free_irq_db(void); +-extern void add_banned_irq(int irq); ++extern void add_cl_banned_irq(int irq); + extern void for_each_irq(GList *list, void (*cb)(struct irq_info *info, void *data), void *data); + extern struct irq_info *get_irq_info(int irq); + extern void migrate_irq(GList **from, GList **to, struct irq_info *info); +-- +2.4.3 + diff --git a/SPECS/irqbalance.spec b/SPECS/irqbalance.spec index d8b312f..8ef8d14 100644 --- a/SPECS/irqbalance.spec +++ b/SPECS/irqbalance.spec @@ -1,6 +1,6 @@ Name: irqbalance Version: 1.0.7 -Release: 1%{?dist} +Release: 2%{?dist} Epoch: 2 Summary: IRQ balancing daemon @@ -29,6 +29,7 @@ ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 ppc64le %{arm} aarch64 Patch1: irqbalance-1.0.4-env-file-path.patch Patch2: irqbalance-1.0.6-man_IRQBALANCE_BANNED_CPUS.patch Patch3: irqbalance-1.0.7-ignore_affinity_hint.patch +Patch4: irqbalance-1.0.8-separate-cmomand-line-banned-irqs.patch %description irqbalance is a daemon that evenly distributes IRQ load across @@ -39,6 +40,7 @@ multiple CPUs for enhanced performance. %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 %build ./autogen.sh @@ -77,6 +79,9 @@ fi /sbin/chkconfig --del irqbalance >/dev/null 2>&1 || : %changelog +* Tue Jul 14 2015 Petr Holasek - 2:1.0.7-2 +- Irqbalance honors banned irqs all the time (#1242626) + * Tue Aug 19 2014 Petr Holasek - 2:1.0.7-1 - Rebased to version 1.0.7 (#1018140)