upgrade to v1.8.0
This commit is contained in:
parent
c65a85a98c
commit
86bf46daa9
@ -1,115 +0,0 @@
|
|||||||
From ef9bf64affbca0b030f9128d93f302296d166dac Mon Sep 17 00:00:00 2001
|
|
||||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
|
||||||
Date: Mon, 4 Jan 2021 12:34:02 +0800
|
|
||||||
Subject: [PATCH] Add hot pull method for irqbalance
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/ef9bf64affbca0b030f9128d93f302296d166dac
|
|
||||||
---
|
|
||||||
classify.c | 37 +++++++++++++++++++++++++++++++++++++
|
|
||||||
irqbalance.h | 1 +
|
|
||||||
procinterrupts.c | 4 +++-
|
|
||||||
types.h | 1 +
|
|
||||||
4 files changed, 42 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 4b6ffa8..beb2919 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -852,3 +852,39 @@ void sort_irq_list(GList **list)
|
|
||||||
{
|
|
||||||
*list = g_list_sort(*list, sort_irqs);
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+static void remove_no_existing_irq(struct irq_info *info, void *data __attribute__((unused)))
|
|
||||||
+{
|
|
||||||
+ GList *entry = NULL;
|
|
||||||
+
|
|
||||||
+ if (info->existing) {
|
|
||||||
+ /* clear existing flag for next detection */
|
|
||||||
+ info->existing = 0;
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ entry = g_list_find_custom(interrupts_db, info, compare_ints);
|
|
||||||
+ if (entry)
|
|
||||||
+ interrupts_db = g_list_delete_link(interrupts_db, entry);
|
|
||||||
+
|
|
||||||
+ entry = g_list_find_custom(rebalance_irq_list, info, compare_ints);
|
|
||||||
+ if (entry)
|
|
||||||
+ rebalance_irq_list = g_list_delete_link(rebalance_irq_list, entry);
|
|
||||||
+
|
|
||||||
+ if(info->assigned_obj) {
|
|
||||||
+ entry = g_list_find_custom(info->assigned_obj->interrupts, info, compare_ints);
|
|
||||||
+ if (entry) {
|
|
||||||
+ info->assigned_obj->interrupts = g_list_delete_link(info->assigned_obj->interrupts, entry);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ log(TO_CONSOLE, LOG_INFO, "IRQ %d is removed from interrupts_db.\n", info->irq);
|
|
||||||
+ free_irq(info, NULL);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+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);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index d8e80a9..e7f6b94 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -42,6 +42,7 @@ extern void set_interrupt_count(int number, uint64_t count);
|
|
||||||
extern void set_msi_interrupt_numa(int number);
|
|
||||||
extern void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq);
|
|
||||||
extern int proc_irq_hotplug(char *line, int irq, struct irq_info **pinfo);
|
|
||||||
+extern void clear_no_existing_irqs(void);
|
|
||||||
|
|
||||||
extern GList *rebalance_irq_list;
|
|
||||||
extern void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)));
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 0671be0..854282f 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -248,7 +248,6 @@ GList* collect_full_irq_list()
|
|
||||||
return tmp_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
-
|
|
||||||
void parse_proc_interrupts(void)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
@@ -310,6 +309,7 @@ void parse_proc_interrupts(void)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ info->existing = 1;
|
|
||||||
free(savedline);
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
@@ -354,6 +354,8 @@ void parse_proc_interrupts(void)
|
|
||||||
*/
|
|
||||||
msi_found_in_sysfs = 1;
|
|
||||||
}
|
|
||||||
+ if (!need_rescan)
|
|
||||||
+ clear_no_existing_irqs();
|
|
||||||
fclose(file);
|
|
||||||
free(line);
|
|
||||||
}
|
|
||||||
diff --git a/types.h b/types.h
|
|
||||||
index a01d649..9693cf4 100644
|
|
||||||
--- a/types.h
|
|
||||||
+++ b/types.h
|
|
||||||
@@ -70,6 +70,7 @@ struct irq_info {
|
|
||||||
uint64_t last_irq_count;
|
|
||||||
uint64_t load;
|
|
||||||
int moved;
|
|
||||||
+ int existing;
|
|
||||||
struct topo_obj *assigned_obj;
|
|
||||||
char *name;
|
|
||||||
};
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,43 +0,0 @@
|
|||||||
From 6ae114f8719a6a49cef73a32d820a77e900ddf08 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
|
||||||
Date: Thu, 17 Dec 2020 17:47:45 +0800
|
|
||||||
Subject: [PATCH] Add log for hotplug appropriately
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/6ae114f8719a6a49cef73a32d820a77e900ddf08
|
|
||||||
---
|
|
||||||
classify.c | 7 +++++--
|
|
||||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 0d556e9..4b6ffa8 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -644,12 +644,13 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs, int build_
|
|
||||||
irqnum = strtol(entry->d_name, NULL, 10);
|
|
||||||
/* If build_irq is valid, only add irq when it's number equals to build_irq */
|
|
||||||
if (irqnum && ((build_irq < 0) || (irqnum == build_irq))) {
|
|
||||||
- printf("add irq:%d %d for %s\n", irqnum, build_irq, path);
|
|
||||||
hint.irq = irqnum;
|
|
||||||
hint.type = IRQ_TYPE_MSIX;
|
|
||||||
add_new_irq(devpath, &hint, tmp_irqs);
|
|
||||||
- if (build_irq >= 0)
|
|
||||||
+ if (build_irq >= 0) {
|
|
||||||
+ log(TO_CONSOLE, LOG_INFO, "Hotplug dev irq: %d finished.\n", irqnum);
|
|
||||||
break;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
} while (entry != NULL);
|
|
||||||
closedir(msidir);
|
|
||||||
@@ -674,6 +675,8 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs, int build_
|
|
||||||
hint.irq = irqnum;
|
|
||||||
hint.type = IRQ_TYPE_LEGACY;
|
|
||||||
add_new_irq(devpath, &hint, tmp_irqs);
|
|
||||||
+ if (build_irq >= 0)
|
|
||||||
+ log(TO_CONSOLE, LOG_INFO, "Hotplug dev irq: %d finished.\n", irqnum);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
From 31dea01f3a47aa6374560638486879e5129f9c94 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kairui Song <kasong@redhat.com>
|
|
||||||
Date: Thu, 28 Jan 2021 15:24:32 +0800
|
|
||||||
Subject: [PATCH] Also fetch node info for non-PCI devices
|
|
||||||
|
|
||||||
non-PCI devices could also be bind to a certain node. So if failed to
|
|
||||||
fetch the info from sysfs, try to get it from /proc/irq/<irq>/node.
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/31dea01f3a47aa6374560638486879e5129f9c94
|
|
||||||
---
|
|
||||||
classify.c | 11 ++++++++---
|
|
||||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index beb2919..105ecd6 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -361,9 +361,14 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
|
|
||||||
|
|
||||||
get_numa_node:
|
|
||||||
numa_node = NUMA_NO_NODE;
|
|
||||||
- if (devpath != NULL && numa_avail) {
|
|
||||||
- sprintf(path, "%s/numa_node", devpath);
|
|
||||||
- process_one_line(path, get_int, &numa_node);
|
|
||||||
+ if (numa_avail) {
|
|
||||||
+ if (devpath != NULL) {
|
|
||||||
+ sprintf(path, "%s/numa_node", devpath);
|
|
||||||
+ process_one_line(path, get_int, &numa_node);
|
|
||||||
+ } else {
|
|
||||||
+ sprintf(path, "/proc/irq/%i/node", irq);
|
|
||||||
+ process_one_line(path, get_int, &numa_node);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pol->numa_node_set == 1)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
From 518d81cdd8c54c820d16afb73658753b46032676 Mon Sep 17 00:00:00 2001
|
|
||||||
From: SuperSix173 <liuchao173@huawei.com>
|
|
||||||
Date: Tue, 6 Apr 2021 10:26:17 +0800
|
|
||||||
Subject: [PATCH] Hotplug may occur again during sleep, so wait until there is
|
|
||||||
no hotplug
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/518d81cdd8c54c820d16afb73658753b46032676
|
|
||||||
---
|
|
||||||
irqbalance.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index 458bb07..3f94847 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -285,7 +285,7 @@ gboolean scan(gpointer data __attribute__((unused)))
|
|
||||||
|
|
||||||
|
|
||||||
/* cope with cpu hotplug -- detected during /proc/interrupts parsing */
|
|
||||||
- if (need_rescan || need_rebuild) {
|
|
||||||
+ while (need_rescan || need_rebuild) {
|
|
||||||
int try_times = 0;
|
|
||||||
|
|
||||||
need_rescan = 0;
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
From c8757c6d870c4788da4980abaf21cb7369702ee9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paride Legovini <paride@debian.org>
|
|
||||||
Date: Tue, 25 Aug 2020 23:18:27 +0200
|
|
||||||
Subject: [PATCH] activate_mapping: activate only online CPUs
|
|
||||||
|
|
||||||
When echoing a mask to /proc/irq/N/smp_affinity make sure to activate
|
|
||||||
only CPUs which are online. Activating a CPU which is not online results
|
|
||||||
in a EOVERFLOW.
|
|
||||||
|
|
||||||
Originally fixed in Debian by Helge Deller <deller@gmx.de>.
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/c8757c6d870c4788da4980abaf21cb7369702ee9
|
|
||||||
---
|
|
||||||
activate.c | 8 ++++++--
|
|
||||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/activate.c b/activate.c
|
|
||||||
index 065f880..62cfd08 100644
|
|
||||||
--- a/activate.c
|
|
||||||
+++ b/activate.c
|
|
||||||
@@ -49,6 +49,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
|
||||||
char buf[PATH_MAX];
|
|
||||||
FILE *file;
|
|
||||||
int ret = 0;
|
|
||||||
+ cpumask_t applied_mask;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* only activate mappings for irqs that have moved
|
|
||||||
@@ -59,10 +60,13 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
|
||||||
if (!info->assigned_obj)
|
|
||||||
return;
|
|
||||||
|
|
||||||
+ /* activate only online cpus, otherwise writing to procfs returns EOVERFLOW */
|
|
||||||
+ cpus_and(applied_mask, cpu_online_map, info->assigned_obj->mask);
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* Don't activate anything for which we have an invalid mask
|
|
||||||
*/
|
|
||||||
- if (check_affinity(info, info->assigned_obj->mask))
|
|
||||||
+ if (check_affinity(info, applied_mask))
|
|
||||||
return;
|
|
||||||
|
|
||||||
sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
|
|
||||||
@@ -70,7 +74,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);
|
|
||||||
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);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
From 677b686e223c74e64f5b230bdb4079555a5a62a9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: ChanderG <mail@chandergovind.org>
|
|
||||||
Date: Tue, 25 Aug 2020 15:46:56 +0530
|
|
||||||
Subject: [PATCH] add env variable to ban cpus using cpulist syntax
|
|
||||||
|
|
||||||
allows banning of cpus using the taskset cpulist syntax in addition to the
|
|
||||||
bitmap syntax supported via the existing environment variable
|
|
||||||
IRQBALANCE_BANNED_CPUS
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/677b686e223c74e64f5b230bdb4079555a5a62a9
|
|
||||||
---
|
|
||||||
cputree.c | 6 ++++++
|
|
||||||
irqbalance.1 | 6 ++++++
|
|
||||||
2 files changed, 12 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 0433657..00cf47f 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -127,6 +127,12 @@ static void setup_banned_cpus(void)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ env = getenv("IRQBALANCE_BANNED_CPULIST");
|
|
||||||
+ if (env && strlen(env)) {
|
|
||||||
+ cpulist_parse(env, strlen(env), banned_cpus);
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
path = "/sys/devices/system/cpu/isolated";
|
|
||||||
process_one_line(path, get_mask_from_cpulist, &isolated_cpus);
|
|
||||||
|
|
||||||
diff --git a/irqbalance.1 b/irqbalance.1
|
|
||||||
index 3005f6b..33ffd26 100644
|
|
||||||
--- a/irqbalance.1
|
|
||||||
+++ b/irqbalance.1
|
|
||||||
@@ -158,6 +158,12 @@ Provides a mask of CPUs which irqbalance should ignore and never assign interrup
|
|
||||||
If not specified, irqbalance use mask of isolated and adaptive-ticks CPUs on the
|
|
||||||
system as the default value.
|
|
||||||
|
|
||||||
+.TP
|
|
||||||
+.B IRQBALANCE_BANNED_CPULIST
|
|
||||||
+Provides a cpulist which irqbalance should ignore and never assign interrupts to.
|
|
||||||
+If not specified, irqbalance use mask of isolated and adaptive-ticks CPUs on the
|
|
||||||
+system as the default value.
|
|
||||||
+
|
|
||||||
.SH "SIGNALS"
|
|
||||||
.TP
|
|
||||||
.B SIGHUP
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,352 +0,0 @@
|
|||||||
From 0ba4a60a2a732150e5016389e32b2e81906a72c2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
|
||||||
Date: Fri, 4 Dec 2020 10:52:57 +0800
|
|
||||||
Subject: [PATCH] add irq hotplug feature for irqbalance
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/0ba4a60a2a732150e5016389e32b2e81906a72c2
|
|
||||||
---
|
|
||||||
classify.c | 70 +++++++++++++++++++++++--------
|
|
||||||
irqbalance.c | 2 +-
|
|
||||||
irqbalance.h | 4 +-
|
|
||||||
procinterrupts.c | 104 ++++++++++++++++++++++++++++-------------------
|
|
||||||
4 files changed, 120 insertions(+), 60 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 9f588bc..0d556e9 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -619,7 +619,7 @@ static void add_new_irq(char *path, struct irq_info *hint, GList *proc_interrupt
|
|
||||||
/*
|
|
||||||
* Figures out which interrupt(s) relate to the device we"re looking at in dirname
|
|
||||||
*/
|
|
||||||
-static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
+static void build_one_dev_entry(const char *dirname, GList *tmp_irqs, int build_irq)
|
|
||||||
{
|
|
||||||
struct dirent *entry;
|
|
||||||
DIR *msidir;
|
|
||||||
@@ -642,10 +642,14 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
if (!entry)
|
|
||||||
break;
|
|
||||||
irqnum = strtol(entry->d_name, NULL, 10);
|
|
||||||
- if (irqnum) {
|
|
||||||
+ /* If build_irq is valid, only add irq when it's number equals to build_irq */
|
|
||||||
+ if (irqnum && ((build_irq < 0) || (irqnum == build_irq))) {
|
|
||||||
+ printf("add irq:%d %d for %s\n", irqnum, build_irq, path);
|
|
||||||
hint.irq = irqnum;
|
|
||||||
hint.type = IRQ_TYPE_MSIX;
|
|
||||||
add_new_irq(devpath, &hint, tmp_irqs);
|
|
||||||
+ if (build_irq >= 0)
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
} while (entry != NULL);
|
|
||||||
closedir(msidir);
|
|
||||||
@@ -665,9 +669,12 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
#else
|
|
||||||
if (irqnum) {
|
|
||||||
#endif
|
|
||||||
- hint.irq = irqnum;
|
|
||||||
- hint.type = IRQ_TYPE_LEGACY;
|
|
||||||
- add_new_irq(devpath, &hint, tmp_irqs);
|
|
||||||
+ /* If build_irq is valid, only add irq when it's number equals to build_irq */
|
|
||||||
+ if ((build_irq < 0) || (irqnum == build_irq)) {
|
|
||||||
+ hint.irq = irqnum;
|
|
||||||
+ hint.type = IRQ_TYPE_LEGACY;
|
|
||||||
+ add_new_irq(devpath, &hint, tmp_irqs);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
@@ -712,31 +719,60 @@ static void free_tmp_irqs(gpointer data)
|
|
||||||
free(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
-void rebuild_irq_db(void)
|
|
||||||
+static struct irq_info * build_dev_irqs(GList *tmp_irqs, int build_irq)
|
|
||||||
{
|
|
||||||
DIR *devdir;
|
|
||||||
struct dirent *entry;
|
|
||||||
- GList *tmp_irqs = NULL;
|
|
||||||
-
|
|
||||||
- free_irq_db();
|
|
||||||
-
|
|
||||||
- tmp_irqs = collect_full_irq_list();
|
|
||||||
+ struct irq_info *new_irq = NULL;
|
|
||||||
|
|
||||||
devdir = opendir(SYSPCI_DIR);
|
|
||||||
-
|
|
||||||
if (devdir) {
|
|
||||||
do {
|
|
||||||
entry = readdir(devdir);
|
|
||||||
-
|
|
||||||
if (!entry)
|
|
||||||
break;
|
|
||||||
-
|
|
||||||
- build_one_dev_entry(entry->d_name, tmp_irqs);
|
|
||||||
-
|
|
||||||
+ /* when hotplug irqs, we add one irq at one time */
|
|
||||||
+ build_one_dev_entry(entry->d_name, tmp_irqs, build_irq);
|
|
||||||
+ if (build_irq >= 0) {
|
|
||||||
+ new_irq = get_irq_info(build_irq);
|
|
||||||
+ if (new_irq)
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
} while (entry != NULL);
|
|
||||||
-
|
|
||||||
closedir(devdir);
|
|
||||||
}
|
|
||||||
+ return new_irq;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int proc_irq_hotplug(char *savedline, int irq, struct irq_info **pinfo)
|
|
||||||
+{
|
|
||||||
+ struct irq_info tmp_info = {0};
|
|
||||||
+
|
|
||||||
+ /* firstly, init irq info by read device info */
|
|
||||||
+ *pinfo = build_dev_irqs(interrupts_db, irq);
|
|
||||||
+ if (*pinfo == NULL) {
|
|
||||||
+ /* secondly, init irq info by parse savedline */
|
|
||||||
+ init_irq_class_and_type(savedline, &tmp_info, irq);
|
|
||||||
+ add_new_irq(NULL, &tmp_info, interrupts_db);
|
|
||||||
+ *pinfo = get_irq_info(irq);
|
|
||||||
+ }
|
|
||||||
+ if (*pinfo == NULL) {
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ force_rebalance_irq(*pinfo, NULL);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void rebuild_irq_db(void)
|
|
||||||
+{
|
|
||||||
+ GList *tmp_irqs = NULL;
|
|
||||||
+
|
|
||||||
+ free_irq_db();
|
|
||||||
+
|
|
||||||
+ tmp_irqs = collect_full_irq_list();
|
|
||||||
+
|
|
||||||
+ build_dev_irqs(tmp_irqs, -1);
|
|
||||||
|
|
||||||
for_each_irq(tmp_irqs, add_missing_irq, interrupts_db);
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index eaa0ce1..9baa955 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -249,7 +249,7 @@ static void dump_object_tree(void)
|
|
||||||
for_each_object(numa_nodes, dump_numa_node_info, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)))
|
|
||||||
+void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)))
|
|
||||||
{
|
|
||||||
if (info->level == BALANCE_NONE)
|
|
||||||
return;
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index acf0ed5..d8e80a9 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -40,8 +40,11 @@ extern GList* collect_full_irq_list();
|
|
||||||
extern void parse_proc_stat(void);
|
|
||||||
extern void set_interrupt_count(int number, uint64_t count);
|
|
||||||
extern void set_msi_interrupt_numa(int number);
|
|
||||||
+extern void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq);
|
|
||||||
+extern int proc_irq_hotplug(char *line, int irq, struct irq_info **pinfo);
|
|
||||||
|
|
||||||
extern GList *rebalance_irq_list;
|
|
||||||
+extern void force_rebalance_irq(struct irq_info *info, void *data __attribute__((unused)));
|
|
||||||
|
|
||||||
void update_migration_status(void);
|
|
||||||
void dump_workloads(void);
|
|
||||||
@@ -52,7 +55,6 @@ void dump_tree(void);
|
|
||||||
void activate_mappings(void);
|
|
||||||
void clear_cpu_tree(void);
|
|
||||||
void free_cpu_topo(gpointer data);
|
|
||||||
-
|
|
||||||
/*===================NEW BALANCER FUNCTIONS============================*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 858b66b..0671be0 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -145,16 +145,59 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
|
||||||
+{
|
|
||||||
+ char *irq_name = NULL;
|
|
||||||
+ char *irq_mod = NULL;
|
|
||||||
+ char *savedptr = NULL;
|
|
||||||
+ char *last_token = NULL;
|
|
||||||
+ char *p = NULL;
|
|
||||||
+ int is_xen_dyn = 0;
|
|
||||||
+#ifdef AARCH64
|
|
||||||
+ char *tmp = NULL;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ irq_name = strtok_r(savedline, " ", &savedptr);
|
|
||||||
+ if (strstr(irq_name, "xen-dyn") != NULL)
|
|
||||||
+ is_xen_dyn = 1;
|
|
||||||
+ last_token = strtok_r(NULL, " ", &savedptr);
|
|
||||||
+ while ((p = strtok_r(NULL, " ", &savedptr))) {
|
|
||||||
+ irq_name = last_token;
|
|
||||||
+ if (strstr(irq_name, "xen-dyn") != NULL)
|
|
||||||
+ is_xen_dyn = 1;
|
|
||||||
+ last_token = p;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+#ifdef AARCH64
|
|
||||||
+ irq_name = last_token;
|
|
||||||
+ tmp = strchr(irq_name, '\n');
|
|
||||||
+ if (tmp)
|
|
||||||
+ *tmp = 0;
|
|
||||||
+#endif
|
|
||||||
+ irq_mod = last_token;
|
|
||||||
+ info->irq = irq;
|
|
||||||
+
|
|
||||||
+ if (strstr(irq_name, "-event") != NULL && is_xen_dyn == 1) {
|
|
||||||
+ info->type = IRQ_TYPE_VIRT_EVENT;
|
|
||||||
+ info->class = IRQ_VIRT_EVENT;
|
|
||||||
+ } else {
|
|
||||||
+#ifdef AARCH64
|
|
||||||
+ guess_arm_irq_hints(irq_name, info);
|
|
||||||
+#else
|
|
||||||
+ info->type = IRQ_TYPE_LEGACY;
|
|
||||||
+ info->class = IRQ_OTHER;
|
|
||||||
+#endif
|
|
||||||
+ }
|
|
||||||
+ info->numa_node = get_numa_node(0);
|
|
||||||
+ info->name = strdup(irq_mod);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
GList* collect_full_irq_list()
|
|
||||||
{
|
|
||||||
GList *tmp_list = NULL;
|
|
||||||
FILE *file;
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
- char *irq_name, *irq_mod, *savedptr, *last_token, *p;
|
|
||||||
-#ifdef AARCH64
|
|
||||||
- char *tmp;
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
file = fopen("/proc/interrupts", "r");
|
|
||||||
if (!file)
|
|
||||||
@@ -169,7 +212,6 @@ GList* collect_full_irq_list()
|
|
||||||
|
|
||||||
while (!feof(file)) {
|
|
||||||
int number;
|
|
||||||
- int is_xen_dyn = 0;
|
|
||||||
struct irq_info *info;
|
|
||||||
char *c;
|
|
||||||
char *savedline = NULL;
|
|
||||||
@@ -191,44 +233,12 @@ GList* collect_full_irq_list()
|
|
||||||
savedline = strdup(line);
|
|
||||||
if (!savedline)
|
|
||||||
break;
|
|
||||||
- irq_name = strtok_r(savedline, " ", &savedptr);
|
|
||||||
- if (strstr(irq_name, "xen-dyn") != NULL)
|
|
||||||
- is_xen_dyn = 1;
|
|
||||||
- last_token = strtok_r(NULL, " ", &savedptr);
|
|
||||||
- while ((p = strtok_r(NULL, " ", &savedptr))) {
|
|
||||||
- irq_name = last_token;
|
|
||||||
- if (strstr(irq_name, "xen-dyn") != NULL)
|
|
||||||
- is_xen_dyn = 1;
|
|
||||||
- last_token = p;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
-#ifdef AARCH64
|
|
||||||
- /* Of course the formatting for /proc/interrupts is different on different arches */
|
|
||||||
- irq_name = last_token;
|
|
||||||
- tmp = strchr(irq_name, '\n');
|
|
||||||
- if (tmp)
|
|
||||||
- *tmp = 0;
|
|
||||||
-#endif
|
|
||||||
- irq_mod = last_token;
|
|
||||||
-
|
|
||||||
*c = 0;
|
|
||||||
number = strtoul(line, NULL, 10);
|
|
||||||
|
|
||||||
info = calloc(1, sizeof(struct irq_info));
|
|
||||||
if (info) {
|
|
||||||
- info->irq = number;
|
|
||||||
- if (strstr(irq_name, "-event") != NULL && is_xen_dyn == 1) {
|
|
||||||
- info->type = IRQ_TYPE_VIRT_EVENT;
|
|
||||||
- info->class = IRQ_VIRT_EVENT;
|
|
||||||
- } else {
|
|
||||||
-#ifdef AARCH64
|
|
||||||
- guess_arm_irq_hints(irq_name, info);
|
|
||||||
-#else
|
|
||||||
- info->type = IRQ_TYPE_LEGACY;
|
|
||||||
- info->class = IRQ_OTHER;
|
|
||||||
-#endif
|
|
||||||
- }
|
|
||||||
- info->name = strdup(irq_mod);
|
|
||||||
+ init_irq_class_and_type(savedline, info, number);
|
|
||||||
tmp_list = g_list_append(tmp_list, info);
|
|
||||||
}
|
|
||||||
free(savedline);
|
|
||||||
@@ -238,11 +248,13 @@ GList* collect_full_irq_list()
|
|
||||||
return tmp_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
+
|
|
||||||
void parse_proc_interrupts(void)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
+ int ret;
|
|
||||||
|
|
||||||
file = fopen("/proc/interrupts", "r");
|
|
||||||
if (!file)
|
|
||||||
@@ -261,6 +273,7 @@ void parse_proc_interrupts(void)
|
|
||||||
uint64_t count;
|
|
||||||
char *c, *c2;
|
|
||||||
struct irq_info *info;
|
|
||||||
+ char *savedline = NULL;
|
|
||||||
|
|
||||||
if (getline(&line, &size, file)<=0)
|
|
||||||
break;
|
|
||||||
@@ -280,15 +293,24 @@ void parse_proc_interrupts(void)
|
|
||||||
if (!c)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
+ savedline = strdup(line);
|
|
||||||
+ if (!savedline)
|
|
||||||
+ break;
|
|
||||||
*c = 0;
|
|
||||||
c++;
|
|
||||||
number = strtoul(line, NULL, 10);
|
|
||||||
|
|
||||||
info = get_irq_info(number);
|
|
||||||
if (!info) {
|
|
||||||
- need_rescan = 1;
|
|
||||||
- break;
|
|
||||||
+ ret = proc_irq_hotplug(savedline, number, &info);
|
|
||||||
+ if (ret < 0) {
|
|
||||||
+ /* hotplug fail, need to rescan */
|
|
||||||
+ need_rescan = 1;
|
|
||||||
+ free(savedline);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
+ free(savedline);
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
cpunr = 0;
|
|
||||||
@@ -316,7 +338,7 @@ void parse_proc_interrupts(void)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
- info->last_irq_count = info->irq_count;
|
|
||||||
+ info->last_irq_count = info->irq_count;
|
|
||||||
info->irq_count = count;
|
|
||||||
|
|
||||||
/* is interrupt MSI based? */
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,57 +0,0 @@
|
|||||||
From 6fe032945b69d8f382fa3e8de8e4fdce84063199 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Fri, 20 Nov 2020 00:15:58 +0800
|
|
||||||
Subject: [PATCH] log correctly for isolated and nohz_full cpus
|
|
||||||
|
|
||||||
When the banded CPU is configured, and the "isolcpus" or "nohz_full"
|
|
||||||
is configured, the log for isolated and nohz CPUs are not correct.
|
|
||||||
|
|
||||||
So only log relevant infomation when isolcpus and nohz_full has been
|
|
||||||
handled, also put the cpus_clear() closer.
|
|
||||||
|
|
||||||
Conflict:NA
|
|
||||||
Reference:https://github.com/Irqbalance/irqbalance/commit/6fe032945b69d8f382fa3e8de8e4fdce84063199
|
|
||||||
---
|
|
||||||
cputree.c | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 80a6d9d..eed20db 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -112,9 +112,6 @@ static void setup_banned_cpus(void)
|
|
||||||
cpumask_t isolated_cpus;
|
|
||||||
char *env = NULL;
|
|
||||||
|
|
||||||
- cpus_clear(isolated_cpus);
|
|
||||||
- cpus_clear(nohz_full);
|
|
||||||
-
|
|
||||||
/* A manually specified cpumask overrides auto-detection. */
|
|
||||||
if (cpu_ban_string != NULL && banned_cpumask_from_ui != NULL) {
|
|
||||||
cpulist_parse(banned_cpumask_from_ui,
|
|
||||||
@@ -133,6 +130,9 @@ static void setup_banned_cpus(void)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ cpus_clear(isolated_cpus);
|
|
||||||
+ cpus_clear(nohz_full);
|
|
||||||
+
|
|
||||||
path = "/sys/devices/system/cpu/isolated";
|
|
||||||
process_one_line(path, get_mask_from_cpulist, &isolated_cpus);
|
|
||||||
|
|
||||||
@@ -141,11 +141,11 @@ static void setup_banned_cpus(void)
|
|
||||||
|
|
||||||
cpus_or(banned_cpus, nohz_full, isolated_cpus);
|
|
||||||
|
|
||||||
-out:
|
|
||||||
cpumask_scnprintf(buffer, 4096, isolated_cpus);
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "Isolated CPUs: %s\n", buffer);
|
|
||||||
cpumask_scnprintf(buffer, 4096, nohz_full);
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "Adaptive-ticks CPUs: %s\n", buffer);
|
|
||||||
+out:
|
|
||||||
cpumask_scnprintf(buffer, 4096, banned_cpus);
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "Banned CPUs: %s\n", buffer);
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -17,8 +17,8 @@ index 010e672..48d3d0d 100644
|
|||||||
indent[i] = log_indent[0];
|
indent[i] = log_indent[0];
|
||||||
|
|
||||||
indent[i] = '\0';
|
indent[i] = '\0';
|
||||||
- log(TO_CONSOLE, LOG_INFO, "%sInterrupt %i node_num is %d (%s/%lu:%lu) \n", indent,
|
- log(TO_CONSOLE, LOG_INFO, "%sInterrupt %i node_num is %d (%s/%" PRIu64 ":%" PRIu64 ") \n", indent,
|
||||||
+ log(TO_ALL, 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/%" PRIu64 ":%" PRIu64 ") \n", indent,
|
||||||
info->irq, irq_numa_node(info)->number, classes[info->class], info->load, (info->irq_count - info->last_irq_count));
|
info->irq, irq_numa_node(info)->number, classes[info->class], info->load, (info->irq_count - info->last_irq_count));
|
||||||
free(indent);
|
free(indent);
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
BIN
irqbalance-1.8.0.tar.gz
Normal file
BIN
irqbalance-1.8.0.tar.gz
Normal file
Binary file not shown.
@ -1,7 +1,7 @@
|
|||||||
Summary: A dynamic adaptive IRQ balancing daemon
|
Summary: A dynamic adaptive IRQ balancing daemon
|
||||||
Name: irqbalance
|
Name: irqbalance
|
||||||
Version: 1.7.0
|
Version: 1.8.0
|
||||||
Release: 5
|
Release: 1
|
||||||
Epoch: 3
|
Epoch: 3
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
Source0: https://github.com/Irqbalance/irqbalance/archive/v%{version}.tar.gz#/irqbalance-%{version}.tar.gz
|
Source0: https://github.com/Irqbalance/irqbalance/archive/v%{version}.tar.gz#/irqbalance-%{version}.tar.gz
|
||||||
@ -23,16 +23,6 @@ Requires: numactl-libs
|
|||||||
|
|
||||||
%define _hardened_build 1
|
%define _hardened_build 1
|
||||||
|
|
||||||
|
|
||||||
Patch6000: backport-add-env-variable-to-ban-cpus-using-cpulist-syntax.patch
|
|
||||||
Patch6001: backport-activate_mapping-activate-only-online-CPUs.patch
|
|
||||||
Patch6002: backport-log-correctly-for-isolated-and-nohz_full-cpus.patch
|
|
||||||
Patch6003: backport-add-irq-hotplug-feature-for-irqbalance.patch
|
|
||||||
Patch6004: backport-Add-log-for-hotplug-appropriately.patch
|
|
||||||
Patch6005: backport-Add-hot-pull-method-for-irqbalance.patch
|
|
||||||
Patch6006: backport-Also-fetch-node-info-for-non-PCI-devices.patch
|
|
||||||
Patch6007: backport-Hotplug-may-occur-again-during-sleep-so-wait-until-t.patch
|
|
||||||
|
|
||||||
Patch9000: feature-aarch64-add-the-regular-to-get-the-correct-i.patch
|
Patch9000: feature-aarch64-add-the-regular-to-get-the-correct-i.patch
|
||||||
Patch9001: feature-add-new-user-irq-policy-config-rule.patch
|
Patch9001: feature-add-new-user-irq-policy-config-rule.patch
|
||||||
Patch9002: feature-add-the-switch-of-printing-log.patch
|
Patch9002: feature-add-the-switch-of-printing-log.patch
|
||||||
@ -83,7 +73,8 @@ cd -
|
|||||||
install -D -p -m 0755 %{name} %{buildroot}%{_sbindir}/%{name}
|
install -D -p -m 0755 %{name} %{buildroot}%{_sbindir}/%{name}
|
||||||
install -D -p -m 0644 %{SOURCE1} %{buildroot}/%{_unitdir}/%{name}.service
|
install -D -p -m 0644 %{SOURCE1} %{buildroot}/%{_unitdir}/%{name}.service
|
||||||
install -D -p -m 0644 %{SOURCE2} %{buildroot}%{_sysconfdir}/sysconfig/%{name}
|
install -D -p -m 0644 %{SOURCE2} %{buildroot}%{_sysconfdir}/sysconfig/%{name}
|
||||||
install -D -p -m 0755 %{SOURCE3} %{buildroot}%{_sbindir}/irq_balancer
|
install -D -p -m 0755 %{SOURCE3} %{buildroot}%{_sysconfdir}/sysconfig/%{name}.rules
|
||||||
|
install -D -p -m 0755 %{SOURCE4} %{buildroot}%{_sbindir}/irq_balancer
|
||||||
|
|
||||||
install -D -p -m 0755 ui/irqbalance_client.h %{buildroot}/%{_includedir}/irqbalance_client.h
|
install -D -p -m 0755 ui/irqbalance_client.h %{buildroot}/%{_includedir}/irqbalance_client.h
|
||||||
install -D -p -m 0755 ui/libirqbalance_client.so %{buildroot}/%{_libdir}/libirqbalance_client.so
|
install -D -p -m 0755 ui/libirqbalance_client.so %{buildroot}/%{_libdir}/libirqbalance_client.so
|
||||||
@ -99,6 +90,7 @@ make check
|
|||||||
%{_sbindir}/%{name}
|
%{_sbindir}/%{name}
|
||||||
%{_unitdir}/%{name}.service
|
%{_unitdir}/%{name}.service
|
||||||
%config(noreplace) %{_sysconfdir}/sysconfig/%{name}
|
%config(noreplace) %{_sysconfdir}/sysconfig/%{name}
|
||||||
|
%{_sysconfdir}/sysconfig/%{name}.rules
|
||||||
%{_sbindir}/irq_balancer
|
%{_sbindir}/irq_balancer
|
||||||
|
|
||||||
%files devel
|
%files devel
|
||||||
@ -126,6 +118,12 @@ fi
|
|||||||
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Apr 17 2021 Liu Chao <liuchao173@huawei.com> - 3:1.8.0-1
|
||||||
|
- Type:enhanced
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC:upgrade to v1.8.0
|
||||||
|
|
||||||
* Fri Apr 9 2021 Liu Chao <liuchao173@huawei.com> - 3:1.7.0-5
|
* Fri Apr 9 2021 Liu Chao <liuchao173@huawei.com> - 3:1.7.0-5
|
||||||
- Type:enhanced
|
- Type:enhanced
|
||||||
- ID:NA
|
- ID:NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user