!81 sync upstream bugfix commits
From: @chinyu0704 Reviewed-by: @SuperSix173 Signed-off-by: @SuperSix173
This commit is contained in:
commit
7465df754a
@ -0,0 +1,129 @@
|
|||||||
|
From df7b5434bc19b3ea74af83393adbe901c2d11d8f Mon Sep 17 00:00:00 2001
|
||||||
|
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
||||||
|
Date: Wed, 1 Dec 2021 15:35:20 +0800
|
||||||
|
Subject: [PATCH] Add '\0' to the end of strings to avoid heap buffer overflow
|
||||||
|
|
||||||
|
Stroul, strlen, strtok will read or write out of bounds when recv_msg
|
||||||
|
doesn't include '\0'. Especially strtok will write '\0' when it find a
|
||||||
|
space, which may overwrite the head of the chunk in glibc, and
|
||||||
|
irqbalance will core dump.
|
||||||
|
|
||||||
|
core's stack:
|
||||||
|
(gdb) bt
|
||||||
|
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
|
||||||
|
#1 0x00007f7a4def7b41 in __GI_abort () at abort.c:79
|
||||||
|
#2 0x00007f7a4df3835b in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f7a4e03f885 "%s\n") at ../sysdeps/posix/libc_fatal.c:181
|
||||||
|
#3 0x00007f7a4df3eaca in malloc_printerr (str=str@entry=0x7f7a4e040b08 "corrupted size vs. prev_size while consolidating") at malloc.c:5390
|
||||||
|
#4 0x00007f7a4df3f910 in _int_free (av=0x7f7a4e06eaa0 <main_arena>, p=0x55f837b201f0, have_lock=<optimized out>) at malloc.c:4332
|
||||||
|
#5 0x00007f7a4e2e4796 in magazine_cache_trim (stamp=<optimized out>, ix=<optimized out>, allocator=0x7f7a4e399dc0 <allocator>) at ../glib/gslice.c:678
|
||||||
|
#6 magazine_cache_push_magazine (ix=<optimized out>, magazine_chunks=<optimized out>, count=51) at ../glib/gslice.c:709
|
||||||
|
#7 0x00007f7a4e2e483c in thread_memory_magazine2_unload (tmem=tmem@entry=0x55f837af3660, ix=ix@entry=1) at ../glib/gslice.c:808
|
||||||
|
#8 0x00007f7a4e2e5dd9 in g_slice_free_chain_with_offset (mem_size=24, mem_chain=<optimized out>, next_offset=8) at ../glib/gslice.c:1198
|
||||||
|
#9 0x00007f7a4e2c2502 in g_list_free (list=<optimized out>) at ../glib/glist.c:182
|
||||||
|
#10 0x000055f836036210 in free_cpu_topo (data=0x55f837b77100) at cputree.c:544
|
||||||
|
#11 0x00007f7a4e2c2f6d in g_list_foreach (list=<optimized out>, list@entry=0x55f837b970c0, func=0x55f836036200 <free_cpu_topo>, user_data=user_data@entry=0x0) at ../glib/glist.c:1069
|
||||||
|
#12 0x00007f7a4e2c2f9b in g_list_free_full (list=0x55f837b970c0, free_func=<optimized out>) at ../glib/glist.c:223
|
||||||
|
#13 0x000055f83603780b in clear_cpu_tree () at cputree.c:559
|
||||||
|
#14 0x000055f83603873d in free_object_tree () at irqbalance.c:248
|
||||||
|
#15 0x000055f83603bb04 in scan (data=data@entry=0x0) at irqbalance.c:301
|
||||||
|
#16 0x00007f7a4e2c768d in g_timeout_dispatch (source=0x55f837afd000, callback=0x55f83603baa0 <poll_hint_affinity_and_scan>, user_data=0x0) at ../glib/gmain.c:4705
|
||||||
|
#17 0x00007f7a4e2c6ba4 in g_main_dispatch (context=0x55f837b39af0) at ../glib/gmain.c:3216
|
||||||
|
#18 g_main_context_dispatch (context=context@entry=0x55f837b39af0) at ../glib/gmain.c:3881
|
||||||
|
#19 0x00007f7a4e2c6f40 in g_main_context_iterate (context=0x55f837b39af0, block=block@entry=1, dispatch=dispatch@entry=1, self=self@entry=0x55f837b38000) at ../glib/gmain.c:3954
|
||||||
|
#20 0x00007f7a4e2c721d in g_main_loop_run (loop=0x55f837afc3e0) at ../glib/gmain.c:4148
|
||||||
|
#21 0x000055f836032ec8 in main (argc=3, argv=<optimized out>) at irqbalance.c:706
|
||||||
|
(gdb) x/128gx 0x55f837b20180
|
||||||
|
0x55f837b20180: 0x0000000000000000 0x0000000100000000
|
||||||
|
0x55f837b20190: 0x0000000000000000 0x000055f837b275d0
|
||||||
|
0x55f837b201a0: 0x0000000000000000 0x0000000000000051
|
||||||
|
0x55f837b201b0: 0x312c30312c392c34 0x2c37312c35312c33
|
||||||
|
0x55f837b201c0: 0x37322c34322c3232 0x332c32332c30332c
|
||||||
|
0x55f837b201d0: 0x2c34342c30342c38 0x39342c38342c3634
|
||||||
|
0x55f837b201e0: 0x352c32342c31322c 0x332c33322c312c32
|
||||||
|
0x55f837b201f0: 0x2c30322c32352c31 0x0000000000000001
|
||||||
|
0x55f837b20200: 0x000055f837bf23f0 0x000055f837b7c870
|
||||||
|
0x55f837b20210: 0x0000000000000000 0x0000000000000000
|
||||||
|
(gdb) p (char*)0x55f837b201b0
|
||||||
|
$1 = 0x55f837b201b0 "4,9,10,13,15,17,22,24,27,30,32,38,40,44,46,48,49,21,42,52,1,23,31,52,20,\001"
|
||||||
|
|
||||||
|
asan log:
|
||||||
|
==3703578==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60600000011e at pc 0x7f86ade5687e bp 0x7ffce9f7ff60 sp 0x7ffce9f7f708
|
||||||
|
READ of size 63 at 0x60600000011e thread T0
|
||||||
|
#0 0x7f86ade5687d (/usr/lib64/libasan.so.4+0x5387d) ??:?
|
||||||
|
#1 0x56438e80affe (/usr/sbin/irqbalance+0x11ffe) /usr/src/debug/irqbalance-1.8.0.x86_64/cputree.c:121
|
||||||
|
#2 0x56438e80e97a (/usr/sbin/irqbalance+0x1597a) /usr/src/debug/irqbalance-1.8.0.x86_64/irqbalance.c:241
|
||||||
|
#3 0x56438e8167f7 (/usr/sbin/irqbalance+0x1d7f7) /usr/src/debug/irqbalance-1.8.0.x86_64/irqbalance.c:308
|
||||||
|
#4 0x7f86add1568c (/usr/lib64/libglib-2.0.so.0+0x5168c) ??:?
|
||||||
|
#5 0x7f86add14ba3 in g_main_context_dispatch (/usr/lib64/libglib-2.0.so.0+0x50ba3) ??:?
|
||||||
|
#6 0x7f86add14f3f (/usr/lib64/libglib-2.0.so.0+0x50f3f) ??:?
|
||||||
|
#7 0x7f86add1521c in g_main_loop_run (/usr/lib64/libglib-2.0.so.0+0x5121c) ??:?
|
||||||
|
#8 0x56438e8025e2 (/usr/sbin/irqbalance+0x95e2) /usr/src/debug/irqbalance-1.8.0.x86_64/irqbalance.c:706
|
||||||
|
#9 0x7f86ad930c86 in __libc_start_main (/usr/lib64/libc.so.6+0x25c86) /usr/src/debug/glibc-2.28/csu/../csu/libc-start.c:308
|
||||||
|
#10 0x56438e802919 (/usr/sbin/irqbalance+0x9919) ??:?
|
||||||
|
|
||||||
|
0x60600000011e is located 0 bytes to the right of 62-byte region [0x6060000000e0,0x60600000011e)
|
||||||
|
allocated by thread T0 here:
|
||||||
|
#0 0x7f86adee3e70 in __interceptor_malloc (/usr/lib64/libasan.so.4+0xe0e70) ??:?
|
||||||
|
#1 0x56438e80dfa8 (/usr/sbin/irqbalance+0x14fa8) /usr/src/debug/irqbalance-1.8.0.x86_64/irqbalance.c:505
|
||||||
|
#2 0x56438e81ab7f (/usr/sbin/irqbalance+0x21b7f) ??:0
|
||||||
|
|
||||||
|
Reference: https://github.com/Irqbalance/irqbalance/pull/195/commits/df7b5434bc19b3ea74af83393adbe901c2d11d8f
|
||||||
|
Conflict: NA
|
||||||
|
|
||||||
|
Signed-off-by: SuperSix173 <liuchao173@huawei.com>
|
||||||
|
---
|
||||||
|
irqbalance.c | 9 ++++++---
|
||||||
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/irqbalance.c b/irqbalance.c
|
||||||
|
index 07a245f..e8d9ba9 100644
|
||||||
|
--- a/irqbalance.c
|
||||||
|
+++ b/irqbalance.c
|
||||||
|
@@ -463,12 +463,13 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||||
|
if (!(strncmp(buff + strlen("settings "), "sleep ",
|
||||||
|
strlen("sleep ")))) {
|
||||||
|
char *sleep_string = malloc(
|
||||||
|
- sizeof(char) * (recv_size - strlen("settings sleep ")));
|
||||||
|
+ sizeof(char) * (recv_size - strlen("settings sleep ") + 1));
|
||||||
|
|
||||||
|
if (!sleep_string)
|
||||||
|
goto out_close;
|
||||||
|
strncpy(sleep_string, buff + strlen("settings sleep "),
|
||||||
|
recv_size - strlen("settings sleep "));
|
||||||
|
+ sleep_string[recv_size - strlen("settings sleep ")] = '\0';
|
||||||
|
int new_iterval = strtoul(sleep_string, NULL, 10);
|
||||||
|
if (new_iterval >= 1) {
|
||||||
|
sleep_interval = new_iterval;
|
||||||
|
@@ -478,12 +479,13 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||||
|
strlen("ban irqs ")))) {
|
||||||
|
char *end;
|
||||||
|
char *irq_string = malloc(
|
||||||
|
- sizeof(char) * (recv_size - strlen("settings ban irqs ")));
|
||||||
|
+ sizeof(char) * (recv_size - strlen("settings ban irqs ") + 1));
|
||||||
|
|
||||||
|
if (!irq_string)
|
||||||
|
goto out_close;
|
||||||
|
strncpy(irq_string, buff + strlen("settings ban irqs "),
|
||||||
|
recv_size - strlen("settings ban irqs "));
|
||||||
|
+ irq_string[recv_size - strlen("settings ban irqs ")] = '\0';
|
||||||
|
g_list_free_full(cl_banned_irqs, free);
|
||||||
|
cl_banned_irqs = NULL;
|
||||||
|
need_rescan = 1;
|
||||||
|
@@ -503,12 +505,13 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||||
|
cpu_ban_string = NULL;
|
||||||
|
|
||||||
|
cpu_ban_string = malloc(
|
||||||
|
- sizeof(char) * (recv_size - strlen("settings cpus ")));
|
||||||
|
+ sizeof(char) * (recv_size - strlen("settings cpus ") + 1));
|
||||||
|
|
||||||
|
if (!cpu_ban_string)
|
||||||
|
goto out_close;
|
||||||
|
strncpy(cpu_ban_string, buff + strlen("settings cpus "),
|
||||||
|
recv_size - strlen("settings cpus "));
|
||||||
|
+ cpu_ban_string[recv_size - strlen("settings cpus ")] = '\0';
|
||||||
|
banned_cpumask_from_ui = strtok(cpu_ban_string, " ");
|
||||||
|
if (!strncmp(banned_cpumask_from_ui, "NULL", strlen("NULL"))) {
|
||||||
|
banned_cpumask_from_ui = NULL;
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
115
backport-Add-hot-pull-method-for-irqbalance.patch
Normal file
115
backport-Add-hot-pull-method-for-irqbalance.patch
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
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
|
||||||
|
|
||||||
43
backport-Add-log-for-hotplug-appropriately.patch
Normal file
43
backport-Add-log-for-hotplug-appropriately.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
From 47f0f26d415b8a1fb2e1d04a39f27b1e4843e7b6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: hejingxian 00273181 <hejingxian@huawei.com>
|
||||||
|
Date: Fri, 9 Apr 2021 13:32:08 +0800
|
||||||
|
Subject: [PATCH] Add return value check of opendir in do_one_cpu
|
||||||
|
|
||||||
|
Reference:https://github.com/Irqbalance/irqbalance/commit/47f0f26d415b8a1fb2e1d04a39f27b1e4843e7b6
|
||||||
|
Conflict:NA
|
||||||
|
---
|
||||||
|
cputree.c | 7 ++++---
|
||||||
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/cputree.c b/cputree.c
|
||||||
|
index a8dba73..e4695f2 100644
|
||||||
|
--- a/cputree.c
|
||||||
|
+++ b/cputree.c
|
||||||
|
@@ -366,7 +366,7 @@ static void do_one_cpu(char *path)
|
||||||
|
struct topo_obj *node;
|
||||||
|
|
||||||
|
dir = opendir(path);
|
||||||
|
- do {
|
||||||
|
+ while (dir) {
|
||||||
|
entry = readdir(dir);
|
||||||
|
if (!entry)
|
||||||
|
break;
|
||||||
|
@@ -379,8 +379,9 @@ static void do_one_cpu(char *path)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- } while (entry);
|
||||||
|
- closedir(dir);
|
||||||
|
+ }
|
||||||
|
+ if (dir)
|
||||||
|
+ closedir(dir);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In case of multiple NUMA nodes within a CPU package,
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
39
backport-Also-fetch-node-info-for-non-PCI-devices.patch
Normal file
39
backport-Also-fetch-node-info-for-non-PCI-devices.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
From 028082a6a1ff650d5cdf796ac55ac26a3874372a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Liu Chao <liuchao173@huawei.com>
|
||||||
|
Date: Sat, 25 Jun 2022 14:13:10 +0800
|
||||||
|
Subject: [PATCH] add keep_going check to prevent irqbalance from failing to
|
||||||
|
exit after SIGTERM
|
||||||
|
|
||||||
|
Reference: https://github.com/Irqbalance/irqbalance/commit/028082a6a1ff650d5cdf796ac55ac26a3874372a
|
||||||
|
Conflict: NA
|
||||||
|
|
||||||
|
Signed-off-by: Liu Chao <liuchao173@huawei.com>
|
||||||
|
---
|
||||||
|
irqbalance.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/irqbalance.c b/irqbalance.c
|
||||||
|
index c520c11..5eae5b6 100644
|
||||||
|
--- a/irqbalance.c
|
||||||
|
+++ b/irqbalance.c
|
||||||
|
@@ -290,7 +290,7 @@ gboolean scan(gpointer data __attribute__((unused)))
|
||||||
|
|
||||||
|
|
||||||
|
/* cope with cpu hotplug -- detected during /proc/interrupts parsing */
|
||||||
|
- while (need_rescan || need_rebuild) {
|
||||||
|
+ while (keep_going && (need_rescan || need_rebuild)) {
|
||||||
|
int try_times = 0;
|
||||||
|
|
||||||
|
need_rescan = 0;
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
49
backport-Fix-compile-issue-with-none-AARCH64-builds.patch
Normal file
49
backport-Fix-compile-issue-with-none-AARCH64-builds.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
From ee6b3bdd15fdbaf5d6060c3c2df4e7e69dafbd06 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Neuling <mikey@neuling.org>
|
||||||
|
Date: Wed, 28 Apr 2021 10:24:05 +1000
|
||||||
|
Subject: [PATCH] Fix compile issue with none AARCH64 builds
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This recent commit broke compiling on non AARCH64 architectures:
|
||||||
|
commit d17bcc953c513f93553f531e5444553f2bf6ca46
|
||||||
|
Author: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
||||||
|
Date: Tue Apr 27 15:36:30 2021 +0800
|
||||||
|
Fix irqbalance cannot obtain the full name of irq
|
||||||
|
|
||||||
|
This results in:
|
||||||
|
procinterrupts.c:186:11: error: ‘irq_fullname’ undeclared (first use in this function); did you mean ‘irq_name’?
|
||||||
|
186 | snprintf(irq_fullname, PATH_MAX, "%s", last_token);
|
||||||
|
| ^~~~~~~~~~~~
|
||||||
|
| irq_name
|
||||||
|
procinterrupts.c:186:11: note: each undeclared identifier is reported only once for each function it appears in
|
||||||
|
|
||||||
|
This fixes it.
|
||||||
|
|
||||||
|
Reference:https://github.com/Irqbalance/irqbalance/commit/ee6b3bdd15fdbaf5d6060c3c2df4e7e69dafbd06
|
||||||
|
Conflict:NA
|
||||||
|
|
||||||
|
Signed-off-by: Michael Neuling <mikey@neuling.org>
|
||||||
|
---
|
||||||
|
procinterrupts.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||||
|
index 8673f2d..e372671 100644
|
||||||
|
--- a/procinterrupts.c
|
||||||
|
+++ b/procinterrupts.c
|
||||||
|
@@ -152,9 +152,9 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||||||
|
char *last_token = NULL;
|
||||||
|
char *p = NULL;
|
||||||
|
int is_xen_dyn = 0;
|
||||||
|
+ char irq_fullname[PATH_MAX] = {0};
|
||||||
|
#ifdef AARCH64
|
||||||
|
char *tmp = NULL;
|
||||||
|
- char irq_fullname[PATH_MAX] = {0};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
irq_name = strtok_r(savedline, " ", &savedptr);
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@ -0,0 +1,87 @@
|
|||||||
|
From d17bcc953c513f93553f531e5444553f2bf6ca46 Mon Sep 17 00:00:00 2001
|
||||||
|
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
||||||
|
Date: Tue, 27 Apr 2021 15:36:30 +0800
|
||||||
|
Subject: [PATCH] Fix irqbalance cannot obtain the full name of irq
|
||||||
|
|
||||||
|
I find some irqs are not banned when I use --banmod. Because the irq desc name in AARCH64 contains space, for example:
|
||||||
|
43: 1 0 0 0 ITS-MSI 16384 Edge PCIe PME, aerdrv, pciehp
|
||||||
|
info->name is "pciehp", so check_for_module_ban returns 0 when I use "--bannmod=aerdrv"
|
||||||
|
|
||||||
|
Reference:https://github.com/Irqbalance/irqbalance/commit/d17bcc953c513f93553f531e5444553f2bf6ca46
|
||||||
|
Conflict:NA
|
||||||
|
---
|
||||||
|
procinterrupts.c | 30 ++++++++++++++++++++----------
|
||||||
|
1 file changed, 20 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||||
|
index 854282f..8673f2d 100644
|
||||||
|
--- a/procinterrupts.c
|
||||||
|
+++ b/procinterrupts.c
|
||||||
|
@@ -148,13 +148,13 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
||||||
|
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;
|
||||||
|
+ int is_xen_dyn = 0;
|
||||||
|
#ifdef AARCH64
|
||||||
|
char *tmp = NULL;
|
||||||
|
+ char irq_fullname[PATH_MAX] = {0};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
irq_name = strtok_r(savedline, " ", &savedptr);
|
||||||
|
@@ -166,30 +166,40 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||||||
|
if (strstr(irq_name, "xen-dyn") != NULL)
|
||||||
|
is_xen_dyn = 1;
|
||||||
|
last_token = p;
|
||||||
|
+#ifdef AARCH64
|
||||||
|
+ /*
|
||||||
|
+ * /proc/interrupts format defined, after of interrupt type
|
||||||
|
+ * the reset string is mark the irq desc name.
|
||||||
|
+ */
|
||||||
|
+ if (strncmp(irq_name, "Level", strlen("Level")) == 0 ||
|
||||||
|
+ strncmp(irq_name, "Edge", strlen("Edge")) == 0)
|
||||||
|
+ break;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AARCH64
|
||||||
|
- irq_name = last_token;
|
||||||
|
- tmp = strchr(irq_name, '\n');
|
||||||
|
- if (tmp)
|
||||||
|
- *tmp = 0;
|
||||||
|
+ snprintf(irq_fullname, PATH_MAX, "%s %s", last_token, savedptr);
|
||||||
|
+ tmp = strchr(irq_fullname, '\n');
|
||||||
|
+ if (tmp)
|
||||||
|
+ *tmp = 0;
|
||||||
|
+#else
|
||||||
|
+ snprintf(irq_fullname, PATH_MAX, "%s", last_token);
|
||||||
|
#endif
|
||||||
|
- irq_mod = last_token;
|
||||||
|
info->irq = irq;
|
||||||
|
|
||||||
|
- if (strstr(irq_name, "-event") != NULL && is_xen_dyn == 1) {
|
||||||
|
+ if (strstr(irq_fullname, "-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);
|
||||||
|
+ guess_arm_irq_hints(irq_fullname, info);
|
||||||
|
#else
|
||||||
|
info->type = IRQ_TYPE_LEGACY;
|
||||||
|
info->class = IRQ_OTHER;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
info->numa_node = get_numa_node(0);
|
||||||
|
- info->name = strdup(irq_mod);
|
||||||
|
+ info->name = strdup(irq_fullname);
|
||||||
|
}
|
||||||
|
|
||||||
|
GList* collect_full_irq_list()
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
From 0a82dddbaf5702caded0d0d83a6eafaca743254d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andreas Schwab <schwab@suse.de>
|
||||||
|
Date: Mon, 27 Jun 2022 13:43:04 +0200
|
||||||
|
Subject: [PATCH] parse_proc_interrupts: fix parsing interrupt counts
|
||||||
|
|
||||||
|
The name of an interrupt chip can start with a number, stop before it.
|
||||||
|
|
||||||
|
Reference: https://github.com/Irqbalance/irqbalance/commit/0a82dddbaf5702caded0d0d83a6eafaca743254d
|
||||||
|
Conflict: NA
|
||||||
|
|
||||||
|
---
|
||||||
|
procinterrupts.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||||
|
index 57c8801..d90bf6d 100644
|
||||||
|
--- a/procinterrupts.c
|
||||||
|
+++ b/procinterrupts.c
|
||||||
|
@@ -331,7 +331,7 @@ void parse_proc_interrupts(void)
|
||||||
|
while (1) {
|
||||||
|
uint64_t C;
|
||||||
|
C = strtoull(c, &c2, 10);
|
||||||
|
- if (c==c2) /* end of numbers */
|
||||||
|
+ if (c==c2 || !strchr(" \t", *c2)) /* end of numbers */
|
||||||
|
break;
|
||||||
|
count += C;
|
||||||
|
c=c2;
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
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
|
||||||
|
|
||||||
56
backport-activate_mapping-activate-only-online-CPUs.patch
Normal file
56
backport-activate_mapping-activate-only-online-CPUs.patch
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
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
|
||||||
|
|
||||||
352
backport-add-irq-hotplug-feature-for-irqbalance.patch
Normal file
352
backport-add-irq-hotplug-feature-for-irqbalance.patch
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
From 522883505d3b02e3294f045f49007b61c00e2c31 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chao Liu <liuchao173@huawei.com>
|
||||||
|
Date: Wed, 8 Jun 2022 10:04:02 +0800
|
||||||
|
Subject: [PATCH] check whether savedptr is NULL before invoking strlen
|
||||||
|
|
||||||
|
Reference: https://github.com/Irqbalance/irqbalance/commit/522883505d3b02e3294f045f49007b61c00e2c31
|
||||||
|
Conflict: NA
|
||||||
|
|
||||||
|
savedptr can be null in musl libc, so the strlen(NULL) will segfault
|
||||||
|
|
||||||
|
Signed-off-by: Chao Liu <liuchao173@huawei.com>
|
||||||
|
---
|
||||||
|
procinterrupts.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||||
|
index 9015177..57c8801 100644
|
||||||
|
--- a/procinterrupts.c
|
||||||
|
+++ b/procinterrupts.c
|
||||||
|
@@ -178,7 +178,7 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AARCH64
|
||||||
|
- if (strlen(savedptr) > 0) {
|
||||||
|
+ if (savedptr && strlen(savedptr) > 0) {
|
||||||
|
snprintf(irq_fullname, PATH_MAX, "%s %s", last_token, savedptr);
|
||||||
|
tmp = strchr(irq_fullname, '\n');
|
||||||
|
if (tmp)
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
39
backport-fix-opendir-fails-in-check_platform_device.patch
Normal file
39
backport-fix-opendir-fails-in-check_platform_device.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
From a9f0290a6754a475eb95818dd38dc401370da071 Mon Sep 17 00:00:00 2001
|
||||||
|
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
||||||
|
Date: Mon, 23 Aug 2021 19:40:41 +0800
|
||||||
|
Subject: [PATCH] fix opendir fails in check_platform_device
|
||||||
|
|
||||||
|
Reference: https://github.com/Irqbalance/irqbalance/commit/a9f0290a6754a475eb95818dd38dc401370da071
|
||||||
|
Conflict: NA
|
||||||
|
|
||||||
|
When irq name does not contain spaces, savedptr is an empty string and irq_fullname will have a extra space at the end like "LNRO0005:00 ".
|
||||||
|
So opendir in check_platform_device will fail, and irqbalance prints log:
|
||||||
|
"No directory /sys/devices/platform/LNRO0005:00 /: No such file or directory"
|
||||||
|
---
|
||||||
|
procinterrupts.c | 10 ++++++----
|
||||||
|
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||||
|
index e372671..9015177 100644
|
||||||
|
--- a/procinterrupts.c
|
||||||
|
+++ b/procinterrupts.c
|
||||||
|
@@ -178,10 +178,12 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AARCH64
|
||||||
|
- snprintf(irq_fullname, PATH_MAX, "%s %s", last_token, savedptr);
|
||||||
|
- tmp = strchr(irq_fullname, '\n');
|
||||||
|
- if (tmp)
|
||||||
|
- *tmp = 0;
|
||||||
|
+ if (strlen(savedptr) > 0) {
|
||||||
|
+ snprintf(irq_fullname, PATH_MAX, "%s %s", last_token, savedptr);
|
||||||
|
+ tmp = strchr(irq_fullname, '\n');
|
||||||
|
+ if (tmp)
|
||||||
|
+ *tmp = 0;
|
||||||
|
+ }
|
||||||
|
#else
|
||||||
|
snprintf(irq_fullname, PATH_MAX, "%s", last_token);
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
57
backport-log-correctly-for-isolated-and-nohz_full-cpus.patch
Normal file
57
backport-log-correctly-for-isolated-and-nohz_full-cpus.patch
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
From bbcd9a42c3cec0935b960b7f2046f1fdfab4f7ef Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vignesh Raghavendra <vigneshr@ti.com>
|
||||||
|
Date: Wed, 7 Dec 2022 19:46:19 +0530
|
||||||
|
Subject: [PATCH] procinterrupts: Fix IRQ name parsing on certain arm64 SoC
|
||||||
|
|
||||||
|
Reference: https://github.com/Irqbalance/irqbalance/commit/bbcd9a42c3cec0935b960b7f2046f1fdfab4f7ef
|
||||||
|
Conflict: NA
|
||||||
|
|
||||||
|
On arm64 SoCs like TI's K3 SoC and few other SoCs, IRQ names don't get
|
||||||
|
parsed correct due to which they end up being classified into wrong
|
||||||
|
class. Fix this by considering last token to contain IRQ name always.
|
||||||
|
|
||||||
|
Eg.: /proc/interrupt
|
||||||
|
|
||||||
|
cat /proc/interrupts
|
||||||
|
CPU0 CPU1 CPU2 CPU3
|
||||||
|
11: 7155 8882 7235 7791 GICv3 30 Level arch_timer
|
||||||
|
14: 0 0 0 0 GICv3 23 Level arm-pmu
|
||||||
|
15: 0 0 0 0 GICv3 208 Level 4b00000.spi
|
||||||
|
16: 0 0 0 0 GICv3 209 Level 4b10000.spi
|
||||||
|
116: 0 0 0 0 MSI-INTA 1716234 Level 485c0100.dma-controller chan6
|
||||||
|
134: 166 0 0 0 MSI-INTA 1970707 Level 8000000.ethernet-tx0
|
||||||
|
224: 149 0 0 0 MSI-INTA 1971731 Level 8000000.ethernet
|
||||||
|
|
||||||
|
W/o patch irqbalance -d
|
||||||
|
IRQ (11) guessed as class 0
|
||||||
|
IRQ (14) guessed as class 0
|
||||||
|
IRQ (15) guessed as class 0
|
||||||
|
IRQ (16) guessed as class 0
|
||||||
|
IRQ 485c0100.dma-controller chan6(116) guessed as class 0
|
||||||
|
IRQ (134) guessed as class 0
|
||||||
|
IRQ (224) guessed as class 0
|
||||||
|
|
||||||
|
W/ this patch
|
||||||
|
IRQ arch_timer(11) guessed as class 0
|
||||||
|
IRQ arm-pmu(14) guessed as class 0
|
||||||
|
IRQ 4b00000.spi(15) guessed as class 0
|
||||||
|
IRQ 4b10000.spi(16) guessed as class 0
|
||||||
|
IRQ 485c0100.dma-controller chan6(116) guessed as class 0
|
||||||
|
IRQ 8000000.ethernet-tx0(134) guessed as class 5
|
||||||
|
IRQ 8000000.ethernet(224) guessed as class 5
|
||||||
|
IRQ 8000000.ethernet(257) guessed as class 5
|
||||||
|
IRQ -davinci_gpio wl18xx(362) guessed as class
|
||||||
|
|
||||||
|
Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
|
||||||
|
---
|
||||||
|
procinterrupts.c | 12 +++++++-----
|
||||||
|
1 file changed, 7 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||||
|
index e91b203..ec7a52b 100644
|
||||||
|
--- a/procinterrupts.c
|
||||||
|
+++ b/procinterrupts.c
|
||||||
|
@@ -178,12 +178,14 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AARCH64
|
||||||
|
- if (savedptr && strlen(savedptr) > 0) {
|
||||||
|
+ if (savedptr && strlen(savedptr) > 0)
|
||||||
|
snprintf(irq_fullname, PATH_MAX, "%s %s", last_token, savedptr);
|
||||||
|
- tmp = strchr(irq_fullname, '\n');
|
||||||
|
- if (tmp)
|
||||||
|
- *tmp = 0;
|
||||||
|
- }
|
||||||
|
+ else
|
||||||
|
+ snprintf(irq_fullname, PATH_MAX, "%s", last_token);
|
||||||
|
+
|
||||||
|
+ tmp = strchr(irq_fullname, '\n');
|
||||||
|
+ if (tmp)
|
||||||
|
+ *tmp = 0;
|
||||||
|
#else
|
||||||
|
snprintf(irq_fullname, PATH_MAX, "%s", last_token);
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
||||||
46
backport-remove-no-existing-irq-in-banned_irqs.patch
Normal file
46
backport-remove-no-existing-irq-in-banned_irqs.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From 066499ad5231a8a8d37f08a3af5dd6c38431ce6f Mon Sep 17 00:00:00 2001
|
||||||
|
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
||||||
|
Date: Fri, 7 May 2021 20:48:32 +0800
|
||||||
|
Subject: [PATCH] remove no existing irq in banned_irqs
|
||||||
|
|
||||||
|
when a banned irq doesn't exist, it won't be removed from banned_irqs
|
||||||
|
|
||||||
|
Conflict:NA
|
||||||
|
Reference:https://github.com/Irqbalance/irqbalance/pull/183/commits/066499ad5231a8a8d37f08a3af5dd6c38431ce6f
|
||||||
|
---
|
||||||
|
classify.c | 11 +++++++++--
|
||||||
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/classify.c b/classify.c
|
||||||
|
index 105ecd6..c08144f 100644
|
||||||
|
--- a/classify.c
|
||||||
|
+++ b/classify.c
|
||||||
|
@@ -869,8 +869,16 @@ static void remove_no_existing_irq(struct irq_info *info, void *data __attribute
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = g_list_find_custom(interrupts_db, info, compare_ints);
|
||||||
|
- if (entry)
|
||||||
|
+ if (entry) {
|
||||||
|
interrupts_db = g_list_delete_link(interrupts_db, entry);
|
||||||
|
+ log(TO_CONSOLE, LOG_INFO, "IRQ %d is removed from interrupts_db.\n", info->irq);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ entry = g_list_find_custom(banned_irqs, info, compare_ints);
|
||||||
|
+ if (entry) {
|
||||||
|
+ banned_irqs = g_list_delete_link(banned_irqs, entry);
|
||||||
|
+ log(TO_CONSOLE, LOG_INFO, "IRQ %d is removed from banned_irqs.\n", info->irq);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
entry = g_list_find_custom(rebalance_irq_list, info, compare_ints);
|
||||||
|
if (entry)
|
||||||
|
@@ -882,7 +890,6 @@ static void remove_no_existing_irq(struct irq_info *info, void *data __attribute
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
115
irqbalance.spec
115
irqbalance.spec
@ -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.7.0
|
||||||
Release: 4
|
Release: 20
|
||||||
Epoch: 3
|
Epoch: 3
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
Source0: https://github.com/Irqbalance/irqbalance/archive/irqbalance-%{version}.tar.gz
|
Source0: https://github.com/Irqbalance/irqbalance/archive/irqbalance-%{version}.tar.gz
|
||||||
@ -22,6 +22,23 @@ Requires: numactl-libs
|
|||||||
%define _hardened_build 1
|
%define _hardened_build 1
|
||||||
|
|
||||||
Patch6000: fix-unsigned-integer-subtraction-sign-overflow.patch
|
Patch6000: fix-unsigned-integer-subtraction-sign-overflow.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
|
||||||
|
Patch6008: backport-Add-return-value-check-of-opendir-in-do_one_cpu.patch
|
||||||
|
Patch6009: backport-Fix-irqbalance-cannot-obtain-the-full-name-of-irq.patch
|
||||||
|
Patch6010: backport-Fix-compile-issue-with-none-AARCH64-builds.patch
|
||||||
|
Patch6011: backport-remove-no-existing-irq-in-banned_irqs.patch
|
||||||
|
Patch6012: backport-Add-0-to-the-end-of-strings-to-avoid-heap-buffer-ove.patch
|
||||||
|
Patch6013: backport-Fix-parse_proc_interrupts-fix-parsing-interrupt-counts.patch
|
||||||
|
Patch6014: backport-Fix-add-keep_going-check-to-prevent-irqbalance-from-failing-to-exit-after-SIGTERM.patch
|
||||||
|
Patch6015: backport-fix-opendir-fails-in-check_platform_device.patch
|
||||||
|
Patch6016: backport-check-whether-savedptr-is-NULL-before-invoking-strle.patch
|
||||||
|
Patch6017: backport-procinterrupts-Fix-IRQ-name-parsing-on-certain-arm64.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
|
||||||
@ -79,6 +96,102 @@ fi
|
|||||||
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-20
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: procinterrupts: Fix IRQ name parsing on certain arm64 SoC
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-19
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: check whether savedptr is NULL before invoking strlen
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-18
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: fix opendir fails in check_platform_device
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-17
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: add keep_going check to prevent irqbalance from failing to exit after SIGTERM
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-16
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: parse_proc_interrupts: fix parsing interrupt counts
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-15
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: Add '\0' to the end of strings to avoid heap buffer overflow
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-14
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: remove no existing irq in banned_irqs
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-13
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: Fix compile issue with none AARCH64 builds
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-12
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: Fix irqbalance cannot obtain the full name of irq
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-11
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: Add return value check of opendir in do_one_cpu
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-10
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: Hotplug may occur again during sleep, so wait until there is no hotplug
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-9
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: Also fetch node info for non-PCI devices
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-8
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: Add hot pull method for irqbalance
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-7
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: add irq hotplug feature for irqbalance
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-6
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: log correctly for isolated and nohz_full cpus
|
||||||
|
|
||||||
|
* Thu Jan 5 2023 qinyu <qinyu32@huawei.com> - 3:1.7.0-5
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: activate_mapping: activate only online CPUs
|
||||||
|
|
||||||
* Wed Aug 25 2021 Liu Chao <liuchao173@huawei.com> - 3:1.7.0-4
|
* Wed Aug 25 2021 Liu Chao <liuchao173@huawei.com> - 3:1.7.0-4
|
||||||
- Type:bugfix
|
- Type:bugfix
|
||||||
- ID:NA
|
- ID:NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user