irqbalance/arm64-Add-irq-aff-change-check.patch
2020-07-03 17:09:39 +08:00

122 lines
3.8 KiB
Diff

From 55c5c321c73e4c9b54e041ba8c7d542598685bae Mon Sep 17 00:00:00 2001
From: l00520965 <liuchao173@huawei.com>
Date: Wed, 11 Mar 2020 11:46:42 +0800
Subject: [PATCH 51/53] arm64: Add irq aff change check For aarch64, the PPIs
format in /proc/interrputs can be parsed and add to interrupt db, and next,
the number of interrupts is counted and used to calculate the load. Finally
these interrupts maybe scheduled between the NUMA domains.
Acctually, the PPIs cannot change aff, and it should not be added to interrupt db. This patch fix it.
Add a check before add a interrupt to db, just only reads the irq's aff, and write it back to avoid any impact on the system, According to the result of writing to fitler the irq.
---
activate.c | 8 +++++++-
classify.c | 28 +++++++++++++++++++++++++---
irqbalance.h | 2 ++
3 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/activate.c b/activate.c
index ab9702d..065f880 100644
--- a/activate.c
+++ b/activate.c
@@ -48,6 +48,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
{
char buf[PATH_MAX];
FILE *file;
+ int ret = 0;
/*
* only activate mappings for irqs that have moved
@@ -70,7 +71,12 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
return;
cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
- fprintf(file, "%s", buf);
+ ret = fprintf(file, "%s", buf);
+ if (ret < 0) {
+ log(TO_ALL, LOG_WARNING, "cannot change irq %i's affinity, add it to banned list", info->irq);
+ add_banned_irq(info->irq);
+ remove_one_irq_from_db(info->irq);
+ }
fclose(file);
info->moved = 0; /*migration is done*/
}
diff --git a/classify.c b/classify.c
index fa900f4..9f588bc 100644
--- a/classify.c
+++ b/classify.c
@@ -256,7 +256,7 @@ static gint compare_ints(gconstpointer a, gconstpointer b)
return ai->irq - bi->irq;
}
-static void add_banned_irq(int irq, GList **list)
+static void __add_banned_irq(int irq, GList **list)
{
struct irq_info find, *new;
GList *entry;
@@ -280,9 +280,14 @@ static void add_banned_irq(int irq, GList **list)
return;
}
+void add_banned_irq(int irq)
+{
+ __add_banned_irq(irq, &banned_irqs);
+}
+
void add_cl_banned_irq(int irq)
{
- add_banned_irq(irq, &cl_banned_irqs);
+ __add_banned_irq(irq, &cl_banned_irqs);
}
gint substr_find(gconstpointer a, gconstpointer b)
@@ -376,6 +381,23 @@ get_numa_node:
return new;
}
+void remove_one_irq_from_db(int irq)
+{
+ struct irq_info find, *tmp;
+ GList *entry = NULL;
+
+ find.irq = irq;
+ entry = g_list_find_custom(interrupts_db, &find, compare_ints);
+ if (!entry)
+ return;
+
+ tmp = entry->data;
+ interrupts_db = g_list_remove(interrupts_db, tmp);
+ free(tmp);
+ log(TO_CONSOLE, LOG_INFO, "IRQ %d was removed from db.\n", irq);
+ return;
+}
+
static void parse_user_policy_key(char *buf, int irq, struct user_irq_policy *pol)
{
char *key, *value, *end;
@@ -585,7 +607,7 @@ static void add_new_irq(char *path, struct irq_info *hint, GList *proc_interrupt
/* 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*/
- add_banned_irq(irq, &banned_irqs);
+ __add_banned_irq(irq, &banned_irqs);
new = get_irq_info(irq);
} else
new = add_one_irq_to_db(path, hint, &pol);
diff --git a/irqbalance.h b/irqbalance.h
index cd93167..bc34d7e 100644
--- a/irqbalance.h
+++ b/irqbalance.h
@@ -106,6 +106,8 @@ extern struct irq_info *get_irq_info(int irq);
extern void migrate_irq(GList **from, GList **to, struct irq_info *info);
extern void free_cl_opts(void);
extern void add_cl_banned_module(char *modname);
+extern void add_banned_irq(int irq);
+extern void remove_one_irq_from_db(int irq);
#define irq_numa_node(irq) ((irq)->numa_node)
--
2.23.0