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
