irqbalance: upstream patch to fix irq-module relation
authorHannu Nyman <hannu.nyman@iki.fi>
Sun, 12 Jun 2022 17:24:36 +0000 (20:24 +0300)
committerHannu Nyman <hannu.nyman@iki.fi>
Sun, 12 Jun 2022 17:24:36 +0000 (20:24 +0300)
Apply post-1.9.0 patch from upstream to fix the irq-->module
relation detection.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
utils/irqbalance/patches/0001-post-190-fix-get-irq-module.patch [new file with mode: 0644]

diff --git a/utils/irqbalance/patches/0001-post-190-fix-get-irq-module.patch b/utils/irqbalance/patches/0001-post-190-fix-get-irq-module.patch
new file mode 100644 (file)
index 0000000..5c6cb4e
--- /dev/null
@@ -0,0 +1,66 @@
+From ff48ac9c84f0b318dfce665605d72e86dfcfe008 Mon Sep 17 00:00:00 2001
+From: Chao Liu <liuchao173@huawei.com>
+Date: Tue, 7 Jun 2022 15:15:15 +0800
+Subject: [PATCH] get irq->module relationship from /sys/bus/pci/*/driver
+
+Signed-off-by: Chao Liu <liuchao173@huawei.com>
+---
+ classify.c | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+--- a/classify.c
++++ b/classify.c
+@@ -7,6 +7,7 @@
+ #include <dirent.h>
+ #include <assert.h>
+ #include <errno.h>
++#include <libgen.h>
+ #include "irqbalance.h"
+ #include "types.h"
+@@ -578,7 +579,7 @@ static int check_for_module_ban(char *na
+               return 0;
+ }
+-static int check_for_irq_ban(int irq, GList *proc_interrupts)
++static int check_for_irq_ban(int irq, char *mod, GList *proc_interrupts)
+ {
+       struct irq_info find, *res;
+       GList *entry;
+@@ -594,6 +595,9 @@ static int check_for_irq_ban(int irq, GL
+       /*
+        * Check to see if we banned module which the irq belongs to.
+        */
++      if (mod != NULL && strlen(mod) > 0 && check_for_module_ban(mod))
++              return 1;
++
+       entry = g_list_find_custom(proc_interrupts, &find, compare_ints);
+       if (entry) {
+               res = entry->data;
+@@ -609,14 +613,25 @@ static void add_new_irq(char *path, stru
+       struct irq_info *new;
+       struct user_irq_policy pol;
+       int irq = hint->irq;
++      char buf[PATH_MAX], drvpath[PATH_MAX];
++      char *mod = NULL;
++      int ret;
+       new = get_irq_info(irq);
+       if (new)
+               return;
++      if (path) {
++              sprintf(buf, "%s/driver", path);
++              ret = readlink(buf, drvpath, PATH_MAX);
++              if (ret > 0 && ret < PATH_MAX) {
++                      drvpath[ret] = '\0';
++                      mod = basename(drvpath);
++              }
++      }
+       /* Set NULL devpath for the irq has no sysfs entries */
+       get_irq_user_policy(path, irq, &pol);
+-      if ((pol.ban == 1) || check_for_irq_ban(irq, proc_interrupts)) { /*FIXME*/
++      if ((pol.ban == 1) || check_for_irq_ban(irq, mod, proc_interrupts)) { /*FIXME*/
+               __add_banned_irq(irq, &banned_irqs);
+               new = get_irq_info(irq);
+       } else