Package init
This commit is contained in:
parent
72868d0397
commit
ad917abf90
43
bugfix-delete-no-existing-banned-irq.patch
Normal file
43
bugfix-delete-no-existing-banned-irq.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
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
|
||||||
|
@@ -331,6 +331,13 @@ static int is_banned_irq(int irq)
|
||||||
|
return entry ? 1:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef TEST
|
||||||
|
+int stub_is_banned_irq(int irq)
|
||||||
|
+{
|
||||||
|
+ return is_banned_irq(irq);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
gint substr_find(gconstpointer a, gconstpointer b)
|
||||||
|
{
|
||||||
|
if (strstr(b, a))
|
||||||
|
@@ -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,7 +1,7 @@
|
|||||||
From 2c040ddc5869635598e4fbf5c63217f60fdef5f1 Mon Sep 17 00:00:00 2001
|
From 2c040ddc5869635598e4fbf5c63217f60fdef5f1 Mon Sep 17 00:00:00 2001
|
||||||
From: xiashuang <xiashuang1@huawei.com>
|
From: xiashuang <xiashuang1@huawei.com>
|
||||||
Date: Sun, 17 Mar 2019 18:59:09 -0400
|
Date: Sun, 17 Mar 2019 18:59:09 -0400
|
||||||
Subject: [PATCH 2/4] huawei bugfix fix a hole that flees hotplug event
|
Subject: [PATCH 2/4] bugfix fix a hole that flees hotplug event
|
||||||
|
|
||||||
from 1.0.9, original infoformation is missing
|
from 1.0.9, original infoformation is missing
|
||||||
---
|
---
|
||||||
|
|||||||
@ -0,0 +1,34 @@
|
|||||||
|
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
|
||||||
|
|
||||||
161
bugfix-fix-new-irqs-in-hotplug-keep-stay-on-one-numa.patch
Normal file
161
bugfix-fix-new-irqs-in-hotplug-keep-stay-on-one-numa.patch
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
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;
|
||||||
|
GList *vm_banned_irqs = NULL;
|
||||||
|
+extern int need_add_single;
|
||||||
|
|
||||||
|
pthread_mutex_t cl_banned_list_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
pthread_mutex_t vm_banned_list_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
@@ -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
|
||||||
|
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
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,81 +0,0 @@
|
|||||||
From 384cdfa4ef28415c3df50d1759951a20c6f0661f Mon Sep 17 00:00:00 2001
|
|
||||||
From: caomeng <caomeng5@huawei.com>
|
|
||||||
Date: Thu, 4 Jul 2019 03:47:20 +0800
|
|
||||||
Subject: [PATCH] bugfix-fix-two-same-irq-insert-to-list
|
|
||||||
|
|
||||||
When the function force_rebalance_irq is executed,the same irq may be added into
|
|
||||||
rebalance_irq_list again, resulting in failed irqbalance service. Thus, a function
|
|
||||||
named irq_in_rebalance_list which is used to check if the irq is in rebalance_irq_list
|
|
||||||
will be executed before force_rebalance_irq. And this patch fixex the bug introduced
|
|
||||||
by feature-introduce-verifyhint-to-detect-hint-variation.patch.
|
|
||||||
|
|
||||||
---
|
|
||||||
classify.c | 11 +++++++++++
|
|
||||||
irqbalance.h | 2 +-
|
|
||||||
procinterrupts.c | 8 ++++++--
|
|
||||||
3 files changed, 18 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 0951c72..4d699da 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -288,6 +288,17 @@ static void add_banned_irq(int irq, GList **list)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+int irq_in_rebalance_list(int irq)
|
|
||||||
+{
|
|
||||||
+ GList *entry = NULL;
|
|
||||||
+ struct irq_info find = {0};
|
|
||||||
+
|
|
||||||
+ find.irq = irq;
|
|
||||||
+ entry = g_list_find_custom(rebalance_irq_list, &find, compare_ints);
|
|
||||||
+
|
|
||||||
+ return entry ? 1 : 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void add_cl_banned_irq(int irq)
|
|
||||||
{
|
|
||||||
add_banned_irq(irq, &cl_banned_irqs);
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 80ec017..821de0e 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -107,7 +107,7 @@ 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)));
|
|
||||||
-
|
|
||||||
+int irq_in_rebalance_list(int irq);
|
|
||||||
/* huawei */
|
|
||||||
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);
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index fc4641a..9e38e49 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -348,7 +348,9 @@ void parse_proc_interrupts(void)
|
|
||||||
*/
|
|
||||||
if (count < info->irq_count) {
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "Removed and reinserted IRQ %d added into rebalance list\n", number);
|
|
||||||
- force_rebalance_irq(info, NULL);
|
|
||||||
+ if (!irq_in_rebalance_list(info->irq)) {
|
|
||||||
+ force_rebalance_irq(info, NULL);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
info->last_irq_count = info->irq_count;
|
|
||||||
@@ -602,7 +604,9 @@ void update_affinity_hint(struct irq_info *info, void *data __attribute__((unuse
|
|
||||||
cpumask_parse_user(line, len, current_affinity_hint);
|
|
||||||
if (!cpus_equal(current_affinity_hint, info->affinity_hint)) {
|
|
||||||
cpumask_copy(info->affinity_hint, current_affinity_hint);
|
|
||||||
- force_rebalance_irq(info, data);
|
|
||||||
+ if (!irq_in_rebalance_list(info->irq)) {
|
|
||||||
+ force_rebalance_irq(info, data);
|
|
||||||
+ }
|
|
||||||
log(TO_ALL, LOG_INFO, "IRQ(%d): affinity hint modified\n", info->irq);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
||||||
@ -244,11 +244,10 @@ diff --git a/irqbalance.h b/irqbalance.h
|
|||||||
index 8d5b329..73737ed 100644
|
index 8d5b329..73737ed 100644
|
||||||
--- a/irqbalance.h
|
--- a/irqbalance.h
|
||||||
+++ b/irqbalance.h
|
+++ b/irqbalance.h
|
||||||
@@ -107,6 +107,11 @@ extern void free_cl_opts(void);
|
@@ -107,6 +107,10 @@ extern void free_cl_opts(void);
|
||||||
extern void add_cl_banned_module(char *modname);
|
extern void add_cl_banned_module(char *modname);
|
||||||
#define irq_numa_node(irq) ((irq)->numa_node)
|
#define irq_numa_node(irq) ((irq)->numa_node)
|
||||||
|
|
||||||
+/* huawei */
|
|
||||||
+extern struct irq_info *build_one_dev_entry(const char *dirname, GList *tmp_list);
|
+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 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 struct irq_info *add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
From d57caa98c082fb3bf746b0877aa368544e8e62dc Mon Sep 17 00:00:00 2001
|
From 948425c293615a9f4a30e9049d6ca4380c7b6c83 Mon Sep 17 00:00:00 2001
|
||||||
From: Zengruan Ye <yezengruan@huawei.com>
|
From: hejingxian <hejingxian@huawei.com>
|
||||||
Date: Mon, 15 Jul 2019 21:37:39 +0800
|
Date: Wed, 13 Nov 2019 13:13:28 +0800
|
||||||
Subject: [PATCH 4/6] bugfix: irqbalance: fix wrong pid value in pid file
|
Subject: [PATCH] bugfix: irqbalance: fix wrong pid value in pid file
|
||||||
|
|
||||||
If irqbalance is killed by SIGKILL or SIGTERM,
|
If irqbalance is killed by SIGKILL or SIGTERM,
|
||||||
after restarting irqbalance, the pid in pid file is
|
after restarting irqbalance, the pid in pid file is
|
||||||
@ -13,14 +13,14 @@ been launched.
|
|||||||
|
|
||||||
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
|
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
|
||||||
---
|
---
|
||||||
irqbalance.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
|
irqbalance.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
|
||||||
1 file changed, 73 insertions(+), 8 deletions(-)
|
1 file changed, 75 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
diff --git a/irqbalance.c b/irqbalance.c
|
||||||
index 40ec65c..27cf2eb 100644
|
index 18cd7de..467e968 100644
|
||||||
--- a/irqbalance.c
|
--- a/irqbalance.c
|
||||||
+++ b/irqbalance.c
|
+++ b/irqbalance.c
|
||||||
@@ -584,6 +584,77 @@ int init_socket()
|
@@ -560,6 +560,78 @@ int init_socket()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,11 +94,12 @@ index 40ec65c..27cf2eb 100644
|
|||||||
+ close(lf);
|
+ close(lf);
|
||||||
+ return err;
|
+ return err;
|
||||||
+}
|
+}
|
||||||
|
+
|
||||||
+
|
+
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
struct sigaction action, hupaction;
|
sigset_t sigset, old_sigset;
|
||||||
@@ -709,17 +782,12 @@ int main(int argc, char** argv)
|
@@ -652,17 +724,12 @@ int main(int argc, char** argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foreground_mode) {
|
if (!foreground_mode) {
|
||||||
|
|||||||
@ -9,14 +9,14 @@ for every irq.
|
|||||||
---
|
---
|
||||||
Makefile.am | 2 +-
|
Makefile.am | 2 +-
|
||||||
classify.c | 32 +++++++--
|
classify.c | 32 +++++++--
|
||||||
irqbalance.c | 31 +++++----
|
irqbalance.c | 34 +++++----
|
||||||
irqbalance.h | 2 +-
|
irqbalance.h | 2 +-
|
||||||
misc/irqbalance.service | 2 +-
|
misc/irqbalance.service | 2 +-
|
||||||
placement.c | 3 +-
|
placement.c | 3 +-
|
||||||
procinterrupts.c | 3 +-
|
procinterrupts.c | 3 +-
|
||||||
rules_config.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++++
|
rules_config.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
rules_config.h | 38 +++++++++++
|
rules_config.h | 38 +++++++++++
|
||||||
9 files changed, 260 insertions(+), 23 deletions(-)
|
9 files changed, 263 insertions(+), 23 deletions(-)
|
||||||
create mode 100644 rules_config.c
|
create mode 100644 rules_config.c
|
||||||
create mode 100644 rules_config.h
|
create mode 100644 rules_config.h
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ index 65aeae2..7c97d47 100644
|
|||||||
- get_irq_user_policy(devpath, irqnum, &pol);
|
- get_irq_user_policy(devpath, irqnum, &pol);
|
||||||
+ if (user_policy_list == NULL) {
|
+ if (user_policy_list == NULL) {
|
||||||
+ get_irq_user_policy(devpath, irqnum, &pol);
|
+ get_irq_user_policy(devpath, irqnum, &pol);
|
||||||
+ }
|
+ }
|
||||||
if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_list))) {
|
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;
|
continue;
|
||||||
@ -117,35 +117,35 @@ diff --git a/irqbalance.c b/irqbalance.c
|
|||||||
index 21d578a..d41753c 100644
|
index 21d578a..d41753c 100644
|
||||||
--- a/irqbalance.c
|
--- a/irqbalance.c
|
||||||
+++ b/irqbalance.c
|
+++ b/irqbalance.c
|
||||||
@@ -148,6 +148,7 @@ struct option lopts[] = {
|
@@ -99,6 +99,7 @@ struct option lopts[] = {
|
||||||
|
{"banmod", 1 , NULL, 'm'},
|
||||||
{"interval", 1 , NULL, 't'},
|
{"interval", 1 , NULL, 't'},
|
||||||
{"version", 0, NULL, 'V'},
|
{"version", 0, NULL, 'V'},
|
||||||
{"verifyhint", 1, NULL, 'v'},
|
|
||||||
+ {"rulesconfig", 1, NULL, 'r'},
|
+ {"rulesconfig", 1, NULL, 'r'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -155,7 +156,7 @@ static void usage(void)
|
@@ -106,7 +107,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, " [--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, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>]\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>] [--rulesconfig= | -r <config>]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void version(void)
|
static void version(void)
|
||||||
@@ -170,7 +171,7 @@ static void parse_command_line(int argc, char **argv)
|
@@ -121,7 +122,7 @@ static void parse_command_line(int argc, char **argv)
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
|
||||||
while ((opt = getopt_long(argc, argv,
|
while ((opt = getopt_long(argc, argv,
|
||||||
- "odfji:p:s:c:b:l:m:t:V:h:v:",
|
- "odfji:p:s:c:b:l:m:t:V",
|
||||||
+ "odfji:p:s:c:b:l:m:t:V:h:v:r:",
|
+ "odfji:p:s:c:b:l:m:t:V:r",
|
||||||
lopts, &longind)) != -1) {
|
lopts, &longind)) != -1) {
|
||||||
|
|
||||||
switch(opt) {
|
switch(opt) {
|
||||||
@@ -268,6 +269,9 @@ static void parse_command_line(int argc, char **argv)
|
@@ -201,6 +202,9 @@ static void parse_command_line(int argc, char **argv)
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
reset_verify_countdown();
|
|
||||||
break;
|
break;
|
||||||
+ case 'r':
|
+ case 'r':
|
||||||
+ rules_config_file = strdup(optarg);
|
+ rules_config_file = strdup(optarg);
|
||||||
@ -153,10 +153,10 @@ index 21d578a..d41753c 100644
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -586,6 +590,22 @@ int main(int argc, char** argv)
|
@@ -539,6 +543,21 @@ int main(int argc, char** argv)
|
||||||
|
log(TO_ALL, LOG_WARNING, "Unable to determin HZ defaulting to 100\n");
|
||||||
HZ = 100;
|
HZ = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ if (!foreground_mode) {
|
+ if (!foreground_mode) {
|
||||||
+ if (daemon(0,0)) {
|
+ if (daemon(0,0)) {
|
||||||
+ ret = EXIT_FAILURE;
|
+ ret = EXIT_FAILURE;
|
||||||
@ -172,11 +172,10 @@ index 21d578a..d41753c 100644
|
|||||||
+ if (read_user_policy_config() != 0) {
|
+ if (read_user_policy_config() != 0) {
|
||||||
+ log(TO_ALL, LOG_WARNING, "Read user policy config fail.\n");
|
+ log(TO_ALL, LOG_WARNING, "Read user policy config fail.\n");
|
||||||
+ }
|
+ }
|
||||||
+
|
|
||||||
build_object_tree();
|
build_object_tree();
|
||||||
if (debug_mode)
|
if (debug_mode)
|
||||||
dump_object_tree();
|
@@ -554,16 +573,6 @@ int main(int argc, char** argv)
|
||||||
@@ -600,15 +617,6 @@ int main(int argc, char** argv)
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,18 +188,18 @@ index 21d578a..d41753c 100644
|
|||||||
- goto out;
|
- goto out;
|
||||||
- }
|
- }
|
||||||
- }
|
- }
|
||||||
|
-
|
||||||
action.sa_handler = handler;
|
g_unix_signal_add(SIGINT, handler, NULL);
|
||||||
sigemptyset(&action.sa_mask);
|
g_unix_signal_add(SIGTERM, handler, NULL);
|
||||||
@@ -640,7 +649,7 @@ int main(int argc, char** argv)
|
g_unix_signal_add(SIGUSR1, handler, NULL);
|
||||||
ret = EXIT_FAILURE;
|
@@ -589,6 +598,7 @@ int main(int argc, char** argv)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
-
|
|
||||||
+ log(TO_ALL, LOG_INFO, "irqbalance start scan.\n");
|
+ log(TO_ALL, LOG_INFO, "irqbalance start scan.\n");
|
||||||
while (keep_going) {
|
main_loop = g_main_loop_new(NULL, FALSE);
|
||||||
cond_sleep();
|
int *last_interval = &sleep_interval;
|
||||||
|
g_timeout_add_seconds(sleep_interval, scan, last_interval);
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
diff --git a/irqbalance.h b/irqbalance.h
|
||||||
index 120bc9b..42f95cb 100644
|
index 120bc9b..42f95cb 100644
|
||||||
--- a/irqbalance.h
|
--- a/irqbalance.h
|
||||||
@ -250,7 +249,7 @@ index 60b2545..18b3ceb 100644
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
- info->name = strdupa(irq_mod);
|
- info->name = strdupa(irq_mod);
|
||||||
+
|
+
|
||||||
+ info->name = strdup(irq_mod);
|
+ info->name = strdup(irq_mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
123
feature-add-switch-to-clear-affinity-hint.patch
Normal file
123
feature-add-switch-to-clear-affinity-hint.patch
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
From e44eed4faef6ee1bd1ae41dd27a8513d37681f7f Mon Sep 17 00:00:00 2001
|
||||||
|
From: liuchao <liuchao173@huawei.com>
|
||||||
|
Date: Tue, 17 Dec 2019 02:54:57 +0000
|
||||||
|
Subject: [PATCH] add switch to clear affinity hint
|
||||||
|
|
||||||
|
All irqs' affinity hints are cleared in update_affinity_hint and forced
|
||||||
|
to rebalance. In some scenarios, it will affect performance.
|
||||||
|
---
|
||||||
|
hint_verify.c | 26 +++++++++++++++++++++++++-
|
||||||
|
irqbalance.c | 10 ++++++++--
|
||||||
|
2 files changed, 33 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hint_verify.c b/hint_verify.c
|
||||||
|
index 0718078..11ef868 100644
|
||||||
|
--- a/hint_verify.c
|
||||||
|
+++ b/hint_verify.c
|
||||||
|
@@ -16,6 +16,7 @@ extern int keep_going;
|
||||||
|
extern GMainLoop *main_loop;
|
||||||
|
extern gboolean scan();
|
||||||
|
extern int last_interval;
|
||||||
|
+extern int clear_affinity_hint;
|
||||||
|
|
||||||
|
int real_sleep_interval;
|
||||||
|
int sleep_interval_count;
|
||||||
|
@@ -57,7 +58,8 @@ void update_affinity_hint(struct irq_info *info, void *data __attribute__((unuse
|
||||||
|
if (!hint_enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- cpus_clear(info->affinity_hint);
|
||||||
|
+ if (clear_affinity_hint)
|
||||||
|
+ cpus_clear(info->affinity_hint);
|
||||||
|
sprintf(path, "/proc/irq/%d/affinity_hint", info->irq);
|
||||||
|
file = fopen(path, "r");
|
||||||
|
if (!file)
|
||||||
|
@@ -80,6 +82,27 @@ void update_affinity_hint(struct irq_info *info, void *data __attribute__((unuse
|
||||||
|
free(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void check_clear()
|
||||||
|
+{
|
||||||
|
+ char *line = NULL;
|
||||||
|
+ size_t size = 0;
|
||||||
|
+ FILE *file;
|
||||||
|
+
|
||||||
|
+ file = fopen("/etc/sysconfig/irqbalance_clear", "r");
|
||||||
|
+ if (!file)
|
||||||
|
+ return;
|
||||||
|
+ if (getline(&line, &size, file) <= 0)
|
||||||
|
+ goto out;
|
||||||
|
+ if (line != NULL && strstr(line, "0") != NULL)
|
||||||
|
+ clear_affinity_hint = 0;
|
||||||
|
+ else
|
||||||
|
+ clear_affinity_hint = 1;
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ fclose(file);
|
||||||
|
+ free(line);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* This function is the main loop of irqbalance, which include:
|
||||||
|
* 1. scan opration for irq balancing;
|
||||||
|
@@ -104,6 +127,7 @@ gboolean poll_hint_affinity_and_scan(gpointer data __attribute__((unused)))
|
||||||
|
sleep_count++;
|
||||||
|
|
||||||
|
if (need_verify_flag && hint_changed()) {
|
||||||
|
+ check_clear();
|
||||||
|
for_each_irq(NULL, update_affinity_hint, NULL);
|
||||||
|
if (hint_has_changed) {
|
||||||
|
hint_has_changed = FALSE;
|
||||||
|
diff --git a/irqbalance.c b/irqbalance.c
|
||||||
|
index 05eaa29..77076fa 100644
|
||||||
|
--- a/irqbalance.c
|
||||||
|
+++ b/irqbalance.c
|
||||||
|
@@ -55,6 +55,7 @@ int foreground_mode;
|
||||||
|
int numa_avail;
|
||||||
|
int journal_logging = 0;
|
||||||
|
int need_rescan;
|
||||||
|
+int clear_affinity_hint = 1;
|
||||||
|
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'},
|
||||||
|
{"rulesconfig", 1, NULL, 'r'},
|
||||||
|
+ {"notclearhint", 0, NULL, 'n'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
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] [--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");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void version(void)
|
||||||
|
@@ -126,7 +128,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:",
|
||||||
|
+ "odfji:p:s:c:b:l:m:t:V:h:v:r:n",
|
||||||
|
lopts, &longind)) != -1) {
|
||||||
|
|
||||||
|
switch(opt) {
|
||||||
|
@@ -225,6 +227,10 @@ static void parse_command_line(int argc, char **argv)
|
||||||
|
case 'r':
|
||||||
|
rules_config_file = strdup(optarg);
|
||||||
|
break;
|
||||||
|
+ case 'n':
|
||||||
|
+ clear_affinity_hint = 0;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
From 6f90062816b218809dc5d1e06ac7e0f7198368d6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: hejingxian <hejingxian@huawei.com>
|
||||||
|
Date: Sun, 10 Nov 2019 17:24:43 +0800
|
||||||
|
Subject: [PATCH] Add test interfaces for irqbalance core functions
|
||||||
|
|
||||||
|
There exists some core functions which can't be called by llt. Therefore,
|
||||||
|
we add external functions for user calling the core functions.
|
||||||
|
---
|
||||||
|
classify.c | 7 +++++++
|
||||||
|
procinterrupts.c | 34 ++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 41 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/classify.c b/classify.c
|
||||||
|
index 3921710..5aed9e5 100644
|
||||||
|
--- a/classify.c
|
||||||
|
+++ b/classify.c
|
||||||
|
@@ -1068,3 +1068,10 @@ int is_pci_assigned_irq(const char *line)
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#ifdef TEST
|
||||||
|
+void get_irq_user_policy_test(char *path, int irq, struct user_irq_policy *pol)
|
||||||
|
+{
|
||||||
|
+ get_irq_user_policy(path, irq, pol);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||||
|
index 59df6d7..cd99f35 100644
|
||||||
|
--- a/procinterrupts.c
|
||||||
|
+++ b/procinterrupts.c
|
||||||
|
@@ -148,6 +148,18 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef TEST
|
||||||
|
+void guess_arm_irq_hints_test(char *name, struct irq_info *info)
|
||||||
|
+{
|
||||||
|
+ guess_arm_irq_hints(name, info);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int check_platform_device_test(char *name, struct irq_info *info)
|
||||||
|
+{
|
||||||
|
+ return check_platform_device(name, info);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
@@ -674,3 +686,25 @@ void parse_proc_stat(void)
|
||||||
|
for_each_object(numa_nodes, compute_irq_branch_load_share, NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#ifdef TEST
|
||||||
|
+void init_irq_class_and_type_test(char *savedline, struct irq_info *info, int irq)
|
||||||
|
+{
|
||||||
|
+ init_irq_class_and_type(savedline, info, irq);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void set_load_test(struct topo_obj *d, void *data __attribute__((unused)))
|
||||||
|
+{
|
||||||
|
+ set_load(d, data);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void compute_irq_branch_load_share_test(struct topo_obj *d, void *data __attribute__((unused)))
|
||||||
|
+{
|
||||||
|
+ compute_irq_branch_load_share(d, data);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void accumulate_interrupts_test(struct topo_obj *d, void *data __attribute__((unused)))
|
||||||
|
+{
|
||||||
|
+ accumulate_interrupts(d, data);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
114
feature-add-the-switch-of-printing-log.patch
Normal file
114
feature-add-the-switch-of-printing-log.patch
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
From b697a97436dafa13f0ae3febde299bfc20498f9d Mon Sep 17 00:00:00 2001
|
||||||
|
From: liuchao173 <liuchao173@huawei.com>
|
||||||
|
Date: Wed, 23 Oct 2019 11:42:26 +0000
|
||||||
|
Subject: [PATCH] irqbalance: add the switch of printing log
|
||||||
|
|
||||||
|
add the switch of printing log
|
||||||
|
---
|
||||||
|
cputree.c | 16 ++++++++--------
|
||||||
|
irqbalance.c | 25 +++++++++++++++++++++++++-
|
||||||
|
2 files changed, 32 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/cputree.c b/cputree.c
|
||||||
|
index 99f14d2..1465103 100644
|
||||||
|
--- a/cputree.c
|
||||||
|
+++ b/cputree.c
|
||||||
|
@@ -432,23 +432,23 @@ static void dump_irq(struct irq_info *info, void *data)
|
||||||
|
indent[i] = log_indent[0];
|
||||||
|
|
||||||
|
indent[i] = '\0';
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "%sInterrupt %i node_num is %d (%s/%lu:%lu) \n", indent,
|
||||||
|
+ log(TO_ALL, LOG_INFO, "%sInterrupt %i node_num is %d (%s/%lu:%lu) \n", indent,
|
||||||
|
info->irq, irq_numa_node(info)->number, classes[info->class], info->load, (info->irq_count - info->last_irq_count));
|
||||||
|
free(indent);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_numa_node_num(struct topo_obj *p, void *data __attribute__((unused)))
|
||||||
|
{
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "%d ", p->number);
|
||||||
|
+ log(TO_ALL, LOG_INFO, "%d ", p->number);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_balance_obj(struct topo_obj *d, void *data __attribute__((unused)))
|
||||||
|
{
|
||||||
|
struct topo_obj *c = (struct topo_obj *)d;
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "%s%s%s%sCPU number %i numa_node is ",
|
||||||
|
+ log(TO_ALL, LOG_INFO, "%s%s%s%sCPU number %i numa_node is ",
|
||||||
|
log_indent, log_indent, log_indent, log_indent, c->number);
|
||||||
|
for_each_object(cpu_numa_node(c), dump_numa_node_num, NULL);
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "(load %lu)\n", (unsigned long)c->load);
|
||||||
|
+ log(TO_ALL, LOG_INFO, "(load %lu)\n", (unsigned long)c->load);
|
||||||
|
if (c->interrupts)
|
||||||
|
for_each_irq(c->interrupts, dump_irq, (void *)18);
|
||||||
|
}
|
||||||
|
@@ -457,10 +457,10 @@ static void dump_cache_domain(struct topo_obj *d, void *data)
|
||||||
|
{
|
||||||
|
char *buffer = data;
|
||||||
|
cpumask_scnprintf(buffer, 4095, d->mask);
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "%s%sCache domain %i: numa_node is ",
|
||||||
|
+ log(TO_ALL, LOG_INFO, "%s%sCache domain %i: numa_node is ",
|
||||||
|
log_indent, log_indent, d->number);
|
||||||
|
for_each_object(d->numa_nodes, dump_numa_node_num, NULL);
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "cpu mask is %s (load %lu) \n", buffer,
|
||||||
|
+ log(TO_ALL, LOG_INFO, "cpu mask is %s (load %lu) \n", buffer,
|
||||||
|
(unsigned long)d->load);
|
||||||
|
if (d->children)
|
||||||
|
for_each_object(d->children, dump_balance_obj, NULL);
|
||||||
|
@@ -472,9 +472,9 @@ static void dump_package(struct topo_obj *d, void *data)
|
||||||
|
{
|
||||||
|
char *buffer = data;
|
||||||
|
cpumask_scnprintf(buffer, 4096, d->mask);
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "Package %i: numa_node ", d->number);
|
||||||
|
+ log(TO_ALL, LOG_INFO, "Package %i: numa_node ", d->number);
|
||||||
|
for_each_object(d->numa_nodes, dump_numa_node_num, NULL);
|
||||||
|
- log(TO_CONSOLE, LOG_INFO, "cpu mask is %s (load %lu)\n",
|
||||||
|
+ log(TO_ALL, LOG_INFO, "cpu mask is %s (load %lu)\n",
|
||||||
|
buffer, (unsigned long)d->load);
|
||||||
|
if (d->children)
|
||||||
|
for_each_object(d->children, dump_cache_domain, buffer);
|
||||||
|
diff --git a/irqbalance.c b/irqbalance.c
|
||||||
|
index d41753c..7d8d15c 100644
|
||||||
|
--- a/irqbalance.c
|
||||||
|
+++ b/irqbalance.c
|
||||||
|
@@ -273,6 +273,29 @@ gboolean force_rescan(gpointer data __attribute__((unused)))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int check_debug()
|
||||||
|
+{
|
||||||
|
+ char *line = NULL;
|
||||||
|
+ size_t size = 0;
|
||||||
|
+ FILE *file;
|
||||||
|
+
|
||||||
|
+ file = fopen("/etc/sysconfig/irqbalance_debug", "r");
|
||||||
|
+ if (!file)
|
||||||
|
+ return 0;
|
||||||
|
+ if (getline(&line, &size, file) <= 0) {
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ if (line != NULL && strstr(line, "1") != NULL) {
|
||||||
|
+ fclose(file);
|
||||||
|
+ free(line);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+out:
|
||||||
|
+ fclose(file);
|
||||||
|
+ free(line);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
gboolean scan(gpointer data)
|
||||||
|
{
|
||||||
|
log(TO_CONSOLE, LOG_INFO, "\n\n\n-----------------------------------------------------------------------------\n");
|
||||||
|
@@ -305,7 +328,7 @@ gboolean scan(gpointer data)
|
||||||
|
calculate_placement();
|
||||||
|
activate_mappings();
|
||||||
|
|
||||||
|
- if (debug_mode)
|
||||||
|
+ if (debug_mode || check_debug())
|
||||||
|
dump_tree();
|
||||||
|
if (one_shot_mode)
|
||||||
|
keep_going = 0;
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
@ -1,26 +1,43 @@
|
|||||||
From 8541a67cdc3cbaf5c6ed04e9a3b3e2c3f584cb33 Mon Sep 17 00:00:00 2001
|
From e5b83ac140634830b8f8d9ca8d40a1d9d16d2d5b Mon Sep 17 00:00:00 2001
|
||||||
From: xiahuang <xiashuang1@huawei.com>
|
From: hejingxian <hejingxian@huawei.com>
|
||||||
Date: Thu, 21 Mar 2019 19:08:17 -0400
|
Date: Tue, 12 Nov 2019 15:29:16 +0800
|
||||||
Subject: [PATCH 2/2]
|
Subject: [PATCH] feature: introduce affinity hint verify to detect user hint variation
|
||||||
feature-introduce-verifyhint-to-detect-hint-variation
|
|
||||||
|
|
||||||
adapt by xiashuang xiashuang1@huawei.com when upgrade to 1.4.0
|
In order to make the user affinity hint becomes effective quickly,
|
||||||
|
introduce the periodically affinity hint verify.
|
||||||
---
|
---
|
||||||
activate.c | 24 +++++-----
|
Makefile.am | 2 +-
|
||||||
classify.c | 18 ++++++--
|
activate.c | 24 +++++------
|
||||||
cpumask.h | 7 +++
|
classify.c | 18 ++++++--
|
||||||
irqbalance.c | 135 +++++++++++++++++++++++++++++++++++++++++++------------
|
cpumask.h | 7 +++
|
||||||
irqbalance.h | 5 +++
|
hint_verify.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
placement.c | 14 ++++++
|
hint_verify.h | 19 +++++++++
|
||||||
procinterrupts.c | 57 +++++++++++++++++++++++
|
irqbalance.c | 39 +++++++++++------
|
||||||
types.h | 1 +
|
irqbalance.h | 4 ++
|
||||||
8 files changed, 217 insertions(+), 44 deletions(-)
|
placement.c | 14 ++++++
|
||||||
|
types.h | 1 +
|
||||||
|
10 files changed, 246 insertions(+), 29 deletions(-)
|
||||||
|
create mode 100644 hint_verify.c
|
||||||
|
create mode 100644 hint_verify.h
|
||||||
|
|
||||||
|
diff --git a/Makefile.am b/Makefile.am
|
||||||
|
index 9276bfb..5fac265 100644
|
||||||
|
--- a/Makefile.am
|
||||||
|
+++ b/Makefile.am
|
||||||
|
@@ -38,7 +38,7 @@ sbin_PROGRAMS += irqbalance-ui
|
||||||
|
endif
|
||||||
|
|
||||||
|
irqbalance_SOURCES = activate.c bitmap.c classify.c cputree.c irqbalance.c \
|
||||||
|
- irqlist.c numa.c placement.c procinterrupts.c sockapi.c rules_config.c
|
||||||
|
+ irqlist.c numa.c placement.c procinterrupts.c sockapi.c rules_config.c hint_verify.c
|
||||||
|
irqbalance_LDADD = $(LIBCAP_NG_LIBS) $(GLIB2_LIBS) -lpthread
|
||||||
|
if IRQBALANCEUI
|
||||||
|
irqbalance_ui_SOURCES = $(UI_DIR)/helpers.c $(UI_DIR)/irqbalance-ui.c \
|
||||||
diff --git a/activate.c b/activate.c
|
diff --git a/activate.c b/activate.c
|
||||||
index 8fd3dd0..1c4b867 100644
|
index d9e1fc3..87336f4 100644
|
||||||
--- a/activate.c
|
--- a/activate.c
|
||||||
+++ b/activate.c
|
+++ b/activate.c
|
||||||
@@ -61,26 +61,26 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
@@ -88,26 +88,26 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
FILE *file;
|
FILE *file;
|
||||||
cpumask_t applied_mask;
|
cpumask_t applied_mask;
|
||||||
@ -60,10 +77,10 @@ index 8fd3dd0..1c4b867 100644
|
|||||||
|
|
||||||
sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
|
sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
|
||||||
diff --git a/classify.c b/classify.c
|
diff --git a/classify.c b/classify.c
|
||||||
index 30a8d2a..aa391f4 100644
|
index 5aed9e5..75677f4 100644
|
||||||
--- a/classify.c
|
--- a/classify.c
|
||||||
+++ b/classify.c
|
+++ b/classify.c
|
||||||
@@ -66,8 +66,6 @@ struct pci_info {
|
@@ -71,8 +71,6 @@ struct pci_info {
|
||||||
#define PCI_SUB_DEVICE_EMC_0568 0x0568
|
#define PCI_SUB_DEVICE_EMC_0568 0x0568
|
||||||
#define PCI_SUB_DEVICE_EMC_dd00 0xdd00
|
#define PCI_SUB_DEVICE_EMC_dd00 0xdd00
|
||||||
|
|
||||||
@ -72,7 +89,7 @@ index 30a8d2a..aa391f4 100644
|
|||||||
/*
|
/*
|
||||||
* Apply software workarounds for some special devices
|
* Apply software workarounds for some special devices
|
||||||
*
|
*
|
||||||
@@ -414,7 +412,7 @@ get_numa_node:
|
@@ -448,7 +446,7 @@ get_numa_node:
|
||||||
fd = fopen(path, "r");
|
fd = fopen(path, "r");
|
||||||
if (!fd) {
|
if (!fd) {
|
||||||
cpus_setall(new->cpumask);
|
cpus_setall(new->cpumask);
|
||||||
@ -81,7 +98,7 @@ index 30a8d2a..aa391f4 100644
|
|||||||
}
|
}
|
||||||
lcpu_mask = NULL;
|
lcpu_mask = NULL;
|
||||||
ret = getline(&lcpu_mask, &blen, fd);
|
ret = getline(&lcpu_mask, &blen, fd);
|
||||||
@@ -426,6 +424,20 @@ get_numa_node:
|
@@ -460,6 +458,20 @@ get_numa_node:
|
||||||
}
|
}
|
||||||
free(lcpu_mask);
|
free(lcpu_mask);
|
||||||
|
|
||||||
@ -127,318 +144,42 @@ index 0774a88..8dd3703 100644
|
|||||||
#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS)
|
#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS)
|
||||||
static inline int __cpus_equal(const cpumask_t *src1p,
|
static inline int __cpus_equal(const cpumask_t *src1p,
|
||||||
const cpumask_t *src2p, int nbits)
|
const cpumask_t *src2p, int nbits)
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
diff --git a/hint_verify.c b/hint_verify.c
|
||||||
index e375a1a..bf9a2e4 100644
|
new file mode 100644
|
||||||
--- a/irqbalance.c
|
index 0000000..7a904b0
|
||||||
+++ b/irqbalance.c
|
--- /dev/null
|
||||||
@@ -61,10 +61,38 @@ char *banscript = NULL;
|
+++ b/hint_verify.c
|
||||||
char *polscript = NULL;
|
@@ -0,0 +1,147 @@
|
||||||
long HZ;
|
+/*
|
||||||
int sleep_interval = SLEEP_INTERVAL;
|
+ * Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved.
|
||||||
-GMainLoop *main_loop;
|
+ *
|
||||||
+int hint_enabled = 0;
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
+int poll_hint_interval = SLEEP_INTERVAL / 5;
|
+ * it under the terms of the MuLan PSL v1.
|
||||||
+unsigned int next_verify, next_balance;
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
char *banned_cpumask_from_ui = NULL;
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MuLan PSL v1 for more details.
|
||||||
+static inline void reset_verify_countdown(void)
|
+ */
|
||||||
+{
|
+#include <stdio.h>
|
||||||
+ next_verify = poll_hint_interval;
|
+#include <stdlib.h>
|
||||||
+}
|
+#include "irqbalance.h"
|
||||||
+
|
+
|
||||||
+static inline void reset_balance_countdown(void)
|
+extern int keep_going;
|
||||||
+{
|
+extern GMainLoop *main_loop;
|
||||||
+ next_balance = sleep_interval;
|
+extern gboolean scan();
|
||||||
+}
|
|
||||||
+
|
+
|
||||||
+static inline int need_verify(void)
|
+int real_sleep_interval;
|
||||||
+{
|
+int sleep_interval_count;
|
||||||
+ return !(poll_hint_interval - next_verify);
|
+int poll_hint_interval_count;
|
||||||
+}
|
+int sleep_count = 0;
|
||||||
+
|
+gboolean hint_has_changed = FALSE;
|
||||||
+static inline int need_balance(void)
|
|
||||||
+{
|
|
||||||
+ return !(sleep_interval - next_balance);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline void reset_countdown(void)
|
|
||||||
+{
|
|
||||||
+ reset_verify_countdown();
|
|
||||||
+ reset_balance_countdown();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void sleep_approx(int seconds)
|
|
||||||
{
|
|
||||||
struct timespec ts;
|
|
||||||
@@ -79,6 +107,26 @@ static void sleep_approx(int seconds)
|
|
||||||
nanosleep(&ts, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void cond_sleep(void)
|
|
||||||
+{
|
|
||||||
+ unsigned int timeout;
|
|
||||||
+
|
|
||||||
+ if (next_verify < next_balance) {
|
|
||||||
+ timeout = next_verify;
|
|
||||||
+ next_balance -= timeout;
|
|
||||||
+ reset_verify_countdown();
|
|
||||||
+ } else if (next_verify > next_balance) {
|
|
||||||
+ timeout = next_balance;
|
|
||||||
+ next_verify -= timeout;
|
|
||||||
+ reset_balance_countdown();
|
|
||||||
+ } else {
|
|
||||||
+ timeout = next_verify;
|
|
||||||
+ reset_countdown();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ sleep_approx(timeout);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#ifdef HAVE_GETOPT_LONG
|
|
||||||
struct option lopts[] = {
|
|
||||||
{"oneshot", 0, NULL, 'o'},
|
|
||||||
@@ -95,14 +143,15 @@ struct option lopts[] = {
|
|
||||||
{"banmod", 1 , NULL, 'm'},
|
|
||||||
{"interval", 1 , NULL, 't'},
|
|
||||||
{"version", 0, NULL, 'V'},
|
|
||||||
+ {"verifyhint", 1, NULL, 'v'},
|
|
||||||
{0, 0, 0, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
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, "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>]\n");
|
|
||||||
+ log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--verifyhint= | -v n]\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void version(void)
|
|
||||||
@@ -117,7 +166,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:h:v:",
|
|
||||||
lopts, &longind)) != -1) {
|
|
||||||
|
|
||||||
switch(opt) {
|
|
||||||
@@ -190,12 +239,30 @@ static void parse_command_line(int argc, char **argv)
|
|
||||||
journal_logging=1;
|
|
||||||
foreground_mode=1;
|
|
||||||
break;
|
|
||||||
- case 't':
|
|
||||||
+ case 't':
|
|
||||||
sleep_interval = strtol(optarg, NULL, 10);
|
|
||||||
if (sleep_interval < 1) {
|
|
||||||
usage();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
+ reset_balance_countdown();
|
|
||||||
+ break;
|
|
||||||
+ case 'h':
|
|
||||||
+ if (!strncmp(optarg, "subset", strlen(optarg)))
|
|
||||||
+ hint_enabled = 1;
|
|
||||||
+ else {
|
|
||||||
+ usage();
|
|
||||||
+ exit(1);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ break;
|
|
||||||
+ case 'v':
|
|
||||||
+ poll_hint_interval = strtol(optarg, NULL, 10);
|
|
||||||
+ if (poll_hint_interval < 1) {
|
|
||||||
+ usage();
|
|
||||||
+ exit(1);
|
|
||||||
+ }
|
|
||||||
+ reset_verify_countdown();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -251,21 +318,18 @@ void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused
|
|
||||||
info->assigned_obj = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
-gboolean handler(gpointer data __attribute__((unused)))
|
|
||||||
+void handler(int signum __attribute__((unused)))
|
|
||||||
{
|
|
||||||
keep_going = 0;
|
|
||||||
- g_main_loop_quit(main_loop);
|
|
||||||
- return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
-gboolean force_rescan(gpointer data __attribute__((unused)))
|
|
||||||
+void force_rescan(int signum __attribute__((unused)))
|
|
||||||
{
|
|
||||||
if (cycle_count)
|
|
||||||
need_rescan = 1;
|
|
||||||
- return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
-gboolean scan(gpointer data)
|
|
||||||
+gboolean scan()
|
|
||||||
{
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "\n\n\n-----------------------------------------------------------------------------\n");
|
|
||||||
clear_work_stats();
|
|
||||||
@@ -276,7 +340,7 @@ gboolean scan(gpointer data)
|
|
||||||
if (need_rescan) {
|
|
||||||
need_rescan = 0;
|
|
||||||
cycle_count = 0;
|
|
||||||
- log(TO_CONSOLE, LOG_INFO, "Rescanning cpu topology \n");
|
|
||||||
+ reset_countdown();
|
|
||||||
clear_work_stats();
|
|
||||||
|
|
||||||
free_object_tree();
|
|
||||||
@@ -303,16 +367,9 @@ gboolean scan(gpointer data)
|
|
||||||
keep_going = 0;
|
|
||||||
cycle_count++;
|
|
||||||
|
|
||||||
- if (data != &sleep_interval) {
|
|
||||||
- data = &sleep_interval;
|
|
||||||
- g_timeout_add_seconds(sleep_interval, scan, data);
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
if (keep_going) {
|
|
||||||
return TRUE;
|
|
||||||
} else {
|
|
||||||
- g_main_loop_quit(main_loop);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -501,6 +558,7 @@ int init_socket(char *socket_name)
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
+ struct sigaction action, hupaction;
|
|
||||||
sigset_t sigset, old_sigset;
|
|
||||||
int ret = EXIT_SUCCESS;
|
|
||||||
|
|
||||||
@@ -600,11 +658,19 @@ int main(int argc, char** argv)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- g_unix_signal_add(SIGINT, handler, NULL);
|
|
||||||
- g_unix_signal_add(SIGTERM, handler, NULL);
|
|
||||||
- g_unix_signal_add(SIGUSR1, handler, NULL);
|
|
||||||
- g_unix_signal_add(SIGUSR2, handler, NULL);
|
|
||||||
- g_unix_signal_add(SIGHUP, force_rescan, NULL);
|
|
||||||
+ action.sa_handler = handler;
|
|
||||||
+ sigemptyset(&action.sa_mask);
|
|
||||||
+ action.sa_flags = 0;
|
|
||||||
+ sigaction(SIGINT, &action, NULL);
|
|
||||||
+ sigaction(SIGTERM, &action, NULL);
|
|
||||||
+ sigaction(SIGUSR1, &action, NULL);
|
|
||||||
+ sigaction(SIGUSR2, &action, NULL);
|
|
||||||
+
|
|
||||||
+ hupaction.sa_handler = force_rescan;
|
|
||||||
+ sigemptyset(&hupaction.sa_mask);
|
|
||||||
+ hupaction.sa_flags = 0;
|
|
||||||
+ sigaction(SIGHUP, &hupaction, NULL);
|
|
||||||
+
|
|
||||||
sigprocmask(SIG_SETMASK, &old_sigset, NULL);
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBCAP_NG
|
|
||||||
@@ -625,12 +691,23 @@ int main(int argc, char** argv)
|
|
||||||
ret = EXIT_FAILURE;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
- main_loop = g_main_loop_new(NULL, FALSE);
|
|
||||||
- int *last_interval = &sleep_interval;
|
|
||||||
- g_timeout_add_seconds(sleep_interval, scan, last_interval);
|
|
||||||
- g_main_loop_run(main_loop);
|
|
||||||
|
|
||||||
- g_main_loop_quit(main_loop);
|
|
||||||
+ while (keep_going) {
|
|
||||||
+ cond_sleep();
|
|
||||||
+
|
|
||||||
+ if (need_verify() && hint_changed()) {
|
|
||||||
+ for_each_irq(NULL, update_affinity_hint, NULL);
|
|
||||||
+ reset_countdown();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!need_balance()) {
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!scan()) {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
|
|
||||||
out:
|
|
||||||
free_object_tree();
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 73737ed..b8141aa 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -106,12 +106,17 @@ 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)));
|
|
||||||
|
|
||||||
/* huawei */
|
|
||||||
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 update_affinity_hint(struct irq_info *info, void *data __attribute__((unused)));
|
|
||||||
+extern int hint_changed(void);
|
|
||||||
+
|
|
||||||
+extern int hint_enabled, poll_hint_interval;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generic object functions
|
|
||||||
diff --git a/placement.c b/placement.c
|
|
||||||
index 5a82111..2085e09 100644
|
|
||||||
--- a/placement.c
|
|
||||||
+++ b/placement.c
|
|
||||||
@@ -41,6 +41,7 @@ static void find_best_object(struct topo_obj *d, void *data)
|
|
||||||
{
|
|
||||||
struct obj_placement *best = (struct obj_placement *)data;
|
|
||||||
uint64_t newload;
|
|
||||||
+ cpumask_t subset;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't consider the unspecified numa node here
|
|
||||||
@@ -59,6 +60,19 @@ static void find_best_object(struct topo_obj *d, void *data)
|
|
||||||
if (d->powersave_mode)
|
|
||||||
return;
|
|
||||||
|
|
||||||
+ /*
|
|
||||||
+ * If the hint feature is enabled, then we only want
|
|
||||||
+ * to consider objects that are within the irqs hint, but
|
|
||||||
+ * only if that irq in fact has published a hint
|
|
||||||
+ */
|
|
||||||
+ if (hint_enabled) {
|
|
||||||
+ if (!cpus_empty(best->info->affinity_hint)) {
|
|
||||||
+ cpus_and(subset, best->info->affinity_hint, d->mask);
|
|
||||||
+ if (cpus_empty(subset))
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
newload = d->load;
|
|
||||||
if (newload < best->best_cost) {
|
|
||||||
best->best = d;
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index d384860..b446c55 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -544,3 +544,60 @@ void parse_proc_stat(void)
|
|
||||||
for_each_object(numa_nodes, compute_irq_branch_load_share, NULL);
|
|
||||||
|
|
||||||
}
|
|
||||||
+
|
+
|
||||||
+int hint_changed(void)
|
+int hint_changed(void)
|
||||||
+{
|
+{
|
||||||
+ FILE *file;
|
+ FILE *file;
|
||||||
+ char *line = NULL;
|
+ char *line = NULL;
|
||||||
+ size_t size = 0;
|
+ size_t size = 0;
|
||||||
+ int changed = 0;
|
+ gboolean changed = FALSE;
|
||||||
+
|
+
|
||||||
+ file = fopen("/proc/irq/affinity_hint_notify", "r+");
|
+ file = fopen("/proc/irq/affinity_hint_notify", "r+");
|
||||||
+ if (!file)
|
+ if (!file)
|
||||||
@ -446,7 +187,7 @@ index d384860..b446c55 100644
|
|||||||
+
|
+
|
||||||
+ if (getline(&line, &size, file) > 0 && *line != '0') {
|
+ if (getline(&line, &size, file) > 0 && *line != '0') {
|
||||||
+ fprintf(file, "Done");
|
+ fprintf(file, "Done");
|
||||||
+ changed = 1;
|
+ changed = TRUE;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ fclose(file);
|
+ fclose(file);
|
||||||
@ -481,7 +222,8 @@ index d384860..b446c55 100644
|
|||||||
+ if (!cpus_equal(current_affinity_hint, info->affinity_hint)) {
|
+ if (!cpus_equal(current_affinity_hint, info->affinity_hint)) {
|
||||||
+ cpumask_copy(info->affinity_hint, current_affinity_hint);
|
+ cpumask_copy(info->affinity_hint, current_affinity_hint);
|
||||||
+ force_rebalance_irq(info, data);
|
+ force_rebalance_irq(info, data);
|
||||||
+ log(TO_ALL, LOG_INFO, "IRQ(%d): affinity hint modified\n", info->irq);
|
+ hint_has_changed = TRUE;
|
||||||
|
+ log(TO_ALL, LOG_INFO, "IRQ(%d): affinity hint modified %s\n", info->irq, line);
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
@ -489,11 +231,266 @@ index d384860..b446c55 100644
|
|||||||
+ free(line);
|
+ free(line);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
|
+/*
|
||||||
|
+ * This function is the main loop of irqbalance, which include:
|
||||||
|
+ * 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 need_verify_flag = FALSE;
|
||||||
|
+ gboolean need_scan_flag = FALSE;
|
||||||
|
+
|
||||||
|
+ if (!sleep_interval_count)
|
||||||
|
+ sleep_interval_count = 1;
|
||||||
|
+ if (!poll_hint_interval_count)
|
||||||
|
+ poll_hint_interval_count = 1;
|
||||||
|
+
|
||||||
|
+ if (sleep_count % sleep_interval_count == 0) {
|
||||||
|
+ need_scan_flag = TRUE;
|
||||||
|
+ }
|
||||||
|
+ if (sleep_count % poll_hint_interval_count == 0) {
|
||||||
|
+ need_verify_flag = TRUE;
|
||||||
|
+ }
|
||||||
|
+ sleep_count++;
|
||||||
|
+
|
||||||
|
+ if (need_verify_flag && hint_changed()) {
|
||||||
|
+ for_each_irq(NULL, update_affinity_hint, NULL);
|
||||||
|
+ if (hint_has_changed) {
|
||||||
|
+ hint_has_changed = FALSE;
|
||||||
|
+ sleep_count = 1;
|
||||||
|
+ need_scan_flag = TRUE;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (need_scan_flag) {
|
||||||
|
+ if (!scan()) {
|
||||||
|
+ g_main_loop_quit(main_loop);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (data != &real_sleep_interval) {
|
||||||
|
+ data = &real_sleep_interval;
|
||||||
|
+ g_timeout_add_seconds(real_sleep_interval, poll_hint_affinity_and_scan, data);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (keep_going) {
|
||||||
|
+ return TRUE;
|
||||||
|
+ } else {
|
||||||
|
+ g_main_loop_quit(main_loop);
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void update_interval_and_count()
|
||||||
|
+{
|
||||||
|
+ real_sleep_interval =
|
||||||
|
+ sleep_interval > poll_hint_interval ? poll_hint_interval : sleep_interval;
|
||||||
|
+ if (!real_sleep_interval) {
|
||||||
|
+ sleep_interval_count = 1;
|
||||||
|
+ poll_hint_interval_count = 1;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ sleep_interval_count = sleep_interval / real_sleep_interval;
|
||||||
|
+ poll_hint_interval_count = poll_hint_interval / real_sleep_interval;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/hint_verify.h b/hint_verify.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..a309461
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/hint_verify.h
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the MuLan PSL v1.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MuLan PSL v1 for more details.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _INCLUDE_HINT_VERIFY_H
|
||||||
|
+#define _INCLUDE_HINT_VERIFY_H
|
||||||
|
+
|
||||||
|
+extern int real_sleep_interval;
|
||||||
|
+extern gboolean poll_hint_affinity_and_scan();
|
||||||
|
+extern void update_interval_and_count();
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
diff --git a/irqbalance.c b/irqbalance.c
|
||||||
|
index faa8e6a..4a7eb39 100644
|
||||||
|
--- a/irqbalance.c
|
||||||
|
+++ b/irqbalance.c
|
||||||
|
@@ -65,6 +65,8 @@ char *banscript = NULL;
|
||||||
|
char *polscript = NULL;
|
||||||
|
long HZ;
|
||||||
|
int sleep_interval = SLEEP_INTERVAL;
|
||||||
|
+int hint_enabled = 0;
|
||||||
|
+int poll_hint_interval = SLEEP_INTERVAL / 5;
|
||||||
|
GMainLoop *main_loop;
|
||||||
|
|
||||||
|
char *banned_cpumask_from_ui = NULL;
|
||||||
|
@@ -99,15 +101,16 @@ struct option lopts[] = {
|
||||||
|
{"banmod", 1 , NULL, 'm'},
|
||||||
|
{"interval", 1 , NULL, 't'},
|
||||||
|
{"version", 0, NULL, 'V'},
|
||||||
|
+ {"verifyhint", 1, NULL, 'v'},
|
||||||
|
{"rulesconfig", 1, NULL, 'r'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
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, "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");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void version(void)
|
||||||
|
@@ -122,7 +125,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:r",
|
||||||
|
+ "odfji:p:s:c:b:l:m:t:V:h:v:r:",
|
||||||
|
lopts, &longind)) != -1) {
|
||||||
|
|
||||||
|
switch(opt) {
|
||||||
|
@@ -202,6 +205,22 @@ static void parse_command_line(int argc, char **argv)
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
+ case 'h':
|
||||||
|
+ if (!strncmp(optarg, "subset", strlen(optarg)))
|
||||||
|
+ hint_enabled = 1;
|
||||||
|
+ else {
|
||||||
|
+ usage();
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ break;
|
||||||
|
+ case 'v':
|
||||||
|
+ poll_hint_interval = strtol(optarg, NULL, 10);
|
||||||
|
+ if (poll_hint_interval < 1) {
|
||||||
|
+ usage();
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
case 'r':
|
||||||
|
rules_config_file = strdup(optarg);
|
||||||
|
break;
|
||||||
|
@@ -300,7 +319,7 @@ out:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-gboolean scan(gpointer data)
|
||||||
|
+gboolean scan()
|
||||||
|
{
|
||||||
|
log(TO_CONSOLE, LOG_INFO, "\n\n\n-----------------------------------------------------------------------------\n");
|
||||||
|
clear_work_stats();
|
||||||
|
@@ -338,16 +357,9 @@ gboolean scan(gpointer data)
|
||||||
|
keep_going = 0;
|
||||||
|
cycle_count++;
|
||||||
|
|
||||||
|
- if (data != &sleep_interval) {
|
||||||
|
- data = &sleep_interval;
|
||||||
|
- g_timeout_add_seconds(sleep_interval, scan, data);
|
||||||
|
- return FALSE;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (keep_going) {
|
||||||
|
return TRUE;
|
||||||
|
} else {
|
||||||
|
- g_main_loop_quit(main_loop);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -626,9 +638,10 @@ 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 = &sleep_interval;
|
||||||
|
- g_timeout_add_seconds(sleep_interval, scan, last_interval);
|
||||||
|
+ int *last_interval = &real_sleep_interval;
|
||||||
|
+ g_timeout_add_seconds(real_sleep_interval, poll_hint_affinity_and_scan, last_interval);
|
||||||
|
g_main_loop_run(main_loop);
|
||||||
|
|
||||||
|
g_main_loop_quit(main_loop);
|
||||||
|
diff --git a/irqbalance.h b/irqbalance.h
|
||||||
|
index 1befb46..72e141b 100644
|
||||||
|
--- a/irqbalance.h
|
||||||
|
+++ b/irqbalance.h
|
||||||
|
@@ -15,6 +15,7 @@
|
||||||
|
#include "types.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "rules_config.h"
|
||||||
|
+#include "hint_verify.h"
|
||||||
|
#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);
|
||||||
|
|
||||||
|
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 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
|
||||||
|
+++ b/placement.c
|
||||||
|
@@ -41,6 +41,7 @@ static void find_best_object(struct topo_obj *d, void *data)
|
||||||
|
{
|
||||||
|
struct obj_placement *best = (struct obj_placement *)data;
|
||||||
|
uint64_t newload;
|
||||||
|
+ cpumask_t subset;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't consider the unspecified numa node here
|
||||||
|
@@ -58,6 +59,19 @@ static void find_best_object(struct topo_obj *d, void *data)
|
||||||
|
if (d->powersave_mode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * If the hint feature is enabled, then we only want
|
||||||
|
+ * to consider objects that are within the irqs hint, but
|
||||||
|
+ * only if that irq in fact has published a hint
|
||||||
|
+ */
|
||||||
|
+ if (hint_enabled) {
|
||||||
|
+ if (!cpus_empty(best->info->affinity_hint)) {
|
||||||
|
+ cpus_and(subset, best->info->affinity_hint, d->mask);
|
||||||
|
+ if (cpus_empty(subset))
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
newload = d->load;
|
||||||
|
if (newload < best->best_cost) {
|
||||||
|
best->best = d;
|
||||||
diff --git a/types.h b/types.h
|
diff --git a/types.h b/types.h
|
||||||
index 9693cf4..62cc2bb 100644
|
index e1f3dc6..c0950ee 100644
|
||||||
--- a/types.h
|
--- a/types.h
|
||||||
+++ b/types.h
|
+++ b/types.h
|
||||||
@@ -66,6 +66,7 @@ struct irq_info {
|
@@ -67,6 +67,7 @@ struct irq_info {
|
||||||
int flags;
|
int flags;
|
||||||
struct topo_obj *numa_node;
|
struct topo_obj *numa_node;
|
||||||
cpumask_t cpumask;
|
cpumask_t cpumask;
|
||||||
|
|||||||
@ -22,11 +22,11 @@ Signed-off-by: Xu Yandong <xuyandong2@huawei.com>
|
|||||||
Makefile.am | 6 +-
|
Makefile.am | 6 +-
|
||||||
classify.c | 20 ++-
|
classify.c | 20 ++-
|
||||||
cputree.c | 5 +-
|
cputree.c | 5 +-
|
||||||
irqbalance.c | 164 ++----------------------
|
irqbalance.c | 185 +++--------------------------------------------------------
|
||||||
irqbalance.h | 2 +
|
irqbalance.h | 2 +
|
||||||
sockapi.c | 400 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
sockapi.c | 404 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
sockapi.h | 18 +++
|
sockapi.h | 18 +++
|
||||||
7 files changed, 452 insertions(+), 163 deletions(-)
|
7 files changed, 462 insertions(+), 179 deletions(-)
|
||||||
create mode 100644 sockapi.c
|
create mode 100644 sockapi.c
|
||||||
create mode 100644 sockapi.h
|
create mode 100644 sockapi.h
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ index 27cf2eb..6e9de88 100644
|
|||||||
|
|
||||||
volatile int keep_going = 1;
|
volatile int keep_going = 1;
|
||||||
volatile int ban_pci_assigned_irq = 1;
|
volatile int ban_pci_assigned_irq = 1;
|
||||||
@@ -430,178 +432,6 @@ void get_object_stat(struct topo_obj *object, void *data)
|
@@ -388,178 +390,6 @@ void get_object_stat(struct topo_obj *object, void *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -354,28 +354,33 @@ index 27cf2eb..6e9de88 100644
|
|||||||
static int create_lock_pidfile(const char *lockfile)
|
static int create_lock_pidfile(const char *lockfile)
|
||||||
{
|
{
|
||||||
struct flock lock = { 0 };
|
struct flock lock = { 0 };
|
||||||
@@ -691,7 +519,9 @@ error_close:
|
@@ -633,6 +463,8 @@ error_close:
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
- struct sigaction action, hupaction;
|
|
||||||
+ int err;
|
+ int err;
|
||||||
+ pthread_t socket_tid;
|
+ pthread_t socket_tid;
|
||||||
+ struct sigaction action, hupaction;
|
|
||||||
sigset_t sigset, old_sigset;
|
sigset_t sigset, old_sigset;
|
||||||
int ret = EXIT_SUCCESS;
|
int ret = EXIT_SUCCESS;
|
||||||
|
|
||||||
@@ -781,7 +631,9 @@ int main(int argc, char** argv)
|
@@ -750,10 +582,13 @@ int main(int argc, char** argv)
|
||||||
parse_proc_interrupts();
|
parse_proc_interrupts();
|
||||||
parse_proc_stat();
|
parse_proc_stat();
|
||||||
|
|
||||||
- if (init_socket()) {
|
- if (init_socket()) {
|
||||||
|
- ret = EXIT_FAILURE;
|
||||||
|
- goto out;
|
||||||
+ err = pthread_create(&socket_tid, NULL, &handle_socket_api_event, NULL);
|
+ err = pthread_create(&socket_tid, NULL, &handle_socket_api_event, NULL);
|
||||||
+ if (0 != err) {
|
+ if (0 != err) {
|
||||||
+ log(TO_CONSOLE, LOG_WARNING, "WARNING: Failed to create irqbalance socket thread, return %d.\n", err);
|
+ log(TO_CONSOLE, LOG_WARNING, "WARNING: Failed to create irqbalance socket thread, return %d.\n", err);
|
||||||
ret = EXIT_FAILURE;
|
+ ret = EXIT_FAILURE;
|
||||||
goto out;
|
+ goto out;
|
||||||
}
|
}
|
||||||
|
+
|
||||||
|
main_loop = g_main_loop_new(NULL, FALSE);
|
||||||
|
int *last_interval = &sleep_interval;
|
||||||
|
g_timeout_add_seconds(sleep_interval, scan, last_interval);
|
||||||
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
diff --git a/irqbalance.h b/irqbalance.h
|
||||||
index 339e2a3..f9b554e 100644
|
index 339e2a3..f9b554e 100644
|
||||||
--- a/irqbalance.h
|
--- a/irqbalance.h
|
||||||
@ -394,17 +399,7 @@ new file mode 100644
|
|||||||
index 0000000..4a0e683
|
index 0000000..4a0e683
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/sockapi.c
|
+++ b/sockapi.c
|
||||||
@@ -0,0 +1,415 @@
|
@@ -0,0 +1,404 @@
|
||||||
+/*
|
|
||||||
+ * Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved.
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify
|
|
||||||
+ * it under the terms of the MuLan PSL v1.
|
|
||||||
+ *
|
|
||||||
+ * This program is distributed in the hope that it will be useful,
|
|
||||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MuLan PSL v1 for more details.
|
|
||||||
+ */
|
|
||||||
+#include <stdio.h>
|
+#include <stdio.h>
|
||||||
+#include <stdlib.h>
|
+#include <stdlib.h>
|
||||||
+#include <unistd.h>
|
+#include <unistd.h>
|
||||||
@ -747,7 +742,6 @@ index 0000000..4a0e683
|
|||||||
+ memset((void*)events, 0, sizeof(struct epoll_event) * MAX_EVENTS);
|
+ memset((void*)events, 0, sizeof(struct epoll_event) * MAX_EVENTS);
|
||||||
+
|
+
|
||||||
+ banned_cpumask_from_ui = (char*)malloc(NR_CPUS + 1);
|
+ banned_cpumask_from_ui = (char*)malloc(NR_CPUS + 1);
|
||||||
+ banned_cpumask_from_ui = (char*)malloc(NR_CPUS + 1);
|
|
||||||
+ if (!banned_cpumask_from_ui) {
|
+ if (!banned_cpumask_from_ui) {
|
||||||
+ log(TO_ALL, LOG_WARNING, "Daemon faild to malloc banned_cpumask_from_ui space.\n");
|
+ log(TO_ALL, LOG_WARNING, "Daemon faild to malloc banned_cpumask_from_ui space.\n");
|
||||||
+ exit(-1);
|
+ exit(-1);
|
||||||
@ -815,17 +809,7 @@ new file mode 100644
|
|||||||
index 0000000..254dd3f
|
index 0000000..254dd3f
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/sockapi.h
|
+++ b/sockapi.h
|
||||||
@@ -0,0 +1,28 @@
|
@@ -0,0 +1,18 @@
|
||||||
+/*
|
|
||||||
+ * Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved.
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify
|
|
||||||
+ * it under the terms of the MuLan PSL v1.
|
|
||||||
+ *
|
|
||||||
+ * This program is distributed in the hope that it will be useful,
|
|
||||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MuLan PSL v1 for more details.
|
|
||||||
+ */
|
|
||||||
+#ifndef UVP_IRQBALANCE_SOCKAPI_H_
|
+#ifndef UVP_IRQBALANCE_SOCKAPI_H_
|
||||||
+#define UVP_IRQBALANCE_SOCKAPI_H_
|
+#define UVP_IRQBALANCE_SOCKAPI_H_
|
||||||
+
|
+
|
||||||
|
|||||||
@ -26,8 +26,8 @@ diff --git a/classify.c b/classify.c
|
|||||||
index 3a25d62..65cb4e5 100644
|
index 3a25d62..65cb4e5 100644
|
||||||
--- a/classify.c
|
--- a/classify.c
|
||||||
+++ b/classify.c
|
+++ b/classify.c
|
||||||
@@ -299,6 +299,13 @@ int irq_in_rebalance_list(int irq)
|
@@ -299,6 +299,13 @@ static void add_banned_irq(int irq, GList **list, int extra_flag)
|
||||||
return entry ? 1 : 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
+#ifdef AARCH64
|
+#ifdef AARCH64
|
||||||
|
|||||||
@ -67,3 +67,4 @@ index cace4d8..5e5ef9b 100644
|
|||||||
}
|
}
|
||||||
--
|
--
|
||||||
2.19.1
|
2.19.1
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
Summary: A dynamic adaptive IRQ balancing daemon
|
Summary: A dynamic adaptive IRQ balancing daemon
|
||||||
Name: irqbalance
|
Name: irqbalance
|
||||||
Version: 1.4.0
|
Version: 1.4.0
|
||||||
Release: 11
|
Release: 13
|
||||||
Epoch: 3
|
Epoch: 3
|
||||||
|
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
@ -9,7 +9,7 @@ Source0: https://github.com/Irqbalance/irqbalance/archive/irqbalance-%{ve
|
|||||||
Source1: irqbalance.sysconfig
|
Source1: irqbalance.sysconfig
|
||||||
Source2: irqbalance.rules
|
Source2: irqbalance.rules
|
||||||
Source3: irq_balancer
|
Source3: irq_balancer
|
||||||
Url: https://github.com/Irqbalance/irqbalance
|
Url: https://github.com/irqbalance/irqbalance
|
||||||
|
|
||||||
BuildRequires: autoconf automake libtool libcap-ng systemd
|
BuildRequires: autoconf automake libtool libcap-ng systemd
|
||||||
BuildRequires: glib2-devel pkgconf libcap-ng-devel ncurses-devel
|
BuildRequires: glib2-devel pkgconf libcap-ng-devel ncurses-devel
|
||||||
@ -51,21 +51,28 @@ Patch9000: irqbalance-1.0.4-env-file-path.patch
|
|||||||
Patch9001: bugfix-fix-a-hole-that-flees-hotplug-event.patch
|
Patch9001: bugfix-fix-a-hole-that-flees-hotplug-event.patch
|
||||||
Patch9002: bugfix-use-policy-prior-to-the-default-values.patch
|
Patch9002: bugfix-use-policy-prior-to-the-default-values.patch
|
||||||
Patch9003: bugfix-force-irq-into-rebalance-list-when-irq-removed-and-reinserted.patch
|
Patch9003: bugfix-force-irq-into-rebalance-list-when-irq-removed-and-reinserted.patch
|
||||||
Patch9004: feature-introduce-verifyhint-to-detect-hint-variation.patch
|
Patch9004: feature-irqbalance-aarch64-add-the-regular-to-get-th.patch
|
||||||
Patch9005: bugfix-fix-two-same-irq-insert-to-list.patch
|
Patch9005: feature-irqbalance-arm64-Add-irq-aff-change-check.patch
|
||||||
Patch9006: feature-irqbalance-aarch64-add-the-regular-to-get-th.patch
|
Patch9006: feature-irqbalance-auto-banned-pci-assigned-irq.patch
|
||||||
Patch9007: feature-irqbalance-arm64-Add-irq-aff-change-check.patch
|
Patch9007: bugfix-irqbalance-fix-wrong-pid-value-in-pid-file.patch
|
||||||
Patch9008: feature-irqbalance-auto-banned-pci-assigned-irq.patch
|
Patch9008: feature-supplement-irqbalance-service-config.patch
|
||||||
Patch9009: bugfix-irqbalance-fix-wrong-pid-value-in-pid-file.patch
|
Patch9009: feature-irqbalance-Add-ability-for-socket-communicat.patch
|
||||||
Patch9010: feature-supplement-irqbalance-service-config.patch
|
Patch9010: bugfix-fgets-will-get-a-redundant-new-line.patch
|
||||||
Patch9011: feature-irqbalance-Add-ability-for-socket-communicat.patch
|
Patch9011: bugfix-Prevent-inserting-a-duplicate-entry-to-avoid-list-ch.patch
|
||||||
Patch9012: bugfix-fgets-will-get-a-redundant-new-line.patch
|
Patch9012: bugfix-guess_arm_irq_hints.patch
|
||||||
Patch9013: bugfix-prevent-inserting-a-duplicate-entry-to-avoid-list-ch.patch
|
Patch9013: feature-add-new-user-irq-policy-config-rule.patch
|
||||||
Patch9014: bugfix-guess_arm_irq_hints.patch
|
Patch9014: bugfix-make-the-return-value-of-getline-handled-correct.patch
|
||||||
Patch9015: feature-add-new-user-irq-policy-config-rule.patch
|
Patch9015: bugfix-change-irq-ban-check-path-to-devpath.patch
|
||||||
Patch9016: bugfix-make-the-return-value-of-getline-handled-correct.patch
|
Patch9016: bugfix-fix-new-irqs-in-hotplug-keep-stay-on-one-numa.patch
|
||||||
Patch9017: bugfix-change-irq-ban-check-path-to-devpath.patch
|
Patch9017: feature-add-the-switch-of-printing-log.patch
|
||||||
Patch9018: bugfix-fix-strcat-may-cause-buffer-overrun.patch
|
Patch9018: bugfix-fix-new-msi-irq-hasnot-been-added-to-rebalance-list.patch
|
||||||
|
Patch9019: bugfix-delete-no-existing-banned-irq.patch
|
||||||
|
Patch9020: feature-add-test-interfaces-for-irqbalance-core-functions.patch
|
||||||
|
Patch9021: bugfix-fix-strcat-may-cause-buffer-overrun.patch
|
||||||
|
Patch9022: feature-introduce-verifyhint-to-detect-hint-variation.patch
|
||||||
|
Patch9023: bugfix-fix-memory-leak-of-strdup-in-collect_full_irq_list.patch
|
||||||
|
Patch9024: bugfix-fix-sleep-interval-when-sleep_interval-is-changed-by.patch
|
||||||
|
Patch9025: feature-add-switch-to-clear-affinity-hint.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Irqbalance is a daemon to help balance the cpu load generated by
|
Irqbalance is a daemon to help balance the cpu load generated by
|
||||||
@ -126,6 +133,18 @@ fi
|
|||||||
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Dec 20 2019 caomeng<caomeng5@huawei.com> - 3:1.4.0-13
|
||||||
|
- Type:NA
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC:change the url
|
||||||
|
|
||||||
|
* Fri Dec 20 2019 liuchao<liuchao173@huawei.com> - 3:1.4.0-12
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC:synchronize patches from R8
|
||||||
|
|
||||||
* Wed Nov 13 2019 liuchao<liuchao173@huawei.com> - 3:1.4.0-11
|
* Wed Nov 13 2019 liuchao<liuchao173@huawei.com> - 3:1.4.0-11
|
||||||
- Type:other
|
- Type:other
|
||||||
- ID:NA
|
- ID:NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user