[PATCH] use policy prior to the default values

Yun Wu (Abel) wuyun.wu at huawei.com
Mon Sep 21 01:51:55 PDT 2015


Currently user-defined policies against non-PCI devices' interrupts
are not working properly.

For example, when trying to set "balance_level=core" for a non-PCI
device interrupt which is classified as "other", will result in
the level of "package" because overrided in add_new_irq().

This patch fixes this by restricting irq info initializations in
add_one_irq_to_db(), which requires a change on its parameters.

Signed-off-by: Yun Wu <wuyun.wu at huawei.com>
---
 classify.c | 49 +++++++++++++++++++++----------------------------
 1 file changed, 21 insertions(+), 28 deletions(-)

diff --git a/classify.c b/classify.c
index 280a353..c6f1dc5 100644
--- a/classify.c
+++ b/classify.c
@@ -344,11 +344,11 @@ void add_cl_banned_module(char *modname)
  * related device. NULL devpath means no sysfs entries for
  * this irq.
  */
-static struct irq_info *add_one_irq_to_db(const char *devpath, int irq, struct user_irq_policy *pol)
+static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *hint, struct user_irq_policy *pol)
 {
-	int irq_class = IRQ_OTHER;
+	int irq = hint->irq;
 	int rc;
-	struct irq_info *new, find;
+	struct irq_info *new;
 	int numa_node;
 	char path[PATH_MAX];
 	FILE *fd;
@@ -360,8 +360,7 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, int irq, struct u
 	/*
 	 * First check to make sure this isn't a duplicate entry
 	 */
-	find.irq = irq;
-	entry = g_list_find_custom(interrupts_db, &find, compare_ints);
+	entry = g_list_find_custom(interrupts_db, hint, compare_ints);
 	if (entry) {
 		log(TO_CONSOLE, LOG_INFO, "DROPPING DUPLICATE ENTRY FOR IRQ %d on path %s\n", irq, devpath);
 		return NULL;
@@ -377,7 +376,8 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, int irq, struct u
 		return NULL;

 	new->irq = irq;
-	new->class = IRQ_OTHER;
+	new->type = hint->type;
+	new->class = hint->class;
 	new->hint_policy = pol->hintpolicy;

 	interrupts_db = g_list_append(interrupts_db, new);
@@ -385,16 +385,16 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, int irq, struct u
  	/* Some special irqs have NULL devpath */
 	if (devpath != NULL) {
 		/* Map PCI class code to irq class */
-		irq_class = get_irq_class(devpath);
+		int irq_class = get_irq_class(devpath);
 		if (irq_class < 0)
 			goto get_numa_node;
+		new->class = irq_class;
 	}

-	new->class = irq_class;
 	if (pol->level >= 0)
 		new->level = pol->level;
 	else
-		new->level = map_class_to_level[irq_class];
+		new->level = map_class_to_level[new->class];

 get_numa_node:
 	numa_node = -1;
@@ -640,13 +640,16 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
 	DIR *msidir;
 	FILE *fd;
 	int irqnum;
-	struct irq_info *new;
+	struct irq_info *new, hint;
 	char path[PATH_MAX];
 	char devpath[PATH_MAX];
 	struct user_irq_policy pol;

 	sprintf(path, "%s/%s/msi_irqs", SYSDEV_DIR, dirname);
 	sprintf(devpath, "%s/%s", SYSDEV_DIR, dirname);
+
+	/* Needs to be further classified */
+	hint.class = IRQ_OTHER;
 	
 	msidir = opendir(path);

@@ -665,10 +668,11 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
 					add_banned_irq(irqnum, &banned_irqs);
 					continue;
 				}
-				new = add_one_irq_to_db(devpath, irqnum, &pol);
+				hint.irq = irqnum;
+				hint.type = IRQ_TYPE_MSIX;
+				new = add_one_irq_to_db(devpath, &hint, &pol);
 				if (!new)
 					continue;
-				new->type = IRQ_TYPE_MSIX;
 			}
 		} while (entry != NULL);
 		closedir(msidir);
@@ -695,10 +699,11 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
 			goto done;
 		}

-		new = add_one_irq_to_db(devpath, irqnum, &pol);
+		hint.irq = irqnum;
+		hint.type = IRQ_TYPE_LEGACY;
+		new = add_one_irq_to_db(devpath, &hint, &pol);
 		if (!new)
 			goto done;
-		new->type = IRQ_TYPE_LEGACY;
 	}

 done:
@@ -745,22 +750,10 @@ static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
 		add_banned_irq(irq, &banned_irqs);
 		new = get_irq_info(irq);
 	} else
-		new = add_one_irq_to_db(NULL, irq, &pol);
+		new = add_one_irq_to_db(NULL, hint, &pol);

-	if (!new) {
+	if (!new)
 		log(TO_CONSOLE, LOG_WARNING, "add_new_irq: Failed to add irq %d\n", irq);
-		return;
-	}
-
-	/*
-	 * Override some of the new irq defaults here
-	 */
-	if (hint) {
-		new->type = hint->type;
-		new->class = hint->class;
-	}
-
-	new->level = map_class_to_level[new->class];
 }

 static void add_missing_irq(struct irq_info *info, void *attr)
-- 
2.5.0





More information about the irqbalance mailing list