--- /dev/null
+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