refactor patches
This commit is contained in:
parent
638b879189
commit
da193a5c7f
139
arm64-Add-irq-aff-change-check.patch
Normal file
139
arm64-Add-irq-aff-change-check.patch
Normal file
@ -0,0 +1,139 @@
|
||||
From 55c5c321c73e4c9b54e041ba8c7d542598685bae Mon Sep 17 00:00:00 2001
|
||||
From: liuchao <liuchao173@huawei.com>
|
||||
Date: Wed, 11 Mar 2020 11:46:42 +0800
|
||||
Subject: [PATCH 48/48] 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 | 32 +++++++++++++++++++++++++++-----
|
||||
irqbalance.h | 2 ++
|
||||
3 files changed, 36 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/activate.c b/activate.c
|
||||
index 2812976..f933347 100644
|
||||
--- a/activate.c
|
||||
+++ b/activate.c
|
||||
@@ -60,6 +60,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
|
||||
@@ -82,7 +83,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 2fa303a..b40fcc1 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -264,7 +264,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;
|
||||
@@ -288,9 +288,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);
|
||||
}
|
||||
|
||||
static int is_banned_irq(int irq)
|
||||
@@ -429,6 +434,23 @@ out:
|
||||
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;
|
||||
@@ -636,7 +658,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
continue;
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
||||
- add_banned_irq(irqnum, &banned_irqs);
|
||||
+ __add_banned_irq(irqnum, &banned_irqs);
|
||||
continue;
|
||||
}
|
||||
hint.irq = irqnum;
|
||||
@@ -671,7 +693,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
goto done;
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
||||
- add_banned_irq(irqnum, &banned_irqs);
|
||||
+ __add_banned_irq(irqnum, &banned_irqs);
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -723,7 +745,7 @@ static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
||||
/* Set NULL devpath for the irq has no sysfs entries */
|
||||
get_irq_user_policy(NULL, irq, &pol);
|
||||
if ((pol.ban == 1) || check_for_irq_ban(NULL, 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(NULL, hint, &pol);
|
||||
diff --git a/irqbalance.h b/irqbalance.h
|
||||
index 6cdd9e2..3a78c7f 100644
|
||||
--- a/irqbalance.h
|
||||
+++ b/irqbalance.h
|
||||
@@ -105,6 +105,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)
|
||||
|
||||
extern unsigned long migrate_val;
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@ -1,61 +0,0 @@
|
||||
From 07032f71ea956ca195c9b2386d09d24b07b7133f Mon Sep 17 00:00:00 2001
|
||||
From: hejingxian <hejingxian@huawei.com>
|
||||
Date: Tue, 12 Nov 2019 10:59:20 +0800
|
||||
Subject: [PATCH] Prevent inserting a duplicate entry to avoid list chaos
|
||||
|
||||
Introduced by bugfix-force-irq-into-rebalance-list-when-irq-removed-and-reinserted.patch
|
||||
and feature-introduce-verifyhint-to-detect-hint-variation.patch, irq may want be inserted to
|
||||
rebalance list more then once, and we need to prevent this. we developped a solution in
|
||||
bugfix-fix-two-same-irq-insert-to-list.patch, but we are likely to call irq_in_rebalance_list.
|
||||
|
||||
this patch remove the code in bugfix-fix-two-same-irq-insert-to-list.patch and add protection
|
||||
in force_rebalance_irq instead.
|
||||
---
|
||||
classify.c | 2 +-
|
||||
irqbalance.c | 4 ++++
|
||||
irqbalance.h | 1 +
|
||||
3 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/classify.c b/classify.c
|
||||
index f041054..5aed9e5 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -263,7 +263,7 @@ static int get_irq_class(const char *devpath)
|
||||
return irq_class;
|
||||
}
|
||||
|
||||
-static gint compare_ints(gconstpointer a, gconstpointer b)
|
||||
+gint compare_ints(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
const struct irq_info *ai = a;
|
||||
const struct irq_info *bi = b;
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index 395669c..faa8e6a 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -251,6 +251,10 @@ void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused
|
||||
if (info->level == BALANCE_NONE)
|
||||
return;
|
||||
|
||||
+ /* Prevent inserting a duplicate entry to avoid list chaos */
|
||||
+ if (g_list_find_custom(rebalance_irq_list, info, compare_ints))
|
||||
+ return;
|
||||
+
|
||||
if (info->assigned_obj == NULL)
|
||||
rebalance_irq_list = g_list_append(rebalance_irq_list, info);
|
||||
else
|
||||
diff --git a/irqbalance.h b/irqbalance.h
|
||||
index c07a4fc..1befb46 100644
|
||||
--- a/irqbalance.h
|
||||
+++ b/irqbalance.h
|
||||
@@ -113,6 +113,7 @@ 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);
|
||||
#define irq_numa_node(irq) ((irq)->numa_node)
|
||||
+extern gint compare_ints(gconstpointer a, gconstpointer b);
|
||||
|
||||
extern struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list);
|
||||
extern void find_irq_dev_path(int irq, char *dirname, int length);
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@ -1,29 +0,0 @@
|
||||
From 0d6ed42e5d195f6a00d2f000ce8da11e89cb3010 Mon Sep 17 00:00:00 2001
|
||||
From: caihongda <caihongda@huawei.com>
|
||||
Date: Fri, 1 Nov 2019 10:06:03 +0800
|
||||
Subject: [PATCH] irqbalance: bufix in banned irq delete
|
||||
|
||||
reason: The banned irq will not be added int interrupts_db, so
|
||||
we need to additionaly delete it if it is no_existing.
|
||||
To test this in llt, we add a stub for function
|
||||
is_banned_irq.
|
||||
|
||||
Signed-off-by: caihongda <caihongda@huawei.com>
|
||||
|
||||
diff --git a/classify.c b/classify.c
|
||||
index 9f72ae8..585f2dc 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -853,6 +860,9 @@ static void remove_no_existing_irq(struct irq_info *info, void *data __attribute
|
||||
void clear_no_existing_irqs(void)
|
||||
{
|
||||
for_each_irq(NULL, remove_no_existing_irq, NULL);
|
||||
+ if (banned_irqs){
|
||||
+ for_each_irq(banned_irqs, remove_no_existing_irq, NULL);
|
||||
+ }
|
||||
}
|
||||
|
||||
void free_irq_db(void)
|
||||
--
|
||||
2.19.1
|
||||
|
||||
@ -1,50 +0,0 @@
|
||||
From 0c8ecab9e6f5fae5860e7fbc795e988c112edede Mon Sep 17 00:00:00 2001
|
||||
From: xiashuang <xiashuang1@huawei.com>
|
||||
Date: Thu, 25 Jul 2019 22:38:32 -0400
|
||||
Subject: [PATCH] fix fgets will get a redundant new line
|
||||
|
||||
this patch fix a bug introduced by bugfix-force-irq-into-rebalance-list-when-irq-removed-and-reinserted.patch.
|
||||
the previous patch use fgets to get a directory name from buffer. but fgets will get a redundant newline,
|
||||
so the directory name are always invalid, this patch just remove the '\n'.
|
||||
---
|
||||
classify.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/classify.c b/classify.c
|
||||
index e61c39b..440576f 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -747,6 +747,7 @@ void find_irq_dev_path(int irq, char *dirname, int length)
|
||||
char path[PATH_MAX];
|
||||
char buffer[128];
|
||||
char *brc = NULL;
|
||||
+ size_t dirlen;
|
||||
|
||||
memset(dirname, 0, length);
|
||||
/* Return defaults if irq is 0 */
|
||||
@@ -762,8 +763,10 @@ void find_irq_dev_path(int irq, char *dirname, int length)
|
||||
}
|
||||
|
||||
brc = fgets(buffer, 128, output);
|
||||
- if (brc) {
|
||||
+ /* fgets will get a redundant \n */
|
||||
+ if (brc && (dirlen = strcspn(brc, "\n")) > 0) {
|
||||
log(TO_CONSOLE, LOG_INFO, "msi_irqs IRQ %d dirname is %s\n", irq, brc);
|
||||
+ brc[dirlen] = '\0';
|
||||
strncpy(dirname, brc, length);
|
||||
pclose(output);
|
||||
return;
|
||||
@@ -779,8 +782,9 @@ void find_irq_dev_path(int irq, char *dirname, int length)
|
||||
}
|
||||
|
||||
brc = fgets(buffer, 128, output);
|
||||
- if (brc) {
|
||||
+ if (brc && (dirlen = strcspn(brc, "\n")) > 0) {
|
||||
log(TO_CONSOLE, LOG_INFO, "IRQ %d dirname is %s\n", irq, brc);
|
||||
+ brc[dirlen] = '\0';
|
||||
strncpy(dirname, brc, length);
|
||||
pclose(output);
|
||||
return;
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@ -1,34 +0,0 @@
|
||||
From f3c1502c83f5ae09202a707669c924fc2bd0cca4 Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Mon, 18 Nov 2019 13:57:11 +0000
|
||||
Subject: [PATCH] irqblance: fix memory leak of strdup
|
||||
|
||||
fix memory leak of strdup in collect_full_irq_list(), when continue
|
||||
in if branch, the savedline isn't freed
|
||||
---
|
||||
procinterrupts.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index e36fcac..bde31f4 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -321,6 +321,7 @@ GList* collect_full_irq_list()
|
||||
if (ban_pci_assigned_irq && is_pci_assigned_irq(c)) {
|
||||
log(TO_ALL, LOG_INFO, "Banned PCI-assigned irq %d.\n", number);
|
||||
add_vm_banned_irq(number);
|
||||
+ free(savedline);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -338,6 +339,7 @@ GList* collect_full_irq_list()
|
||||
* For these irqs, we can add these to banned irq list.
|
||||
*/
|
||||
add_banned_list_irq(number);
|
||||
+ free(savedline);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
--
|
||||
2.19.1
|
||||
|
||||
@ -1,161 +0,0 @@
|
||||
From feeb95206e1f178e2bbf0393483861f364bd7d5b Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Wed, 23 Oct 2019 11:38:17 +0000
|
||||
Subject: [PATCH] irqbalance: fix new irqs in hotplug keep stay on one numa node
|
||||
|
||||
when the number of cpus is huge, hotplug occurs and new irqs will stay on one numa node
|
||||
---
|
||||
classify.c | 25 +++++++++++++++++++++++++
|
||||
procinterrupts.c | 24 +++++++++++++++++++++---
|
||||
rules_config.c | 4 ++++
|
||||
3 files changed, 50 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/classify.c b/classify.c
|
||||
index 3681c48..54f27f0 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -38,6 +38,7 @@ static GList *banned_irqs = NULL;
|
||||
GList *cl_banned_irqs = NULL;
|
||||
static GList *cl_banned_modules = NULL;
|
||||
static GList *vm_banned_irqs = NULL;
|
||||
+extern int need_add_single;
|
||||
|
||||
#define SYSFS_DIR "/sys"
|
||||
#define SYSPCI_DIR "/sys/bus/pci/devices"
|
||||
@@ -646,6 +647,21 @@ static int check_for_irq_ban(char *path __attribute__((unused)), int irq, GList
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int is_proc_irq_info_exist(int irq, GList *tmp_list)
|
||||
+{
|
||||
+ GList *entry;
|
||||
+ struct irq_info find;
|
||||
+
|
||||
+ if (!tmp_list) {
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ find.irq = irq;
|
||||
+ entry = g_list_find_custom(tmp_list, &find, compare_ints);
|
||||
+
|
||||
+ return entry ? 1 : 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Figures out which interrupt(s) relate to the device we"re looking at in dirname
|
||||
*/
|
||||
@@ -686,6 +702,12 @@ struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list)
|
||||
add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
continue;
|
||||
}
|
||||
+ if (!is_proc_irq_info_exist(irqnum, tmp_list)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (need_add_single && need_add_single != irqnum) {
|
||||
+ continue;
|
||||
+ }
|
||||
hint.irq = irqnum;
|
||||
hint.type = IRQ_TYPE_MSIX;
|
||||
new = add_one_irq_to_db(devpath, &hint, &pol);
|
||||
@@ -723,6 +745,9 @@ struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list)
|
||||
add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
goto done;
|
||||
}
|
||||
+ if (!is_proc_irq_info_exist(irqnum, tmp_list)) {
|
||||
+ goto done;
|
||||
+ }
|
||||
|
||||
hint.irq = irqnum;
|
||||
hint.type = IRQ_TYPE_LEGACY;
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index c32c1b2..f0dd608 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -43,6 +43,7 @@
|
||||
static int proc_int_has_msi = 0;
|
||||
static int msi_found_in_sysfs = 0;
|
||||
extern int ban_pci_assigned_irq;
|
||||
+int need_add_single = 0;
|
||||
|
||||
#ifdef AARCH64
|
||||
struct irq_match {
|
||||
@@ -361,9 +362,10 @@ void parse_proc_interrupts(void)
|
||||
uint64_t count;
|
||||
char *c, *c2;
|
||||
struct irq_info *info;
|
||||
- struct irq_info tmp_info;
|
||||
- char savedline[1024];
|
||||
+ struct irq_info tmp_info = {0};
|
||||
+ char *savedline = NULL;
|
||||
char dirname[PATH_MAX] = {'\0'};
|
||||
+ struct irq_info *lookup;
|
||||
|
||||
if (getline(&line, &size, file)<=0)
|
||||
break;
|
||||
@@ -383,7 +385,9 @@ void parse_proc_interrupts(void)
|
||||
if (!c)
|
||||
continue;
|
||||
|
||||
- strncpy(savedline, line, sizeof(savedline)-1);
|
||||
+ savedline = strdup(line);
|
||||
+ if (!savedline)
|
||||
+ continue;
|
||||
|
||||
*c = 0;
|
||||
c++;
|
||||
@@ -391,23 +395,36 @@ void parse_proc_interrupts(void)
|
||||
|
||||
info = get_irq_info(number);
|
||||
if (!info) {
|
||||
+ init_irq_class_and_type(savedline, &tmp_info, number);
|
||||
find_irq_dev_path(number, dirname, PATH_MAX);
|
||||
if (strlen(dirname) > 0) {
|
||||
+ need_add_single = number;
|
||||
info = build_one_dev_entry(dirname, NULL);
|
||||
+ need_add_single = 0;
|
||||
+ lookup = get_irq_info(number);
|
||||
+ if (lookup != NULL) {
|
||||
+ lookup->existing = 1;
|
||||
+ set_usr_irq_policy(tmp_info.name, lookup);
|
||||
+ }
|
||||
log(TO_CONSOLE, LOG_INFO, "new IRQ %d added into database, dirname %s\n", number, dirname);
|
||||
} else {
|
||||
- init_irq_class_and_type(savedline, &tmp_info, number);
|
||||
info = add_new_irq(number, &tmp_info, NULL);
|
||||
}
|
||||
+ if (tmp_info.name) {
|
||||
+ free(tmp_info.name);
|
||||
+ tmp_info.name = NULL;
|
||||
+ }
|
||||
|
||||
if (info) {
|
||||
force_rebalance_irq(info, NULL);
|
||||
log(TO_CONSOLE, LOG_INFO, "new IRQ %d added into rebalance list\n", number);
|
||||
} else {
|
||||
need_rescan = 1;
|
||||
+ free(savedline);
|
||||
break;
|
||||
}
|
||||
}
|
||||
+ free(savedline);
|
||||
info->existing = 1;
|
||||
|
||||
if (ban_pci_assigned_irq) {
|
||||
diff --git a/rules_config.c b/rules_config.c
|
||||
index 767e9e1..9313fc6 100644
|
||||
--- a/rules_config.c
|
||||
+++ b/rules_config.c
|
||||
@@ -43,6 +43,10 @@ void set_usr_irq_policy(char *name, struct irq_info *info)
|
||||
{
|
||||
USER_IRQ_POLICY *user_policy;
|
||||
|
||||
+ if (user_policy_list == NULL) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
user_policy = get_usr_irq_policy(name);
|
||||
if (user_policy != NULL) {
|
||||
if (user_policy->numa_node_set) {
|
||||
--
|
||||
2.19.1
|
||||
|
||||
@ -1,25 +0,0 @@
|
||||
From d4fc2426a38728b912ec1acf3a3a990636e48b1d Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Fri, 1 Nov 2019 02:42:19 +0000
|
||||
Subject: [PATCH] irqbalance: fix new msi irq hasnot been added to rebalance list
|
||||
|
||||
fix new msi irq hasnot been added to rebalance_irq_list
|
||||
---
|
||||
procinterrupts.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 64b462a..33e72ea 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -405,6 +405,7 @@ void parse_proc_interrupts(void)
|
||||
if (lookup != NULL) {
|
||||
lookup->existing = 1;
|
||||
set_usr_irq_policy(tmp_info.name, lookup);
|
||||
+ info = lookup;
|
||||
}
|
||||
log(TO_CONSOLE, LOG_INFO, "new IRQ %d added into database, dirname %s\n", number, dirname);
|
||||
} else {
|
||||
--
|
||||
2.19.1
|
||||
|
||||
@ -1,79 +0,0 @@
|
||||
From f04d6488c12e215e2302b44c77bf66fce4950aef Mon Sep 17 00:00:00 2001
|
||||
From: liuchao <liuchao173@huawei.com>
|
||||
Date: Thu, 5 Dec 2019 15:28:14 +0800
|
||||
Subject: [PATCH] fix sleep interval when sleep_interval is changed by
|
||||
socket
|
||||
|
||||
currently, in scan, irqbalance compare sleep_interval's address to decide if sleep_interval is changed, accutually this judgement is always false now.
|
||||
|
||||
Signed-off-by: liuchao <liuchao173@huawei.com>
|
||||
---
|
||||
hint_verify.c | 10 ++++++----
|
||||
irqbalance.c | 5 +++--
|
||||
2 files changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hint_verify.c b/hint_verify.c
|
||||
index b3175ae..0718078 100644
|
||||
--- a/hint_verify.c
|
||||
+++ b/hint_verify.c
|
||||
@@ -15,6 +15,7 @@
|
||||
extern int keep_going;
|
||||
extern GMainLoop *main_loop;
|
||||
extern gboolean scan();
|
||||
+extern int last_interval;
|
||||
|
||||
int real_sleep_interval;
|
||||
int sleep_interval_count;
|
||||
diff --git a/hint_verify.c b/hint_verify.c
|
||||
index b3175ae..4258557 100644
|
||||
--- a/hint_verify.c
|
||||
+++ b/hint_verify.c
|
||||
@@ -84,7 +84,7 @@ void update_affinity_hint(struct irq_info *info, void *data __attribute__((unuse
|
||||
* 1. scan opration for irq balancing;
|
||||
* 2. poll irq affinity hint changes for quickly applying them.
|
||||
*/
|
||||
-gboolean poll_hint_affinity_and_scan(gpointer data)
|
||||
+gboolean poll_hint_affinity_and_scan(gpointer data __attribute__((unused)))
|
||||
{
|
||||
gboolean need_verify_flag = FALSE;
|
||||
gboolean need_scan_flag = FALSE;
|
||||
@@ -118,9 +118,10 @@ gboolean poll_hint_affinity_and_scan(gpointer data)
|
||||
}
|
||||
}
|
||||
|
||||
- if (data != &real_sleep_interval) {
|
||||
- data = &real_sleep_interval;
|
||||
- g_timeout_add_seconds(real_sleep_interval, poll_hint_affinity_and_scan, data);
|
||||
+ update_interval_and_count();
|
||||
+ if (last_interval != real_sleep_interval) {
|
||||
+ last_interval = real_sleep_interval;
|
||||
+ g_timeout_add_seconds(real_sleep_interval, poll_hint_affinity_and_scan, NULL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index 3fc00db..05eaa29 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -67,6 +67,7 @@ long HZ;
|
||||
int sleep_interval = SLEEP_INTERVAL;
|
||||
int hint_enabled = 0;
|
||||
int poll_hint_interval = SLEEP_INTERVAL / 5;
|
||||
+int last_interval;
|
||||
GMainLoop *main_loop;
|
||||
|
||||
char *banned_cpumask_from_ui = NULL;
|
||||
@@ -641,8 +642,8 @@ int main(int argc, char** argv)
|
||||
log(TO_ALL, LOG_INFO, "irqbalance start scan.\n");
|
||||
update_interval_and_count();
|
||||
main_loop = g_main_loop_new(NULL, FALSE);
|
||||
- int *last_interval = &real_sleep_interval;
|
||||
- g_timeout_add_seconds(real_sleep_interval, poll_hint_affinity_and_scan, last_interval);
|
||||
+ last_interval = real_sleep_interval;
|
||||
+ g_timeout_add_seconds(real_sleep_interval, poll_hint_affinity_and_scan, NULL);
|
||||
g_main_loop_run(main_loop);
|
||||
|
||||
g_main_loop_quit(main_loop);
|
||||
--
|
||||
2.19.1
|
||||
|
||||
@ -1,64 +0,0 @@
|
||||
From f4d052d7b210612a7ffbdd7c3cfbce213c9a0e21 Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Fri, 8 Nov 2019 08:47:43 +0000
|
||||
Subject: [PATCH] irqbalance: fix strcat may cause buffer overrun
|
||||
|
||||
when the sum length of irq_name and saveptr is more than PATH_MAX, strcat will cause buffer overrun
|
||||
---
|
||||
procinterrupts.c | 26 ++++++++++++++++++--------
|
||||
1 file changed, 18 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 373d8b5..0b24b56 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -205,6 +205,7 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
int is_xen_dyn = 0;
|
||||
#ifdef AARCH64
|
||||
char *tmp = NULL;
|
||||
+ char irq_fullname_valid = 1;
|
||||
char irq_fullname[PATH_MAX] = {0};
|
||||
#endif
|
||||
|
||||
@@ -236,12 +237,16 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
if (tmp)
|
||||
*tmp = 0;
|
||||
|
||||
- strcat(irq_fullname, irq_name);
|
||||
- strcat(irq_fullname, " ");
|
||||
- strcat(irq_fullname, savedptr);
|
||||
- tmp = strchr(irq_fullname, '\n');
|
||||
- if (tmp)
|
||||
- *tmp = 0;
|
||||
+ if (strlen(irq_name) + strlen(savedptr) + 1 < PATH_MAX) {
|
||||
+ strcat(irq_fullname, irq_name);
|
||||
+ strcat(irq_fullname, " ");
|
||||
+ strcat(irq_fullname, savedptr);
|
||||
+ tmp = strchr(irq_fullname, '\n');
|
||||
+ if (tmp)
|
||||
+ *tmp = 0;
|
||||
+ } else {
|
||||
+ irq_fullname_valid = 0;
|
||||
+ }
|
||||
#endif
|
||||
irq_mod = last_token;
|
||||
info->irq = irq;
|
||||
@@ -251,8 +256,13 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
info->class = IRQ_VIRT_EVENT;
|
||||
} else {
|
||||
#ifdef AARCH64
|
||||
- irq_name = irq_fullname;
|
||||
- guess_arm_irq_hints(irq_name, info);
|
||||
+ if (irq_fullname_valid) {
|
||||
+ irq_name = irq_fullname;
|
||||
+ guess_arm_irq_hints(irq_name, info);
|
||||
+ } else {
|
||||
+ info->type = IRQ_TYPE_LEGACY;
|
||||
+ info->class = IRQ_OTHER;
|
||||
+ }
|
||||
#else
|
||||
info->type = IRQ_TYPE_LEGACY;
|
||||
info->class = IRQ_OTHER;
|
||||
--
|
||||
2.19.1
|
||||
|
||||
@ -1,35 +1,41 @@
|
||||
From 1ca314651ddc31cd52ef67893fdd7aac43ea5201 Mon Sep 17 00:00:00 2001
|
||||
From: zhengshaoyu <zhengshaoyu@huawei.com>
|
||||
Date: Thu, 22 Jun 2017 04:39:00 +0000
|
||||
Subject: [PATCH] irqbalance: bugfix popen and pclose
|
||||
From a501662e98e2937cb63f3308d6497e723f838238 Mon Sep 17 00:00:00 2001
|
||||
From: liuchao <liuchao173@huawei.com>
|
||||
Date: Wed, 18 Mar 2020 22:08:33 +0800
|
||||
Subject: [PATCH] force irq into rebalance list when irq removed and reinserted
|
||||
|
||||
[Changelog]: bugfix popen and pclose
|
||||
[Author]:zhengshaoyu
|
||||
|
||||
Date: Sun, 17 Mar 2019 20:07:28 -0400
|
||||
prevent irq may be inserted to rebalance list more than once and add one msi irq
|
||||
at one time to prevent new msi irqs stay on one numa node
|
||||
|
||||
---
|
||||
classify.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++-------
|
||||
irqbalance.c | 2 +-
|
||||
irqbalance.h | 5 +++
|
||||
procinterrupts.c | 112 +++++++++++++++++++++++++++++++------------------
|
||||
classify.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++------
|
||||
irqbalance.c | 6 ++-
|
||||
irqbalance.h | 7 +++
|
||||
procinterrupts.c | 145 ++++++++++++++++++++++++++++++++++-----------------
|
||||
types.h | 1 +
|
||||
5 files changed, 190 insertions(+), 56 deletions(-)
|
||||
5 files changed, 250 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/classify.c b/classify.c
|
||||
index 9868633..30a8d2a 100644
|
||||
index b40fcc1..2dc93ca 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -66,6 +66,8 @@ struct pci_info {
|
||||
#define PCI_SUB_DEVICE_EMC_0568 0x0568
|
||||
#define PCI_SUB_DEVICE_EMC_dd00 0xdd00
|
||||
@@ -37,6 +37,7 @@ static GList *interrupts_dbs = NULL;
|
||||
static GList *banned_irqs = NULL;
|
||||
GList *cl_banned_irqs = NULL;
|
||||
static GList *cl_banned_modules = NULL;
|
||||
+extern int need_add_single;
|
||||
|
||||
+extern void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)));
|
||||
+
|
||||
/*
|
||||
* Apply software workarounds for some special devices
|
||||
*
|
||||
@@ -562,11 +564,13 @@ static int check_for_irq_ban(char *path __attribute__((unused)), int irq, GList
|
||||
#define SYSFS_DIR "/sys"
|
||||
#define SYSPCI_DIR "/sys/bus/pci/devices"
|
||||
@@ -259,7 +259,7 @@
|
||||
return irq_class;
|
||||
}
|
||||
|
||||
-static gint compare_ints(gconstpointer a, gconstpointer b)
|
||||
+gint compare_ints(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
const struct irq_info *ai = a;
|
||||
const struct irq_info *bi = b;
|
||||
@@ -584,11 +585,13 @@ static int check_for_irq_ban(char *path __attribute__((unused)), int irq, GList
|
||||
/*
|
||||
* Check to see if we banned module which the irq belongs to.
|
||||
*/
|
||||
@ -48,7 +54,25 @@ index 9868633..30a8d2a 100644
|
||||
}
|
||||
|
||||
#ifdef INCLUDE_BANSCRIPT
|
||||
@@ -605,13 +609,14 @@ static int check_for_irq_ban(char *path __attribute__((unused)), int irq, GList
|
||||
@@ -624,16 +627,32 @@ static int check_for_irq_ban(char *path __attribute__((unused)), int irq, GList
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int is_proc_irq_info_exist(int irq, GList *tmp_list)
|
||||
+{
|
||||
+ GList *entry;
|
||||
+ struct irq_info find;
|
||||
+
|
||||
+ if (!tmp_list) {
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ find.irq = irq;
|
||||
+ entry = g_list_find_custom(tmp_list, &find, compare_ints);
|
||||
+
|
||||
+ return entry ? 1 : 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Figures out which interrupt(s) relate to the device we"re looking at in dirname
|
||||
*/
|
||||
@ -65,16 +89,25 @@ index 9868633..30a8d2a 100644
|
||||
char path[PATH_MAX];
|
||||
char devpath[PATH_MAX];
|
||||
struct user_irq_policy pol;
|
||||
@@ -635,7 +640,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
@@ -657,10 +676,16 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
if (new)
|
||||
continue;
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
- if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
||||
+ if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
||||
add_banned_irq(irqnum, &banned_irqs);
|
||||
__add_banned_irq(irqnum, &banned_irqs);
|
||||
continue;
|
||||
}
|
||||
@@ -647,13 +652,13 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
+ if (!is_proc_irq_info_exist(irqnum, tmp_list)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (need_add_single && need_add_single != irqnum) {
|
||||
+ continue;
|
||||
+ }
|
||||
hint.irq = irqnum;
|
||||
hint.type = IRQ_TYPE_MSIX;
|
||||
new = add_one_irq_to_db(devpath, &hint, &pol);
|
||||
@@ -669,13 +694,13 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
}
|
||||
} while (entry != NULL);
|
||||
closedir(msidir);
|
||||
@ -90,16 +123,22 @@ index 9868633..30a8d2a 100644
|
||||
if (fscanf(fd, "%d", &irqnum) < 0)
|
||||
goto done;
|
||||
|
||||
@@ -670,7 +675,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
@@ -692,10 +717,13 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
if (new)
|
||||
goto done;
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
- if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum, tmp_irqs))) {
|
||||
+ if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum, tmp_list))) {
|
||||
add_banned_irq(irqnum, &banned_irqs);
|
||||
- if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
||||
+ if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
||||
__add_banned_irq(irqnum, &banned_irqs);
|
||||
goto done;
|
||||
}
|
||||
@@ -684,7 +689,56 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
+ if (!is_proc_irq_info_exist(irqnum, tmp_list)) {
|
||||
+ goto done;
|
||||
+ }
|
||||
|
||||
hint.irq = irqnum;
|
||||
hint.type = IRQ_TYPE_LEGACY;
|
||||
@@ -706,7 +734,60 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
||||
|
||||
done:
|
||||
fclose(fd);
|
||||
@ -114,6 +153,7 @@ index 9868633..30a8d2a 100644
|
||||
+ char path[PATH_MAX];
|
||||
+ char buffer[128];
|
||||
+ char *brc = NULL;
|
||||
+ size_t dirlen;
|
||||
+
|
||||
+ memset(dirname, 0, length);
|
||||
+ /* Return defaults if irq is 0 */
|
||||
@ -129,8 +169,10 @@ index 9868633..30a8d2a 100644
|
||||
+ }
|
||||
+
|
||||
+ brc = fgets(buffer, 128, output);
|
||||
+ if (brc) {
|
||||
+ /* fgets will get a redundant \n */
|
||||
+ if (brc && (dirlen = strcspn(brc, "\n")) > 0) {
|
||||
+ log(TO_CONSOLE, LOG_INFO, "msi_irqs IRQ %d dirname is %s\n", irq, brc);
|
||||
+ brc[dirlen] = '\0';
|
||||
+ strncpy(dirname, brc, length);
|
||||
+ pclose(output);
|
||||
+ return;
|
||||
@ -146,8 +188,9 @@ index 9868633..30a8d2a 100644
|
||||
+ }
|
||||
+
|
||||
+ brc = fgets(buffer, 128, output);
|
||||
+ if (brc) {
|
||||
+ if (brc && (dirlen = strcspn(brc, "\n")) > 0) {
|
||||
+ log(TO_CONSOLE, LOG_INFO, "IRQ %d dirname is %s\n", irq, brc);
|
||||
+ brc[dirlen] = '\0';
|
||||
+ strncpy(dirname, brc, length);
|
||||
+ pclose(output);
|
||||
+ return;
|
||||
@ -157,7 +200,7 @@ index 9868633..30a8d2a 100644
|
||||
}
|
||||
|
||||
static void free_irq(struct irq_info *info, void *data __attribute__((unused)))
|
||||
@@ -692,6 +750,42 @@ static void free_irq(struct irq_info *info, void *data __attribute__((unused)))
|
||||
@@ -714,6 +795,45 @@ static void free_irq(struct irq_info *info, void *data __attribute__((unused)))
|
||||
free(info);
|
||||
}
|
||||
|
||||
@ -195,12 +238,15 @@ index 9868633..30a8d2a 100644
|
||||
+void clear_no_existing_irqs(void)
|
||||
+{
|
||||
+ for_each_irq(NULL, remove_no_existing_irq, NULL);
|
||||
+ if (banned_irqs){
|
||||
+ for_each_irq(banned_irqs, remove_no_existing_irq, NULL);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void free_irq_db(void)
|
||||
{
|
||||
for_each_irq(NULL, free_irq, NULL);
|
||||
@@ -711,14 +805,14 @@ void free_cl_opts(void)
|
||||
@@ -733,14 +853,14 @@ void free_cl_opts(void)
|
||||
g_list_free(banned_irqs);
|
||||
}
|
||||
|
||||
@ -218,7 +264,7 @@ index 9868633..30a8d2a 100644
|
||||
|
||||
/* Set NULL devpath for the irq has no sysfs entries */
|
||||
get_irq_user_policy(NULL, irq, &pol);
|
||||
@@ -730,6 +824,8 @@ static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
||||
@@ -752,6 +872,8 @@ static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
||||
|
||||
if (!new)
|
||||
log(TO_CONSOLE, LOG_WARNING, "add_new_irq: Failed to add irq %d\n", irq);
|
||||
@ -228,10 +274,10 @@ index 9868633..30a8d2a 100644
|
||||
|
||||
static void add_missing_irq(struct irq_info *info, void *attr)
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index 2f699b8..e375a1a 100644
|
||||
index f965a2a..4d0a417 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -238,7 +238,7 @@ static void dump_object_tree(void)
|
||||
@@ -251,11 +251,15 @@ static void dump_object_tree(void)
|
||||
for_each_object(numa_nodes, dump_numa_node_info, NULL);
|
||||
}
|
||||
|
||||
@ -240,26 +286,45 @@ index 2f699b8..e375a1a 100644
|
||||
{
|
||||
if (info->level == BALANCE_NONE)
|
||||
return;
|
||||
|
||||
+ /* Prevent inserting a duplicate entry to avoid list chaos */
|
||||
+ if (g_list_find_custom(rebalance_irq_list, info, compare_ints))
|
||||
+ return;
|
||||
+
|
||||
if (info->assigned_obj == NULL)
|
||||
rebalance_irq_list = g_list_append(rebalance_irq_list, info);
|
||||
else
|
||||
diff --git a/irqbalance.h b/irqbalance.h
|
||||
index 8d5b329..73737ed 100644
|
||||
index 3a78c7f..9e28285 100644
|
||||
--- a/irqbalance.h
|
||||
+++ b/irqbalance.h
|
||||
@@ -107,6 +107,10 @@ extern void free_cl_opts(void);
|
||||
extern void add_cl_banned_module(char *modname);
|
||||
@@ -109,6 +109,13 @@ extern void add_banned_irq(int irq);
|
||||
extern void remove_one_irq_from_db(int irq);
|
||||
#define irq_numa_node(irq) ((irq)->numa_node)
|
||||
|
||||
+extern struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list);
|
||||
+extern void find_irq_dev_path(int irq, char *dirname, int length);
|
||||
+extern struct irq_info *add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts);
|
||||
+extern void clear_no_existing_irqs(void);
|
||||
|
||||
+extern void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)));
|
||||
+extern gint compare_ints(gconstpointer a, gconstpointer b);
|
||||
+
|
||||
extern unsigned long migrate_val;
|
||||
extern unsigned long load_limit;
|
||||
/*
|
||||
* Generic object functions
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index eb84a1c..d384860 100644
|
||||
index 70831b4..358458c 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -142,6 +142,52 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
||||
@@ -42,6 +42,7 @@
|
||||
|
||||
static int proc_int_has_msi = 0;
|
||||
static int msi_found_in_sysfs = 0;
|
||||
+int need_add_single = 0;
|
||||
|
||||
#ifdef AARCH64
|
||||
struct irq_match {
|
||||
@@ -144,6 +145,52 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
||||
|
||||
}
|
||||
#endif
|
||||
@ -312,7 +377,7 @@ index eb84a1c..d384860 100644
|
||||
|
||||
GList* collect_full_irq_list()
|
||||
{
|
||||
@@ -149,10 +187,6 @@ GList* collect_full_irq_list()
|
||||
@@ -151,10 +198,6 @@ GList* collect_full_irq_list()
|
||||
FILE *file;
|
||||
char *line = NULL;
|
||||
size_t size = 0;
|
||||
@ -323,15 +388,15 @@ index eb84a1c..d384860 100644
|
||||
|
||||
file = fopen("/proc/interrupts", "r");
|
||||
if (!file)
|
||||
@@ -168,7 +206,6 @@ GList* collect_full_irq_list()
|
||||
@@ -169,7 +212,6 @@ GList* collect_full_irq_list()
|
||||
|
||||
while (!feof(file)) {
|
||||
int number;
|
||||
while (!feof(file)) {
|
||||
int number;
|
||||
- int is_xen_dyn = 0;
|
||||
struct irq_info *info;
|
||||
char *c;
|
||||
char *savedline = NULL;
|
||||
@@ -188,45 +222,13 @@ GList* collect_full_irq_list()
|
||||
struct irq_info *info;
|
||||
char *c;
|
||||
char *savedline = NULL;
|
||||
@@ -191,45 +233,13 @@ GList* collect_full_irq_list()
|
||||
savedline = strdup(line);
|
||||
if (!savedline)
|
||||
break;
|
||||
@ -378,7 +443,7 @@ index eb84a1c..d384860 100644
|
||||
tmp_list = g_list_append(tmp_list, info);
|
||||
}
|
||||
free(savedline);
|
||||
@@ -230,6 +235,14 @@ GList* collect_full_irq_list()
|
||||
@@ -239,6 +249,14 @@ GList* collect_full_irq_list()
|
||||
return tmp_list;
|
||||
}
|
||||
|
||||
@ -393,44 +458,70 @@ index eb84a1c..d384860 100644
|
||||
void parse_proc_interrupts(void)
|
||||
{
|
||||
FILE *file;
|
||||
@@ -253,7 +266,9 @@ void parse_proc_interrupts(void)
|
||||
@@ -262,7 +280,10 @@ void parse_proc_interrupts(void)
|
||||
uint64_t count;
|
||||
char *c, *c2;
|
||||
struct irq_info *info;
|
||||
+ struct irq_info tmp_info;
|
||||
char savedline[1024];
|
||||
- char savedline[1024];
|
||||
+ struct irq_info tmp_info = {0};
|
||||
+ char *savedline = NULL;
|
||||
+ char dirname[PATH_MAX] = {'\0'};
|
||||
+ struct irq_info *lookup;
|
||||
|
||||
if (getline(&line, &size, file)==0)
|
||||
if (getline(&line, &size, file)<=0)
|
||||
break;
|
||||
@@ -281,9 +296,24 @@ void parse_proc_interrupts(void)
|
||||
@@ -282,7 +303,9 @@ void parse_proc_interrupts(void)
|
||||
if (!c)
|
||||
continue;
|
||||
|
||||
- strncpy(savedline, line, sizeof(savedline)-1);
|
||||
+ savedline = strdup(line);
|
||||
+ if (!savedline)
|
||||
+ continue;
|
||||
|
||||
*c = 0;
|
||||
c++;
|
||||
@@ -290,9 +313,37 @@ void parse_proc_interrupts(void)
|
||||
|
||||
info = get_irq_info(number);
|
||||
if (!info) {
|
||||
- need_rescan = 1;
|
||||
- break;
|
||||
+ init_irq_class_and_type(savedline, &tmp_info, number);
|
||||
+ find_irq_dev_path(number, dirname, PATH_MAX);
|
||||
+ if (strlen(dirname) > 0) {
|
||||
+ need_add_single = number;
|
||||
+ info = build_one_dev_entry(dirname, NULL);
|
||||
+ need_add_single = 0;
|
||||
+ lookup = get_irq_info(number);
|
||||
+ if (lookup != NULL) {
|
||||
+ lookup->existing = 1;
|
||||
+ info = lookup;
|
||||
+ }
|
||||
+ log(TO_CONSOLE, LOG_INFO, "new IRQ %d added into database, dirname %s\n", number, dirname);
|
||||
+ } else {
|
||||
+ init_irq_class_and_type(savedline, &tmp_info, number);
|
||||
+ info = add_new_irq(number, &tmp_info, NULL);
|
||||
+ }
|
||||
+ if (tmp_info.name) {
|
||||
+ free(tmp_info.name);
|
||||
+ tmp_info.name = NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (info) {
|
||||
+ force_rebalance_irq(info, NULL);
|
||||
+ log(TO_CONSOLE, LOG_INFO, "new IRQ %d added into rebalance list\n", number);
|
||||
+ } else {
|
||||
+ need_rescan = 1;
|
||||
+ free(savedline);
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
+ free(savedline);
|
||||
+ info->existing = 1;
|
||||
|
||||
count = 0;
|
||||
cpunr = 0;
|
||||
@@ -307,17 +337,19 @@ void parse_proc_interrupts(void)
|
||||
@@ -316,17 +367,19 @@ void parse_proc_interrupts(void)
|
||||
* cause an overflow and IRQ won't be rebalanced again
|
||||
*/
|
||||
if (count < info->irq_count) {
|
||||
|
||||
@ -1,125 +0,0 @@
|
||||
From 948425c293615a9f4a30e9049d6ca4380c7b6c83 Mon Sep 17 00:00:00 2001
|
||||
From: hejingxian <hejingxian@huawei.com>
|
||||
Date: Wed, 13 Nov 2019 13:13:28 +0800
|
||||
Subject: [PATCH] bugfix: irqbalance: fix wrong pid value in pid file
|
||||
|
||||
If irqbalance is killed by SIGKILL or SIGTERM,
|
||||
after restarting irqbalance, the pid in pid file is
|
||||
wrong, that's because the way we forbid starting
|
||||
multiple irqbalance instances is wrong.
|
||||
|
||||
Here we use fcntl to lock pid file to forbid another instance
|
||||
been launched.
|
||||
|
||||
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
|
||||
---
|
||||
irqbalance.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 75 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index 18cd7de..467e968 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -560,6 +560,78 @@ int init_socket()
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int create_lock_pidfile(const char *lockfile)
|
||||
+{
|
||||
+ struct flock lock = { 0 };
|
||||
+ char pid_s[16] = { 0 };
|
||||
+ int lf = 0;
|
||||
+ int err = -1;
|
||||
+
|
||||
+ lf = open(lockfile, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
|
||||
+ if (lf == -1) {
|
||||
+ err = -errno;
|
||||
+ log(TO_ALL, LOG_WARNING, "irqbalance (%u): Can't create lock file.\n",
|
||||
+ getpid());
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+retry_fcntl:
|
||||
+ lock.l_type = F_WRLCK;
|
||||
+ lock.l_start = 0;
|
||||
+ lock.l_whence = SEEK_SET;
|
||||
+ lock.l_len = 0;
|
||||
+ if (fcntl (lf, F_SETLK, &lock) == -1) {
|
||||
+ err = -errno;
|
||||
+ switch (errno) {
|
||||
+ case EINTR:
|
||||
+ goto retry_fcntl;
|
||||
+ case EAGAIN:
|
||||
+ case EACCES:
|
||||
+ log(TO_ALL, LOG_WARNING, "irqbalance (%u): Another instance is"
|
||||
+ " already running, errno:%d.\n", getpid(), errno);
|
||||
+ goto error_close;
|
||||
+ default:
|
||||
+ log(TO_ALL, LOG_WARNING, "irqbalance (%u): Can't aquire lock."
|
||||
+ " errno %d.\n", getpid(), errno);
|
||||
+ goto error_close;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (ftruncate(lf, 0) == -1) {
|
||||
+ err = -errno;
|
||||
+ log(TO_ALL, LOG_WARNING, "irqbalance (%u): Can't truncate lock file."
|
||||
+ " errno: %d.\n", getpid(), errno);
|
||||
+ goto error_close_unlink;
|
||||
+ }
|
||||
+ if (snprintf(pid_s, sizeof(pid_s), "%u\n", getpid()) < 0) {
|
||||
+ log(TO_ALL, LOG_WARNING, "irqbalance (%u): Can't printf pid string.\n", getpid());
|
||||
+ err = -1;
|
||||
+ goto error_close_unlink;
|
||||
+ }
|
||||
+
|
||||
+retry_write:
|
||||
+ if ((size_t)write(lf, pid_s, strlen (pid_s)) != strlen (pid_s)) {
|
||||
+ err = -errno;
|
||||
+ if (errno == EINTR) {
|
||||
+ goto retry_write;
|
||||
+ } else {
|
||||
+ log(TO_ALL, LOG_WARNING, "irqbalance (%u): Can't write pid to lock"
|
||||
+ " file. errno %d\n", getpid(), errno);
|
||||
+ goto error_close_unlink;
|
||||
+ }
|
||||
+ }
|
||||
+ close(lf);
|
||||
+ return 0;
|
||||
+
|
||||
+error_close_unlink:
|
||||
+ (void) unlink(lockfile);
|
||||
+
|
||||
+error_close:
|
||||
+ close(lf);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
sigset_t sigset, old_sigset;
|
||||
@@ -652,17 +724,12 @@ int main(int argc, char** argv)
|
||||
}
|
||||
|
||||
if (!foreground_mode) {
|
||||
- int pidfd = -1;
|
||||
if (daemon(0,0))
|
||||
exit(EXIT_FAILURE);
|
||||
/* Write pidfile */
|
||||
- if (pidfile && (pidfd = open(pidfile,
|
||||
- O_WRONLY | O_CREAT | O_EXCL | O_TRUNC,
|
||||
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) >= 0) {
|
||||
- char str[16];
|
||||
- snprintf(str, sizeof(str), "%u\n", getpid());
|
||||
- write(pidfd, str, strlen(str));
|
||||
- close(pidfd);
|
||||
+ if (pidfile && create_lock_pidfile(pidfile) < 0) {
|
||||
+ ret = EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
From cea147fc56b018266ac3235b82cdaf7d0ba74628 Mon Sep 17 00:00:00 2001
|
||||
From: hejingxian <hejingxian@huawei.com>
|
||||
Date: Fri, 10 Jan 2020 15:36:57 +0800
|
||||
Subject: [PATCH] prevent version cmd need an argument
|
||||
|
||||
In order to prevent the version cmd need an argument,
|
||||
the option 'V' can't be followed by ':'.
|
||||
---
|
||||
irqbalance.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index 15fb0fe..f182b3c 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -133,7 +133,7 @@ static void parse_command_line(int argc, char **argv)
|
||||
unsigned long val;
|
||||
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
- "odfji:p:s:c:b:l:m:t:V:h:v:r:ne:g:",
|
||||
+ "odfjVni:p:s:c:b:l:m:t:h:v:r:e:g:",
|
||||
lopts, &longind)) != -1) {
|
||||
|
||||
switch(opt) {
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@ -16,12 +16,12 @@ index 7c97d47..3681c48 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -719,7 +719,7 @@ struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list)
|
||||
if (user_policy_list == NULL) {
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
}
|
||||
- if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum, tmp_list))) {
|
||||
+ if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
||||
add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
if (new)
|
||||
goto done;
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
- if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum, tmp_irqs))) {
|
||||
+ if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
||||
add_banned_irq(irqnum, &banned_irqs);
|
||||
goto done;
|
||||
}
|
||||
--
|
||||
@ -11,7 +11,6 @@ for every irq.
|
||||
classify.c | 32 +++++++--
|
||||
irqbalance.c | 38 +++++----
|
||||
irqbalance.h | 2 +-
|
||||
misc/irqbalance.service | 2 +-
|
||||
placement.c | 3 +-
|
||||
procinterrupts.c | 3 +-
|
||||
rules_config.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
@ -55,7 +54,7 @@ index 65aeae2..7c97d47 100644
|
||||
+ get_irq_user_policy(devpath, irqnum, &pol);
|
||||
+ }
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
||||
add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
__add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
continue;
|
||||
@@ -714,7 +716,9 @@ struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list)
|
||||
new = get_irq_info(irqnum);
|
||||
@ -65,10 +64,10 @@ index 65aeae2..7c97d47 100644
|
||||
+ if (user_policy_list == NULL) {
|
||||
+ get_irq_user_policy(devpath, irqnum, &pol);
|
||||
+ }
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum, tmp_list))) {
|
||||
add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
||||
__add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
goto done;
|
||||
@@ -855,18 +859,24 @@ struct irq_info *add_new_irq(int irq, struct irq_info *hint, GList *proc_interru
|
||||
@@ -855,17 +859,23 @@ struct irq_info *add_new_irq(int irq, struct irq_info *hint, GList *proc_interru
|
||||
struct irq_info *new = NULL;
|
||||
struct user_irq_policy pol;
|
||||
|
||||
@ -83,28 +82,23 @@ index 65aeae2..7c97d47 100644
|
||||
+ get_irq_user_policy(NULL, irq, &pol);
|
||||
+ }
|
||||
if ((pol.ban == 1) || check_for_irq_ban(NULL, irq, proc_interrupts)) { /*FIXME*/
|
||||
add_banned_irq(irq, &banned_irqs, 0);
|
||||
__add_banned_irq(irq, &banned_irqs, 0);
|
||||
new = get_irq_info(irq);
|
||||
- } else
|
||||
+ } else {
|
||||
new = add_one_irq_to_db(NULL, hint, &pol);
|
||||
-
|
||||
+ if ((new != NULL) && (user_policy_list != NULL)) {
|
||||
+ if (new != NULL)
|
||||
+ set_usr_irq_policy(hint->name, new);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
if (!new)
|
||||
log(TO_CONSOLE, LOG_WARNING, "add_new_irq: Failed to add irq %d\n", irq);
|
||||
|
||||
@@ -880,6 +890,16 @@ static void add_missing_irq(struct irq_info *info, void *attr)
|
||||
@@ -880,6 +890,13 @@ static void add_missing_irq(struct irq_info *info, void *attr)
|
||||
|
||||
if (!lookup)
|
||||
add_new_irq(info->irq, info, proc_interrupts);
|
||||
+ else {
|
||||
+ if (user_policy_list != NULL) {
|
||||
+ set_usr_irq_policy(info->name, lookup);
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ set_usr_irq_policy(info->name, lookup);
|
||||
+ if (info->name) {
|
||||
+ free(info->name);
|
||||
+ info->name = NULL;
|
||||
@ -118,34 +112,33 @@ index 21d578a..d41753c 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -99,6 +99,7 @@ struct option lopts[] = {
|
||||
{"banmod", 1 , NULL, 'm'},
|
||||
{"interval", 1 , NULL, 't'},
|
||||
{"version", 0, NULL, 'V'},
|
||||
{"migrateval", 1, NULL, 'e'},
|
||||
{"loadlimit", 1, NULL, 'g'},
|
||||
+ {"rulesconfig", 1, NULL, 'r'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@@ -106,7 +107,7 @@ static void usage(void)
|
||||
{
|
||||
log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy= | -h [exact|subset|ignore]]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--powerthresh= | -p <off> | <n>] [--banirq= | -i <n>] [--banmod= | -m <module>] [--policyscript= | -l <script>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--rulesconfig= | -r <config>]\n");
|
||||
@@ -106,6 +107,7 @@ static void usage(void)
|
||||
log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy= | -h [exact|subset|ignore]]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--powerthresh= | -p <off> | <n>] [--banirq= | -i <n>] [--banmod= | -m <module>] [--policyscript= | -l <script>]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>]\n");
|
||||
}
|
||||
|
||||
static void version(void)
|
||||
@@ -121,7 +122,7 @@ static void parse_command_line(int argc, char **argv)
|
||||
@@ -121,7 +123,7 @@ static void parse_command_line(int argc, char **argv)
|
||||
unsigned long val;
|
||||
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
- "odfji:p:s:c:b:l:m:t:V",
|
||||
+ "odfji:p:s:c:b:l:m:t:V:r",
|
||||
- "odfjVi:p:s:c:b:l:m:t:e:g:",
|
||||
+ "odfjVi:p:s:c:b:l:m:t:e:g:r:",
|
||||
lopts, &longind)) != -1) {
|
||||
|
||||
switch(opt) {
|
||||
@@ -201,6 +202,9 @@ static void parse_command_line(int argc, char **argv)
|
||||
exit(1);
|
||||
}
|
||||
@@ -201,6 +203,9 @@ static void parse_command_line(int argc, char **argv)
|
||||
case 'g':
|
||||
load_limit = strtoul(optarg, NULL, 10);
|
||||
break;
|
||||
+ case 'r':
|
||||
+ rules_config_file = strdup(optarg);
|
||||
@ -153,21 +146,10 @@ index 21d578a..d41753c 100644
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -539,6 +543,25 @@ int main(int argc, char** argv)
|
||||
log(TO_ALL, LOG_WARNING, "Unable to determin HZ defaulting to 100\n");
|
||||
HZ = 100;
|
||||
@@ -539,6 +544,14 @@ int main(int argc, char** argv)
|
||||
close(pidfd);
|
||||
}
|
||||
}
|
||||
+ if (!foreground_mode) {
|
||||
+ if (daemon(0,0)) {
|
||||
+ ret = EXIT_FAILURE;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ /* Write pidfile */
|
||||
+ if (pidfile && create_lock_pidfile(pidfile) < 0) {
|
||||
+ ret = EXIT_FAILURE;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (read_user_policy_config() != 0) {
|
||||
+ log(TO_ALL, LOG_WARNING, "Read user policy config fail.\n");
|
||||
@ -179,23 +161,6 @@ index 21d578a..d41753c 100644
|
||||
|
||||
build_object_tree();
|
||||
if (debug_mode)
|
||||
@@ -554,16 +573,6 @@ int main(int argc, char** argv)
|
||||
goto out;
|
||||
}
|
||||
|
||||
- if (!foreground_mode) {
|
||||
- if (daemon(0,0))
|
||||
- exit(EXIT_FAILURE);
|
||||
- /* Write pidfile */
|
||||
- if (pidfile && create_lock_pidfile(pidfile) < 0) {
|
||||
- ret = EXIT_FAILURE;
|
||||
- goto out;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
g_unix_signal_add(SIGINT, handler, NULL);
|
||||
g_unix_signal_add(SIGTERM, handler, NULL);
|
||||
g_unix_signal_add(SIGUSR1, handler, NULL);
|
||||
@@ -589,6 +598,7 @@ int main(int argc, char** argv)
|
||||
ret = EXIT_FAILURE;
|
||||
goto out;
|
||||
@ -217,19 +182,6 @@ index 120bc9b..42f95cb 100644
|
||||
#ifdef __aarch64__
|
||||
#define AARCH64
|
||||
#endif
|
||||
diff --git a/misc/irqbalance.service b/misc/irqbalance.service
|
||||
index ce0022c..2c002b2 100644
|
||||
--- a/misc/irqbalance.service
|
||||
+++ b/misc/irqbalance.service
|
||||
@@ -5,7 +5,7 @@ After=syslog.target
|
||||
|
||||
[Service]
|
||||
OOMScoreAdjust=-500
|
||||
-Type=simple
|
||||
+Type=forking
|
||||
PIDFile=/var/run/irqbalance.pid
|
||||
EnvironmentFile=/etc/sysconfig/irqbalance
|
||||
ExecStart=/usr/sbin/irq_balancer
|
||||
diff --git a/placement.c b/placement.c
|
||||
index 19462bb..d887c60 100644
|
||||
--- a/placement.c
|
||||
@ -248,22 +200,29 @@ diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 60b2545..18b3ceb 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -245,7 +245,8 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
@@ -245,7 +245,7 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
info->class = IRQ_OTHER;
|
||||
#endif
|
||||
}
|
||||
- info->name = strdupa(irq_mod);
|
||||
+
|
||||
+ info->name = strdup(irq_mod);
|
||||
}
|
||||
|
||||
|
||||
@@ -391,6 +391,7 @@ void parse_proc_interrupts(void)
|
||||
lookup = get_irq_info(number);
|
||||
if (lookup != NULL) {
|
||||
lookup->existing = 1;
|
||||
+ set_usr_irq_policy(tmp_info.name, lookup);
|
||||
info = lookup;
|
||||
}
|
||||
log(TO_CONSOLE, LOG_INFO, "new IRQ %d added into database, dirname %s\n", number, dirname);
|
||||
diff --git a/rules_config.c b/rules_config.c
|
||||
new file mode 100644
|
||||
index 0000000..1270ac7
|
||||
--- /dev/null
|
||||
+++ b/rules_config.c
|
||||
@@ -0,0 +1,172 @@
|
||||
@@ -0,0 +1,176 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved.
|
||||
+ *
|
||||
@ -311,6 +270,10 @@ index 0000000..1270ac7
|
||||
+{
|
||||
+ USER_IRQ_POLICY *user_policy;
|
||||
+
|
||||
+ if (user_policy_list == NULL) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ user_policy = get_usr_irq_policy(name);
|
||||
+ if (user_policy != NULL) {
|
||||
+ if (user_policy->numa_node_set) {
|
||||
|
||||
@ -80,10 +80,10 @@ index 05eaa29..77076fa 100644
|
||||
unsigned int log_mask = TO_ALL;
|
||||
const char *log_indent;
|
||||
unsigned long power_thresh = ULONG_MAX;
|
||||
@@ -104,14 +105,16 @@ struct option lopts[] = {
|
||||
{"version", 0, NULL, 'V'},
|
||||
{"verifyhint", 1, NULL, 'v'},
|
||||
@@ -104,15 +105,16 @@ struct option lopts[] = {
|
||||
{"loadlimit", 1, NULL, 'g'},
|
||||
{"rulesconfig", 1, NULL, 'r'},
|
||||
{"verifyhint", 1, NULL, 'v'},
|
||||
+ {"notclearhint", 0, NULL, 'n'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
@ -92,9 +92,9 @@ index 05eaa29..77076fa 100644
|
||||
{
|
||||
log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy | -h <subset>]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--powerthresh= | -p <off> | <n>] [--banirq= | -i <n>] [--banmod= | -m <module>] [--policyscript= | -l <script>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--verifyhint= | -v n] [--rulesconfig= | -r <config>]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--verifyhint= | -v n]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--notclearhint | -n]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--verifyhint= | -v n]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--verifyhint= | -v n] [--notclearhint | -n]\n");
|
||||
}
|
||||
|
||||
static void version(void)
|
||||
@ -102,19 +102,18 @@ index 05eaa29..77076fa 100644
|
||||
unsigned long val;
|
||||
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
- "odfji:p:s:c:b:l:m:t:V:h:v:r:",
|
||||
+ "odfji:p:s:c:b:l:m:t:V:h:v:r:n",
|
||||
- "odfjVi:p:s:c:b:l:m:t:e:g:r:h:v:",
|
||||
+ "odfjVni:p:s:c:b:l:m:t:e:g:r:h:v:",
|
||||
lopts, &longind)) != -1) {
|
||||
|
||||
switch(opt) {
|
||||
@@ -225,6 +227,10 @@ static void parse_command_line(int argc, char **argv)
|
||||
@@ -225,6 +227,9 @@ static void parse_command_line(int argc, char **argv)
|
||||
case 'r':
|
||||
rules_config_file = strdup(optarg);
|
||||
break;
|
||||
+ case 'n':
|
||||
+ clear_affinity_hint = 0;
|
||||
+ break;
|
||||
+
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,11 +13,11 @@ Signed-off-by: He Jingxian <hejingxian@huawei.com>
|
||||
irqbalance.c | 4 +-
|
||||
irqbalance.h | 2 +-
|
||||
ui/Makefile | 30 ++++
|
||||
ui/client.c | 434 +++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
ui/client.c | 435 +++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
ui/irqbalance-ui.c | 4 +-
|
||||
ui/irqbalance-ui.h | 1 +
|
||||
ui/irqbalance_client.h | 111 +++++++++++++
|
||||
7 files changed, 581 insertions(+), 5 deletions(-)
|
||||
7 files changed, 582 insertions(+), 5 deletions(-)
|
||||
create mode 100644 ui/Makefile
|
||||
create mode 100644 ui/client.c
|
||||
create mode 100644 ui/irqbalance_client.h
|
||||
@ -94,7 +94,7 @@ new file mode 100644
|
||||
index 0000000..027404b
|
||||
--- /dev/null
|
||||
+++ b/ui/client.c
|
||||
@@ -0,0 +1,434 @@
|
||||
@@ -0,0 +1,435 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved.
|
||||
+ *
|
||||
@ -452,6 +452,7 @@ index 0000000..027404b
|
||||
+ if (stats_data == NULL)
|
||||
+ return NULL;
|
||||
+ parse_into_tree(stats_data);
|
||||
+ free(stats_data);
|
||||
+ return tree;
|
||||
+}
|
||||
+
|
||||
|
||||
@ -37,22 +37,21 @@ diff --git a/activate.c b/activate.c
|
||||
index d9e1fc3..87336f4 100644
|
||||
--- a/activate.c
|
||||
+++ b/activate.c
|
||||
@@ -88,26 +88,26 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||
@@ -88,20 +88,27 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||
char buf[PATH_MAX];
|
||||
FILE *file;
|
||||
cpumask_t applied_mask;
|
||||
- int valid_mask = 0;
|
||||
int ret = 0;
|
||||
+ cpumask_t applied_mask;
|
||||
|
||||
- /*
|
||||
- * only activate mappings for irqs that have moved
|
||||
- */
|
||||
- if (!info->moved)
|
||||
+ if (!info->assigned_obj)
|
||||
- return;
|
||||
-
|
||||
if (!info->assigned_obj)
|
||||
return;
|
||||
|
||||
- if (info->assigned_obj) {
|
||||
- applied_mask = info->assigned_obj->mask;
|
||||
- valid_mask = 1;
|
||||
+ applied_mask = info->assigned_obj->mask;
|
||||
+
|
||||
+ if (hint_enabled) {
|
||||
@ -63,32 +62,29 @@ index d9e1fc3..87336f4 100644
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Don't activate anything for which we have an invalid mask
|
||||
*/
|
||||
- if (!valid_mask || check_affinity(info, applied_mask))
|
||||
- return;
|
||||
-
|
||||
- if (!info->assigned_obj)
|
||||
- if (check_affinity(info, info->assigned_obj->mask))
|
||||
+ if (check_affinity(info, applied_mask))
|
||||
return;
|
||||
|
||||
sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
|
||||
@@ -120,7 +120,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||
if (!file)
|
||||
return;
|
||||
|
||||
- cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
|
||||
+ cpumask_scnprintf(buf, PATH_MAX, applied_mask);
|
||||
if (ban_pci_assigned_irq) {
|
||||
if (!is_still_pci_assigned_irq(info->irq)) {
|
||||
ret = fprintf(file, "%s", buf);
|
||||
diff --git a/classify.c b/classify.c
|
||||
index 5aed9e5..75677f4 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -71,8 +71,6 @@ struct pci_info {
|
||||
#define PCI_SUB_DEVICE_EMC_0568 0x0568
|
||||
#define PCI_SUB_DEVICE_EMC_dd00 0xdd00
|
||||
|
||||
-extern void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)));
|
||||
-
|
||||
/*
|
||||
* Apply software workarounds for some special devices
|
||||
*
|
||||
@@ -448,7 +446,7 @@ get_numa_node:
|
||||
fd = fopen(path, "r");
|
||||
if (!fd) {
|
||||
@ -338,15 +334,14 @@ index faa8e6a..4a7eb39 100644
|
||||
int last_interval;
|
||||
+int hint_enabled = 0;
|
||||
+int poll_hint_interval = SLEEP_INTERVAL / 5;
|
||||
unsigned long migrate_val = 0;
|
||||
unsigned long load_limit = 0;
|
||||
GMainLoop *main_loop;
|
||||
|
||||
char *cpu_ban_string = NULL;
|
||||
@@ -99,15 +101,16 @@ struct option lopts[] = {
|
||||
{"banmod", 1 , NULL, 'm'},
|
||||
{"interval", 1 , NULL, 't'},
|
||||
{"version", 0, NULL, 'V'},
|
||||
+ {"verifyhint", 1, NULL, 'v'},
|
||||
{"migrateval", 1, NULL, 'e'},
|
||||
{"loadlimit", 1, NULL, 'g'},
|
||||
{"rulesconfig", 1, NULL, 'r'},
|
||||
+ {"verifyhint", 1, NULL, 'v'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@ -355,8 +350,9 @@ index faa8e6a..4a7eb39 100644
|
||||
- log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy= | -h [exact|subset|ignore]]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy | -h <subset>]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--powerthresh= | -p <off> | <n>] [--banirq= | -i <n>] [--banmod= | -m <module>] [--policyscript= | -l <script>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--rulesconfig= | -r <config>]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--verifyhint= | -v n] [--rulesconfig= | -r <config>]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--verifyhint= | -v n]\n");
|
||||
}
|
||||
|
||||
static void version(void)
|
||||
@ -364,14 +360,14 @@ index faa8e6a..4a7eb39 100644
|
||||
unsigned long val;
|
||||
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
- "odfji:p:s:c:b:l:m:t:V:r",
|
||||
+ "odfji:p:s:c:b:l:m:t:V:h:v:r:",
|
||||
- "odfjVi:p:s:c:b:l:m:t:e:g:r:",
|
||||
+ "odfjVi:p:s:c:b:l:m:t:e:g:r:h:v:",
|
||||
lopts, &longind)) != -1) {
|
||||
|
||||
switch(opt) {
|
||||
@@ -202,6 +205,22 @@ static void parse_command_line(int argc, char **argv)
|
||||
exit(1);
|
||||
}
|
||||
case 'g':
|
||||
load_limit = strtoul(optarg, NULL, 10);
|
||||
break;
|
||||
+ case 'h':
|
||||
+ if (!strncmp(optarg, "subset", strlen(optarg)))
|
||||
@ -444,23 +440,15 @@ index 1befb46..72e141b 100644
|
||||
#ifdef __aarch64__
|
||||
#define AARCH64
|
||||
#endif
|
||||
@@ -113,6 +114,7 @@ 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);
|
||||
#define irq_numa_node(irq) ((irq)->numa_node)
|
||||
+extern void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)));
|
||||
extern gint compare_ints(gconstpointer a, gconstpointer b);
|
||||
@@ -120,6 +122,8 @@ extern gint compare_ints(gconstpointer a, gconstpointer b);
|
||||
|
||||
extern struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list);
|
||||
@@ -120,6 +122,8 @@ extern struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list
|
||||
extern void find_irq_dev_path(int irq, char *dirname, int length);
|
||||
extern struct irq_info *add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts);
|
||||
extern void clear_no_existing_irqs(void);
|
||||
extern unsigned long migrate_val;
|
||||
extern unsigned long load_limit;
|
||||
+extern int hint_enabled, poll_hint_interval;
|
||||
+extern int sleep_interval;
|
||||
|
||||
/*
|
||||
* Generic object functions
|
||||
*/
|
||||
diff --git a/placement.c b/placement.c
|
||||
index 48ac68b..d887c60 100644
|
||||
--- a/placement.c
|
||||
|
||||
@ -125,21 +125,19 @@ index dc8307d..1774eda 100644
|
||||
static void sleep_approx(int seconds)
|
||||
{
|
||||
@@ -109,6 +111,7 @@ struct option lopts[] = {
|
||||
{"rulesconfig", 1, NULL, 'r'},
|
||||
{"verifyhint", 1, NULL, 'v'},
|
||||
{"notclearhint", 0, NULL, 'n'},
|
||||
{"migrateval", 1, NULL, 'e'},
|
||||
{"loadlimit", 1, NULL, 'g'},
|
||||
+ {"blocksocket", 0, NULL, 'k'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@@ -116,8 +119,8 @@ static void usage(void)
|
||||
{
|
||||
@@ -116,7 +119,7 @@ static void usage(void)
|
||||
log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy | -h <subset>]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--powerthresh= | -p <off> | <n>] [--banirq= | -i <n>] [--banmod= | -m <module>] [--policyscript= | -l <script>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--verifyhint= | -v n]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--notclearhint | -n] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--verifyhint= | -v n] [--blocksocket | -k]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--notclearhint | -n] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--verifyhint= | -v n] [--notclearhint | -n]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--verifyhint= | -v n] [--notclearhint | -n] [--blocksocket | -k]\n");
|
||||
}
|
||||
|
||||
static void version(void)
|
||||
@ -147,16 +145,15 @@ index dc8307d..1774eda 100644
|
||||
unsigned long val;
|
||||
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
- "odfjVni:p:s:c:b:l:m:t:h:v:r:e:g:",
|
||||
+ "odfjVni:p:s:c:b:l:m:t:h:v:r:e:g:k",
|
||||
- "odfjVni:p:s:c:b:l:m:t:e:g:r:h:v:",
|
||||
+ "odfjVnki:p:s:c:b:l:m:t:e:g:r:h:v:",
|
||||
lopts, &longind)) != -1) {
|
||||
|
||||
switch(opt) {
|
||||
@@ -240,7 +243,9 @@ static void parse_command_line(int argc, char **argv)
|
||||
case 'g':
|
||||
load_limit = strtoul(optarg, NULL, 10);
|
||||
@@ -240,6 +243,9 @@ static void parse_command_line(int argc, char **argv)
|
||||
case 'n':
|
||||
clear_affinity_hint = 0;
|
||||
break;
|
||||
-
|
||||
+ case 'k':
|
||||
+ use_unblock_socket = 0;
|
||||
+ break;
|
||||
|
||||
@ -31,10 +31,11 @@ index fc4641a..99bcf50 100644
|
||||
{ "[A-Z0-9]{4}[0-9a-f]{4}", {NULL} ,check_platform_device, IRQ_TYPE_LEGACY, IRQ_OTHER},
|
||||
{ "PNP[0-9a-f]{4}", {NULL} ,check_platform_device, IRQ_TYPE_LEGACY, IRQ_OTHER},
|
||||
{ ".*", {NULL}, NULL, IRQ_TYPE_LEGACY, IRQ_OTHER},
|
||||
@@ -152,6 +154,7 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
@@ -152,6 +154,8 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
int is_xen_dyn = 0;
|
||||
#ifdef AARCH64
|
||||
char *tmp = NULL;
|
||||
+ char irq_fullname_valid = 1;
|
||||
+ char irq_fullname[PATH_MAX] = {0};
|
||||
#endif
|
||||
|
||||
@ -56,28 +57,39 @@ index fc4641a..99bcf50 100644
|
||||
}
|
||||
|
||||
#ifdef AARCH64
|
||||
@@ -171,6 +184,13 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
@@ -171,6 +184,17 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
tmp = strchr(irq_name, '\n');
|
||||
if (tmp)
|
||||
*tmp = 0;
|
||||
+
|
||||
+ strcat(irq_fullname, irq_name);
|
||||
+ strcat(irq_fullname, " ");
|
||||
+ strcat(irq_fullname, savedptr);
|
||||
+ tmp = strchr(irq_fullname, '\n');
|
||||
+ if (tmp)
|
||||
+ *tmp = 0;
|
||||
+ if (strlen(irq_name) + strlen(savedptr) + 1 < PATH_MAX) {
|
||||
+ strcat(irq_fullname, irq_name);
|
||||
+ strcat(irq_fullname, " ");
|
||||
+ strcat(irq_fullname, savedptr);
|
||||
+ tmp = strchr(irq_fullname, '\n');
|
||||
+ if (tmp)
|
||||
+ *tmp = 0;
|
||||
+ } else {
|
||||
+ irq_fullname_valid = 0;
|
||||
+ }
|
||||
#endif
|
||||
irq_mod = last_token;
|
||||
info->irq = irq;
|
||||
@@ -180,6 +200,7 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
@@ -180,7 +200,13 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
info->class = IRQ_VIRT_EVENT;
|
||||
} else {
|
||||
#ifdef AARCH64
|
||||
+ irq_name = irq_fullname;
|
||||
guess_arm_irq_hints(irq_name, info);
|
||||
- guess_arm_irq_hints(irq_name, info);
|
||||
+ if (irq_fullname_valid) {
|
||||
+ irq_name = irq_fullname;
|
||||
+ guess_arm_irq_hints(irq_name, info);
|
||||
+ } else {
|
||||
+ info->type = IRQ_TYPE_LEGACY;
|
||||
+ info->class = IRQ_OTHER;
|
||||
+ }
|
||||
#else
|
||||
info->type = IRQ_TYPE_LEGACY;
|
||||
info->class = IRQ_OTHER;
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
|
||||
@ -1,131 +0,0 @@
|
||||
From 0ddf835e21b4d33aba9d30755cc5674d1ee5a979 Mon Sep 17 00:00:00 2001
|
||||
From: Zengruan Ye <yezengruan@huawei.com>
|
||||
Date: Sat, 13 Jul 2019 19:12:29 +0800
|
||||
Subject: [PATCH 2/6] feature: irqbalance: 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.
|
||||
|
||||
Signed-off-by: wanghaibin <wanghaibin.wang@huawei.com>
|
||||
---
|
||||
classify.c | 7 +++++++
|
||||
irqbalance.h | 3 +++
|
||||
procinterrupts.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 64 insertions(+)
|
||||
|
||||
diff --git a/classify.c b/classify.c
|
||||
index 3a25d62..65cb4e5 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -299,6 +299,13 @@ static void add_banned_irq(int irq, GList **list, int extra_flag)
|
||||
return;
|
||||
}
|
||||
|
||||
+#ifdef AARCH64
|
||||
+void add_banned_list_irq(int irq)
|
||||
+{
|
||||
+ add_banned_irq(irq, &banned_irqs);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
void add_cl_banned_irq(int irq)
|
||||
{
|
||||
add_banned_irq(irq, &cl_banned_irqs);
|
||||
diff --git a/irqbalance.h b/irqbalance.h
|
||||
index 821de0e..c00430f 100644
|
||||
--- a/irqbalance.h
|
||||
+++ b/irqbalance.h
|
||||
@@ -100,6 +100,9 @@ extern int get_cpu_count(void);
|
||||
extern void rebuild_irq_db(void);
|
||||
extern void free_irq_db(void);
|
||||
extern void add_cl_banned_irq(int irq);
|
||||
+#ifdef AARCH64
|
||||
+extern void add_banned_list_irq(int irq);
|
||||
+#endif
|
||||
extern void for_each_irq(GList *list, void (*cb)(struct irq_info *info, void *data), void *data);
|
||||
extern struct irq_info *get_irq_info(int irq);
|
||||
extern void migrate_irq(GList **from, GList **to, struct irq_info *info);
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 9e38e49..1f04a82 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -142,6 +142,42 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
||||
|
||||
|
||||
}
|
||||
+
|
||||
+/*
|
||||
+ * This check is only invoked at service startup, and avoid any impact on the system,
|
||||
+ * The scheme just only reads the irq's aff, and write it back. According to the result
|
||||
+ * of writing to fitler the irq.
|
||||
+ * Return 0 means the irq can change aff. Other return values, on the contrary.
|
||||
+ */
|
||||
+static int is_arm_irq_aff_cannot_change(int irq)
|
||||
+{
|
||||
+ char buf[PATH_MAX] = { 0 };
|
||||
+ FILE *file = NULL;
|
||||
+ char *line = NULL;
|
||||
+ size_t size = 0;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ snprintf(buf, PATH_MAX - 1, "/proc/irq/%i/smp_affinity", irq);
|
||||
+ file = fopen(buf, "r+");
|
||||
+ if (!file)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (getline(&line, &size, file) <= 0) {
|
||||
+ ret = -1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ line[strlen(line) - 1] = '\0';
|
||||
+
|
||||
+ fprintf(file, "%s", line);
|
||||
+ ret = fflush(file);
|
||||
+
|
||||
+out:
|
||||
+ free(line);
|
||||
+ fclose(file);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
#endif
|
||||
static void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq) {
|
||||
char *irq_name = NULL;
|
||||
@@ -233,6 +269,24 @@ GList* collect_full_irq_list()
|
||||
c++;
|
||||
number = strtoul(line, NULL, 10);
|
||||
|
||||
+#ifdef AARCH64
|
||||
+ if (is_arm_irq_aff_cannot_change(number)) {
|
||||
+ /*
|
||||
+ * This means that the irq affinity cannot be changed, just like:
|
||||
+ * (1) the irq with IRQF_PERCPU flag, per cpu irq (in arm64, like PPI)
|
||||
+ * (2) the irq with IRQD_NO_BALANCING flag, some driver request irq can
|
||||
+ * set the flag according to themselves require. for example in arm64,
|
||||
+ * for the passthrough doorbell irq (GICV4), in future.
|
||||
+ * (3) the irq with IRQD_AFFINITY_MANAGED flag, some drivers can set
|
||||
+ * specially irq affinity, and prohibit user to modify it.
|
||||
+ *
|
||||
+ * For these irqs, we can add these to banned irq list.
|
||||
+ */
|
||||
+ add_banned_list_irq(number);
|
||||
+ continue;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
info = calloc(sizeof(struct irq_info), 1);
|
||||
if (info) {
|
||||
init_irq_class_and_type(savedline, info, number);
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
@ -66,21 +66,21 @@ index 1c4b867..ad60fde 100644
|
||||
@@ -89,7 +116,16 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||
return;
|
||||
|
||||
cpumask_scnprintf(buf, PATH_MAX, applied_mask);
|
||||
- fprintf(file, "%s", buf);
|
||||
cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
|
||||
- ret = fprintf(file, "%s", buf);
|
||||
+ if (ban_pci_assigned_irq) {
|
||||
+ if (!is_still_pci_assigned_irq(info->irq)) {
|
||||
+ fprintf(file, "%s", buf);
|
||||
+ ret = fprintf(file, "%s", buf);
|
||||
+ } else {
|
||||
+ log(TO_CONSOLE, LOG_INFO, "IRQ %d is turned into a PCI-assigned irq number.\n", info->irq);
|
||||
+ need_rescan = 1;
|
||||
+ }
|
||||
+ } else {
|
||||
+ fprintf(file, "%s", buf);
|
||||
+ ret = fprintf(file, "%s", buf);
|
||||
+ }
|
||||
fclose(file);
|
||||
info->moved = 0; /*migration is done*/
|
||||
}
|
||||
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);
|
||||
diff --git a/classify.c b/classify.c
|
||||
index 37bfb29..52fd74a 100644
|
||||
--- a/classify.c
|
||||
@ -90,15 +90,15 @@ index 37bfb29..52fd74a 100644
|
||||
GList *cl_banned_irqs = NULL;
|
||||
static GList *cl_banned_modules = NULL;
|
||||
+static GList *vm_banned_irqs = NULL;
|
||||
extern int need_add_single;
|
||||
|
||||
#define SYSFS_DIR "/sys"
|
||||
#define SYSPCI_DIR "/sys/bus/pci/devices"
|
||||
@@ -264,7 +265,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, int extra_flag)
|
||||
-static void __add_banned_irq(int irq, GList **list)
|
||||
+static void __add_banned_irq(int irq, GList **list, int extra_flag)
|
||||
{
|
||||
struct irq_info find, *new;
|
||||
GList *entry;
|
||||
@ -110,24 +110,23 @@ index 37bfb29..52fd74a 100644
|
||||
|
||||
*list = g_list_append(*list, new);
|
||||
log(TO_CONSOLE, LOG_INFO, "IRQ %d was BANNED.\n", irq);
|
||||
@@ -291,13 +293,18 @@ static void add_banned_irq(int irq, GList **list)
|
||||
#ifdef AARCH64
|
||||
void add_banned_list_irq(int irq)
|
||||
@@ -291,12 +293,17 @@ static void __add_banned_irq(int irq, GList **list)
|
||||
|
||||
void add_banned_irq(int irq)
|
||||
{
|
||||
- add_banned_irq(irq, &banned_irqs);
|
||||
+ add_banned_irq(irq, &banned_irqs, 0);
|
||||
- __add_banned_irq(irq, &banned_irqs);
|
||||
+ __add_banned_irq(irq, &banned_irqs, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
void add_cl_banned_irq(int irq)
|
||||
{
|
||||
- add_banned_irq(irq, &cl_banned_irqs);
|
||||
+ add_banned_irq(irq, &cl_banned_irqs, 0);
|
||||
- __add_banned_irq(irq, &cl_banned_irqs);
|
||||
+ __add_banned_irq(irq, &cl_banned_irqs, 0);
|
||||
+}
|
||||
+
|
||||
+void add_vm_banned_irq(int irq)
|
||||
+{
|
||||
+ add_banned_irq(irq, &vm_banned_irqs, IRQ_FLAG_VM_BANNED);
|
||||
+ __add_banned_irq(irq, &vm_banned_irqs, IRQ_FLAG_VM_BANNED);
|
||||
}
|
||||
|
||||
static int is_banned_irq(int irq)
|
||||
@ -147,20 +146,20 @@ index 37bfb29..52fd74a 100644
|
||||
continue;
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
||||
- add_banned_irq(irqnum, &banned_irqs);
|
||||
+ add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
- __add_banned_irq(irqnum, &banned_irqs);
|
||||
+ __add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
continue;
|
||||
}
|
||||
hint.irq = irqnum;
|
||||
if (!is_proc_irq_info_exist(irqnum, tmp_list)) {
|
||||
@@ -695,7 +705,7 @@ struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list)
|
||||
goto done;
|
||||
get_irq_user_policy(devpath, irqnum, &pol);
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum, tmp_list))) {
|
||||
- add_banned_irq(irqnum, &banned_irqs);
|
||||
+ add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
||||
- __add_banned_irq(irqnum, &banned_irqs);
|
||||
+ __add_banned_irq(irqnum, &banned_irqs, 0);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!is_proc_irq_info_exist(irqnum, tmp_list)) {
|
||||
@@ -811,6 +821,9 @@ void free_irq_db(void)
|
||||
banned_irqs = NULL;
|
||||
g_list_free(rebalance_irq_list);
|
||||
@ -175,8 +174,8 @@ index 37bfb29..52fd74a 100644
|
||||
/* Set NULL devpath for the irq has no sysfs entries */
|
||||
get_irq_user_policy(NULL, irq, &pol);
|
||||
if ((pol.ban == 1) || check_for_irq_ban(NULL, irq, proc_interrupts)) { /*FIXME*/
|
||||
- add_banned_irq(irq, &banned_irqs);
|
||||
+ add_banned_irq(irq, &banned_irqs, 0);
|
||||
- __add_banned_irq(irq, &banned_irqs);
|
||||
+ __add_banned_irq(irq, &banned_irqs, 0);
|
||||
new = get_irq_info(irq);
|
||||
} else
|
||||
new = add_one_irq_to_db(NULL, hint, &pol);
|
||||
@ -262,42 +261,41 @@ diff --git a/irqbalance.h b/irqbalance.h
|
||||
index 5016cc8..339e2a3 100644
|
||||
--- a/irqbalance.h
|
||||
+++ b/irqbalance.h
|
||||
@@ -103,8 +103,10 @@ extern void add_cl_banned_irq(int irq);
|
||||
#ifdef AARCH64
|
||||
extern void add_banned_list_irq(int irq);
|
||||
#endif
|
||||
+extern void add_vm_banned_irq(int irq);
|
||||
extern void for_each_irq(GList *list, void (*cb)(struct irq_info *info, void *data), void *data);
|
||||
extern struct irq_info *get_irq_info(int irq);
|
||||
+extern int is_pci_assigned_irq(const char *line);
|
||||
extern void migrate_irq(GList **from, GList **to, struct irq_info *info);
|
||||
extern void free_cl_opts(void);
|
||||
@@ -103,6 +103,8 @@ 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);
|
||||
+extern void add_vm_banned_irq(int irq);
|
||||
+extern int is_pci_assigned_irq(const char *line);
|
||||
#define irq_numa_node(irq) ((irq)->numa_node)
|
||||
|
||||
extern struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list);
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 6cfa661..522b9a1 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -42,6 +42,7 @@
|
||||
|
||||
static int proc_int_has_msi = 0;
|
||||
static int msi_found_in_sysfs = 0;
|
||||
int need_add_single = 0;
|
||||
+extern int ban_pci_assigned_irq;
|
||||
|
||||
#ifdef AARCH64
|
||||
struct irq_match {
|
||||
@@ -290,6 +291,12 @@ GList* collect_full_irq_list()
|
||||
@@ -269,6 +270,13 @@ GList* collect_full_irq_list()
|
||||
c++;
|
||||
number = strtoul(line, NULL, 10);
|
||||
|
||||
+ if (ban_pci_assigned_irq && is_pci_assigned_irq(c)) {
|
||||
+ log(TO_ALL, LOG_INFO, "Banned PCI-assigned irq %d.\n", number);
|
||||
+ add_vm_banned_irq(number);
|
||||
+ free(savedline);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
#ifdef AARCH64
|
||||
if (is_arm_irq_aff_cannot_change(number)) {
|
||||
/*
|
||||
info = calloc(sizeof(struct irq_info), 1);
|
||||
if (info) {
|
||||
init_irq_class_and_type(savedline, info, number);
|
||||
@@ -333,6 +340,7 @@ void parse_proc_interrupts(void)
|
||||
FILE *file;
|
||||
char *line = NULL;
|
||||
@ -307,7 +305,7 @@ index 6cfa661..522b9a1 100644
|
||||
file = fopen("/proc/interrupts", "r");
|
||||
if (!file)
|
||||
@@ -400,6 +408,21 @@ void parse_proc_interrupts(void)
|
||||
}
|
||||
free(savedline);
|
||||
info->existing = 1;
|
||||
|
||||
+ if (ban_pci_assigned_irq) {
|
||||
@ -336,7 +334,7 @@ index 62cc2bb..c0950ee 100644
|
||||
* IRQ Internal tracking flags
|
||||
*/
|
||||
#define IRQ_FLAG_BANNED 1
|
||||
+#define IRQ_FLAG_VM_BANNED 2
|
||||
+#define IRQ_FLAG_VM_BANNED 2
|
||||
|
||||
enum obj_type_e {
|
||||
OBJ_TYPE_CPU,
|
||||
|
||||
@ -21,7 +21,7 @@ index 8a5b1f4..ce0022c 100644
|
||||
|
||||
[Service]
|
||||
+OOMScoreAdjust=-500
|
||||
+Type=simple
|
||||
+Type=forking
|
||||
+PIDFile=/var/run/irqbalance.pid
|
||||
EnvironmentFile=/etc/sysconfig/irqbalance
|
||||
-ExecStart=/usr/sbin/irqbalance --foreground $IRQBALANCE_ARGS
|
||||
|
||||
@ -33,7 +33,7 @@ index cace4d8..5e5ef9b 100644
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (!foreground_mode) {
|
||||
|
||||
@@ -673,7 +674,8 @@ int main(int argc, char** argv)
|
||||
parse_proc_stat();
|
||||
|
||||
|
||||
65
fix-the-pid-file-generates-too-late-problem.patch
Normal file
65
fix-the-pid-file-generates-too-late-problem.patch
Normal file
@ -0,0 +1,65 @@
|
||||
From a23a3b9881eff000f79ca4cf9bd0e526399e6a68 Mon Sep 17 00:00:00 2001
|
||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
||||
Date: Fri, 6 Sep 2019 21:00:52 +0800
|
||||
Subject: [PATCH 08/48] * fix the pid file generates too late problem
|
||||
|
||||
When the system processes many irqs with using user policy script,
|
||||
the build_object_tree function will fork many child processes which costs several minutes.
|
||||
In the irqbalance main process, the pid file generates after build_object_tree.
|
||||
Therefore, the generation time of the pid file is several minutes later than the process start time.
|
||||
When the irqbalance service is started by systemd based forking mode, systemd will check the pid file.
|
||||
If the pid file generates too late, systemd will think the irqbalance service as starting failed.
|
||||
---
|
||||
irqbalance.c | 29 +++++++++++++++--------------
|
||||
1 file changed, 15 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index d424326..8199c06 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -573,6 +573,21 @@ int main(int argc, char** argv)
|
||||
log(TO_ALL, LOG_WARNING, "Unable to determin HZ defaulting to 100\n");
|
||||
HZ = 100;
|
||||
}
|
||||
+
|
||||
+ if (!foreground_mode) {
|
||||
+ int pidfd = -1;
|
||||
+ if (daemon(0,0))
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ /* Write pidfile which can be used to avoid starting mutiple instances */
|
||||
+ if (pidfile && (pidfd = open(pidfile,
|
||||
+ O_WRONLY | O_CREAT | O_EXCL | O_TRUNC,
|
||||
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) >= 0) {
|
||||
+ char str[16];
|
||||
+ snprintf(str, sizeof(str), "%u\n", getpid());
|
||||
+ write(pidfd, str, strlen(str));
|
||||
+ close(pidfd);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
build_object_tree();
|
||||
if (debug_mode)
|
||||
@@ -588,20 +603,6 @@ int main(int argc, char** argv)
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
- if (!foreground_mode) {
|
||||
- int pidfd = -1;
|
||||
- if (daemon(0,0))
|
||||
- exit(EXIT_FAILURE);
|
||||
- /* Write pidfile */
|
||||
- if (pidfile && (pidfd = open(pidfile,
|
||||
- O_WRONLY | O_CREAT | O_EXCL | O_TRUNC,
|
||||
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) >= 0) {
|
||||
- char str[16];
|
||||
- snprintf(str, sizeof(str), "%u\n", getpid());
|
||||
- write(pidfd, str, strlen(str));
|
||||
- close(pidfd);
|
||||
- }
|
||||
- }
|
||||
|
||||
g_unix_signal_add(SIGINT, handler, NULL);
|
||||
g_unix_signal_add(SIGTERM, handler, NULL);
|
||||
--
|
||||
2.21.0.windows.1
|
||||
|
||||
@ -16,29 +16,29 @@ index 1ca401e..15fb0fe 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -69,6 +69,8 @@ int sleep_interval = SLEEP_INTERVAL;
|
||||
long HZ;
|
||||
int sleep_interval = SLEEP_INTERVAL;
|
||||
int last_interval;
|
||||
int hint_enabled = 0;
|
||||
int poll_hint_interval = SLEEP_INTERVAL / 5;
|
||||
+unsigned long migrate_val = 0;
|
||||
+unsigned long load_limit = 0;
|
||||
GMainLoop *main_loop;
|
||||
|
||||
char *cpu_ban_string = NULL;
|
||||
@@ -106,6 +108,8 @@ struct option lopts[] = {
|
||||
{"verifyhint", 1, NULL, 'v'},
|
||||
{"rulesconfig", 1, NULL, 'r'},
|
||||
{"notclearhint", 0, NULL, 'n'},
|
||||
{"banmod", 1 , NULL, 'm'},
|
||||
{"interval", 1 , NULL, 't'},
|
||||
{"version", 0, NULL, 'V'},
|
||||
+ {"migrateval", 1, NULL, 'e'},
|
||||
+ {"loadlimit", 1, NULL, 'g'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@@ -114,7 +118,7 @@ static void usage(void)
|
||||
log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy | -h <subset>]\n");
|
||||
{
|
||||
log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j] [--hintpolicy= | -h [exact|subset|ignore]]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--powerthresh= | -p <off> | <n>] [--banirq= | -i <n>] [--banmod= | -m <module>] [--policyscript= | -l <script>]\n");
|
||||
log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--verifyhint= | -v n]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--notclearhint | -n]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--rulesconfig= | -r <config>] [--notclearhint | -n] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
- log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>]\n");
|
||||
+ log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--migrateval= | -e <n>] [--loadlimit= | -g <n>]\n");
|
||||
}
|
||||
|
||||
static void version(void)
|
||||
@ -46,14 +46,14 @@ index 1ca401e..15fb0fe 100644
|
||||
unsigned long val;
|
||||
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
- "odfji:p:s:c:b:l:m:t:V:h:v:r:n",
|
||||
+ "odfji:p:s:c:b:l:m:t:V:h:v:r:ne:g:",
|
||||
- "odfjVi:p:s:c:b:l:m:t:",
|
||||
+ "odfjVi:p:s:c:b:l:m:t:e:g:",
|
||||
lopts, &longind)) != -1) {
|
||||
|
||||
switch(opt) {
|
||||
@@ -231,6 +235,12 @@ static void parse_command_line(int argc, char **argv)
|
||||
case 'n':
|
||||
clear_affinity_hint = 0;
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
+ case 'e':
|
||||
+ migrate_val = strtoul(optarg, NULL, 10);
|
||||
@ -61,17 +61,17 @@ index 1ca401e..15fb0fe 100644
|
||||
+ case 'g':
|
||||
+ load_limit = strtoul(optarg, NULL, 10);
|
||||
+ break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/irqbalance.h b/irqbalance.h
|
||||
index 72e141b..d4f6e7a 100644
|
||||
--- a/irqbalance.h
|
||||
+++ b/irqbalance.h
|
||||
@@ -124,7 +124,8 @@ extern struct irq_info *add_new_irq(int irq, struct irq_info *hint, GList *proc_
|
||||
extern void clear_no_existing_irqs(void);
|
||||
extern int hint_enabled, poll_hint_interval;
|
||||
extern int sleep_interval;
|
||||
extern void add_cl_banned_module(char *modname);
|
||||
#define irq_numa_node(irq) ((irq)->numa_node)
|
||||
|
||||
-
|
||||
+extern unsigned long migrate_val;
|
||||
+extern unsigned long load_limit;
|
||||
@ -1,7 +1,7 @@
|
||||
Summary: A dynamic adaptive IRQ balancing daemon
|
||||
Name: irqbalance
|
||||
Version: 1.4.0
|
||||
Release: 18
|
||||
Release: 19
|
||||
Epoch: 3
|
||||
|
||||
License: GPLv2
|
||||
@ -33,52 +33,46 @@ Patch6: irqbalance-Add-support-for-file-based-socket-for-IPC.patch
|
||||
Patch7: Fix-several-memleak-problems-found-by-covscan.patch
|
||||
Patch8: Fix-an-possible-overflow-error.patch
|
||||
Patch9: Fix-irqbalance-ui-failing-to-connect-to-irqbalance-d.patch
|
||||
Patch10:procinterrupts-check-xen-dyn-event-more-flexible.patch
|
||||
Patch11:Fix-ambiguous-parsing-of-node-entries-in-sys.patch
|
||||
Patch12:Don-t-leak-socket-fd-on-connection-error.patch
|
||||
Patch13:Fix-string-truncation-issues-detected-by-GCC-8.patch
|
||||
Patch14:fix-balancing-when-numa-information-isn-t-available.patch
|
||||
Patch10: procinterrupts-check-xen-dyn-event-more-flexible.patch
|
||||
Patch11: Fix-ambiguous-parsing-of-node-entries-in-sys.patch
|
||||
Patch12: Don-t-leak-socket-fd-on-connection-error.patch
|
||||
Patch13: Fix-string-truncation-issues-detected-by-GCC-8.patch
|
||||
Patch14: fix-balancing-when-numa-information-isn-t-available.patch
|
||||
|
||||
Patch6000: Checking-return-value-of-strdup-in-collect_full_irq_.patch
|
||||
Patch6001: getline-clean-up-freeing-of-lines-from-getline.patch
|
||||
Patch6002: free-the-memory-when-getline-fail-in-add_one_node.patch
|
||||
Patch6003: prevent-NULL-pointer-dereference-when-memory-allocat.patch
|
||||
Patch6004: fix-resource-leak-for-not-invoking-closedir-after-op.patch
|
||||
Patch6005: correct-to-use-realloc-function.patch
|
||||
Patch6006: fix-the-problem-of-banmod-that-memory-is-freed-befor.patch
|
||||
Patch6007: fix-sleep-interval-when-sleep_interval-is-changed-by.patch
|
||||
Patch6008: fix-resource-leak-on-the-error-paths-in-main.patch
|
||||
Patch6009: fix-invalid-pointer-dereference-banned_cpumask_from_.patch
|
||||
Patch6010: free-cpu_ban_string-when-the-next-request-come.patch
|
||||
Patch6000: use-policy-prior-to-the-default-values.patch
|
||||
Patch6001: some-variable-and-judgement-are-unnecessary-in-activ.patch
|
||||
Patch6002: fix-sleep-interval-when-sleep_interval-is-changed-by.patch
|
||||
Patch6003: guess_arm_irq_hints.patch
|
||||
Patch6004: fix-the-pid-file-generates-too-late-problem.patch
|
||||
Patch6005: make-the-return-value-of-getline-handled-correct.patch
|
||||
Patch6006: change-irq-ban-check-path-to-devpath.patch
|
||||
Patch6007: Checking-return-value-of-strdup-in-collect_full_irq_.patch
|
||||
Patch6008: getline-clean-up-freeing-of-lines-from-getline.patch
|
||||
Patch6009: free-the-memory-when-getline-fail-in-add_one_node.patch
|
||||
Patch6010: prevent-NULL-pointer-dereference-when-memory-allocat.patch
|
||||
Patch6011: fix-resource-leak-for-not-invoking-closedir-after-op.patch
|
||||
Patch6012: correct-to-use-realloc-function.patch
|
||||
Patch6013: fix-the-problem-of-banmod-that-memory-is-freed-befor.patch
|
||||
Patch6014: fix-resource-leak-on-the-error-paths-in-main.patch
|
||||
Patch6015: fix-invalid-pointer-dereference-banned_cpumask_from_.patch
|
||||
Patch6016: free-cpu_ban_string-when-the-next-request-come.patch
|
||||
Patch6017: make-the-option-V-closer-to-the-option-with-no-arg.patch
|
||||
Patch6018: improve-irq-migrate-rule-to-avoid-high-irq-load.patch
|
||||
Patch6019: arm64-Add-irq-aff-change-check.patch
|
||||
|
||||
Patch9000: irqbalance-1.0.4-env-file-path.patch
|
||||
Patch9001: bugfix-fix-a-hole-that-flees-hotplug-event.patch
|
||||
Patch9002: bugfix-use-policy-prior-to-the-default-values.patch
|
||||
Patch9003: bugfix-force-irq-into-rebalance-list-when-irq-removed-and-reinserted.patch
|
||||
Patch9004: feature-irqbalance-aarch64-add-the-regular-to-get-th.patch
|
||||
Patch9005: feature-irqbalance-arm64-Add-irq-aff-change-check.patch
|
||||
Patch9006: feature-irqbalance-auto-banned-pci-assigned-irq.patch
|
||||
Patch9007: bugfix-irqbalance-fix-wrong-pid-value-in-pid-file.patch
|
||||
Patch9008: feature-supplement-irqbalance-service-config.patch
|
||||
Patch9009: bugfix-fgets-will-get-a-redundant-new-line.patch
|
||||
Patch9010: bugfix-Prevent-inserting-a-duplicate-entry-to-avoid-list-ch.patch
|
||||
Patch9011: bugfix-guess_arm_irq_hints.patch
|
||||
Patch9012: feature-add-new-user-irq-policy-config-rule.patch
|
||||
Patch9013: bugfix-make-the-return-value-of-getline-handled-correct.patch
|
||||
Patch9014: bugfix-change-irq-ban-check-path-to-devpath.patch
|
||||
Patch9015: bugfix-fix-new-irqs-in-hotplug-keep-stay-on-one-numa.patch
|
||||
Patch9016: feature-add-the-switch-of-printing-log.patch
|
||||
Patch9017: bugfix-fix-new-msi-irq-hasnot-been-added-to-rebalance-list.patch
|
||||
Patch9018: bugfix-delete-no-existing-banned-irq.patch
|
||||
Patch9019: bugfix-fix-strcat-may-cause-buffer-overrun.patch
|
||||
Patch9020: feature-introduce-verifyhint-to-detect-hint-variation.patch
|
||||
Patch9021: bugfix-fix-memory-leak-of-strdup-in-collect_full_irq_list.patch
|
||||
Patch9022: feature-add-switch-to-clear-affinity-hint.patch
|
||||
Patch9023: feature-add-new-irq-migrate-rule-to-avoid-high-cpu-irq-load.patch
|
||||
Patch9024: bugfix-prevent-version-cmd-need-an-argument.patch
|
||||
Patch9025: feature-encapsulate-and-compile-the-functions-in-irqbalance-ui.patch
|
||||
Patch9026: feature-enable-irqbalance-to-link-with-multiple-clie.patch
|
||||
Patch9027: feature-irqbalance-Add-ability-for-socket-communicat.patch
|
||||
Patch9002: bugfix-force-irq-into-rebalance-list-when-irq-removed-and-reinserted.patch
|
||||
Patch9003: feature-irqbalance-aarch64-add-the-regular-to-get-th.patch
|
||||
Patch9004: feature-irqbalance-auto-banned-pci-assigned-irq.patch
|
||||
Patch9005: feature-supplement-irqbalance-service-config.patch
|
||||
Patch9006: feature-add-new-user-irq-policy-config-rule.patch
|
||||
Patch9007: feature-add-the-switch-of-printing-log.patch
|
||||
Patch9008: feature-introduce-verifyhint-to-detect-hint-variation.patch
|
||||
Patch9009: feature-add-switch-to-clear-affinity-hint.patch
|
||||
Patch9010: feature-encapsulate-and-compile-the-functions-in-irqbalance-ui.patch
|
||||
Patch9011: feature-enable-irqbalance-to-link-with-multiple-clie.patch
|
||||
Patch9012: feature-irqbalance-Add-ability-for-socket-communicat.patch
|
||||
|
||||
%description
|
||||
Irqbalance is a daemon to help balance the cpu load generated by
|
||||
@ -110,8 +104,9 @@ Shared librariy for irqbalanace client
|
||||
%build
|
||||
./autogen.sh
|
||||
%configure
|
||||
CFLAGS="%{optflags}" %make_build CFLAGS+='-fstack-protector-strong -fPIC'
|
||||
CFLAGS="%{optflags}" %make_build CFLAGS+='-fstack-protector-strong '
|
||||
cd ui
|
||||
rm -rf *.o
|
||||
make
|
||||
cd -
|
||||
|
||||
@ -164,6 +159,12 @@ fi
|
||||
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
||||
|
||||
%changelog
|
||||
* Tue Mar 24 2020 Liu chao <liuchao173@huawei.com> - 3:1.4.0-19
|
||||
- Type:bugfix
|
||||
- ID:NA
|
||||
- SUG:restart
|
||||
- DESC:refactor patches
|
||||
|
||||
* Tue Mar 24 2020 Shuaishuai Song <songshuaishuai2@huawei.com> - 3:1.4.0-18
|
||||
- Type:bugfix
|
||||
- ID:NA
|
||||
|
||||
25
make-the-option-V-closer-to-the-option-with-no-arg.patch
Normal file
25
make-the-option-V-closer-to-the-option-with-no-arg.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 7f77fc97cb259da3f6097be347e4fcacd4f864d9 Mon Sep 17 00:00:00 2001
|
||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
||||
Date: Mon, 20 Jan 2020 23:01:19 +0800
|
||||
Subject: [PATCH 29/33] make the option 'V' closer to the option with no arg
|
||||
|
||||
---
|
||||
irqbalance.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index e76d27b..be111f1 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -118,7 +118,7 @@ static void parse_command_line(int argc, char **argv)
|
||||
unsigned long val;
|
||||
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
- "odfji:p:s:c:b:l:m:t:V",
|
||||
+ "odfjVi:p:s:c:b:l:m:t:",
|
||||
lopts, &longind)) != -1) {
|
||||
|
||||
switch(opt) {
|
||||
--
|
||||
2.21.0.windows.1
|
||||
|
||||
@ -59,7 +59,7 @@ diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 18b3ceb..c32c1b2 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -262,7 +262,7 @@ GList* collect_full_irq_list()
|
||||
@@ -236,7 +236,7 @@ GList* collect_full_irq_list()
|
||||
return NULL;
|
||||
|
||||
/* first line is the header we don't need; nuke it */
|
||||
@ -68,7 +68,7 @@ index 18b3ceb..c32c1b2 100644
|
||||
free(line);
|
||||
fclose(file);
|
||||
return NULL;
|
||||
@@ -274,7 +274,7 @@ GList* collect_full_irq_list()
|
||||
@@ -248,7 +248,7 @@ GList* collect_full_irq_list()
|
||||
char *c;
|
||||
char *savedline = NULL;
|
||||
|
||||
@ -77,7 +77,7 @@ index 18b3ceb..c32c1b2 100644
|
||||
break;
|
||||
|
||||
/* lines with letters in front are special, like NMI count. Ignore */
|
||||
@@ -349,7 +349,7 @@ void parse_proc_interrupts(void)
|
||||
@@ -308,7 +308,7 @@ void parse_proc_interrupts(void)
|
||||
return;
|
||||
|
||||
/* first line is the header we don't need; nuke it */
|
||||
@ -86,9 +86,9 @@ index 18b3ceb..c32c1b2 100644
|
||||
free(line);
|
||||
fclose(file);
|
||||
return;
|
||||
@@ -365,7 +365,7 @@ void parse_proc_interrupts(void)
|
||||
@@ -325,7 +325,7 @@ void parse_proc_interrupts(void)
|
||||
struct irq_info *info;
|
||||
char savedline[1024];
|
||||
char dirname[PATH_MAX] = {'\0'};
|
||||
|
||||
- if (getline(&line, &size, file)==0)
|
||||
+ if (getline(&line, &size, file)<=0)
|
||||
58
some-variable-and-judgement-are-unnecessary-in-activ.patch
Normal file
58
some-variable-and-judgement-are-unnecessary-in-activ.patch
Normal file
@ -0,0 +1,58 @@
|
||||
From cfe3d10d37e44be4bb94cb715dbe6fde9e8a60ff Mon Sep 17 00:00:00 2001
|
||||
From: Pyxisha <xiashuang1@huawei.com>
|
||||
Date: Mon, 15 Jul 2019 10:44:50 +0800
|
||||
Subject: [PATCH 01/48] some variable and judgement are unnecessary in
|
||||
activate_mappings
|
||||
|
||||
sign_off_by Shuang Xia <xiashuang1@huawei.com>
|
||||
---
|
||||
activate.c | 15 ++++-----------
|
||||
1 file changed, 4 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/activate.c b/activate.c
|
||||
index 8fd3dd0..8fd9bde 100644
|
||||
--- a/activate.c
|
||||
+++ b/activate.c
|
||||
@@ -60,8 +60,6 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
FILE *file;
|
||||
- cpumask_t applied_mask;
|
||||
- int valid_mask = 0;
|
||||
|
||||
/*
|
||||
* only activate mappings for irqs that have moved
|
||||
@@ -69,18 +67,13 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||
if (!info->moved)
|
||||
return;
|
||||
|
||||
- if (info->assigned_obj) {
|
||||
- applied_mask = info->assigned_obj->mask;
|
||||
- valid_mask = 1;
|
||||
- }
|
||||
+ if (!info->assigned_obj)
|
||||
+ return;
|
||||
|
||||
/*
|
||||
* Don't activate anything for which we have an invalid mask
|
||||
*/
|
||||
- if (!valid_mask || check_affinity(info, applied_mask))
|
||||
- return;
|
||||
-
|
||||
- if (!info->assigned_obj)
|
||||
+ if (check_affinity(info, info->assigned_obj->mask))
|
||||
return;
|
||||
|
||||
sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
|
||||
@@ -88,7 +81,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||
if (!file)
|
||||
return;
|
||||
|
||||
- cpumask_scnprintf(buf, PATH_MAX, applied_mask);
|
||||
+ cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
|
||||
fprintf(file, "%s", buf);
|
||||
fclose(file);
|
||||
info->moved = 0; /*migration is done*/
|
||||
--
|
||||
2.21.0.windows.1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user