rebase to v1.7.0
This commit is contained in:
parent
322199ddcd
commit
3a0401770d
@ -1,26 +0,0 @@
|
|||||||
From a79530b6d77456b304c58f7ea706bef869fa00a0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paride Legovini <pl@ninthfloor.org>
|
|
||||||
Date: Sun, 21 Jul 2019 12:18:49 +0200
|
|
||||||
Subject: [PATCH 08/53] Add irqbalance-ui.1 to dist_man_MANS
|
|
||||||
|
|
||||||
---
|
|
||||||
Makefile.am | 3 +++
|
|
||||||
1 file changed, 3 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/Makefile.am b/Makefile.am
|
|
||||||
index abf1e8d..73988b3 100644
|
|
||||||
--- a/Makefile.am
|
|
||||||
+++ b/Makefile.am
|
|
||||||
@@ -47,6 +47,9 @@ irqbalance_ui_LDADD = $(GLIB2_LIBS) $(CURSES_LIBS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
dist_man_MANS = irqbalance.1
|
|
||||||
+if IRQBALANCEUI
|
|
||||||
+dist_man_MANS += irqbalance-ui.1
|
|
||||||
+endif
|
|
||||||
|
|
||||||
CONFIG_CLEAN_FILES = debug*.list config/*
|
|
||||||
clean-generic:
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
From 724243f1744a263b3777e920526c0a4a3c042ca6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
Date: Tue, 17 Sep 2019 08:56:11 -0400
|
|
||||||
Subject: [PATCH 13/53] Add optional config file in /usr/lib
|
|
||||||
|
|
||||||
immutable distributions have a need for distribution specific configs in
|
|
||||||
a read only space, and so modify the service file to optionally read a
|
|
||||||
config file from /usr/lib/irqbalance/default.env
|
|
||||||
|
|
||||||
Addresses https://github.com/Irqbalance/irqbalance/issues/118
|
|
||||||
|
|
||||||
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
---
|
|
||||||
misc/irqbalance.service | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/misc/irqbalance.service b/misc/irqbalance.service
|
|
||||||
index bb6ed98..cb7937a 100644
|
|
||||||
--- a/misc/irqbalance.service
|
|
||||||
+++ b/misc/irqbalance.service
|
|
||||||
@@ -5,7 +5,8 @@ Documentation=https://github.com/Irqbalance/irqbalance
|
|
||||||
ConditionVirtualization=!container
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
-EnvironmentFile=/path/to/irqbalance.env
|
|
||||||
+Environmentfile=-/usr/lib/irqbalance/defaults.env
|
|
||||||
+EnvironmentFile=-/path/to/irqbalance.env
|
|
||||||
ExecStart=/usr/sbin/irqbalance --foreground $IRQBALANCE_ARGS
|
|
||||||
CapabilityBoundingSet=
|
|
||||||
NoNewPrivileges=yes
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
From 418d919c10be2430e60f81d5df35b262f072fbe5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paride Legovini <pl@ninthfloor.org>
|
|
||||||
Date: Sun, 21 Jul 2019 12:15:14 +0200
|
|
||||||
Subject: [PATCH 06/53] Add stub manpage for irqbalance-ui
|
|
||||||
|
|
||||||
---
|
|
||||||
irqbalance-ui.1 | 40 ++++++++++++++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 40 insertions(+)
|
|
||||||
create mode 100644 irqbalance-ui.1
|
|
||||||
|
|
||||||
diff --git a/irqbalance-ui.1 b/irqbalance-ui.1
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..7ca4d28
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/irqbalance-ui.1
|
|
||||||
@@ -0,0 +1,40 @@
|
|
||||||
+.de Sh \" Subsection
|
|
||||||
+.br
|
|
||||||
+.if t .Sp
|
|
||||||
+.ne 5
|
|
||||||
+.PP
|
|
||||||
+\fB\\$1\fR
|
|
||||||
+.PP
|
|
||||||
+..
|
|
||||||
+.de Sp \" Vertical space (when we can't use .PP)
|
|
||||||
+.if t .sp .5v
|
|
||||||
+.if n .sp
|
|
||||||
+..
|
|
||||||
+.de Ip \" List item
|
|
||||||
+.br
|
|
||||||
+.ie \\n(.$>=3 .ne \\$3
|
|
||||||
+.el .ne 3
|
|
||||||
+.IP "\\$1" \\$2
|
|
||||||
+..
|
|
||||||
+.TH "IRQBALANCE-UI" 1 "Jul 2019" "Linux" "irqbalance-ui"
|
|
||||||
+.SH NAME
|
|
||||||
+irqbalance-ui \- user interface for irqbalance
|
|
||||||
+.SH "SYNOPSIS"
|
|
||||||
+
|
|
||||||
+.nf
|
|
||||||
+\fBirqbalance-ui\fR
|
|
||||||
+.fi
|
|
||||||
+
|
|
||||||
+.SH "DESCRIPTION"
|
|
||||||
+
|
|
||||||
+.PP
|
|
||||||
+\fBirqbalance-ui\fR provides an ncurses-based textual user interface to
|
|
||||||
+\fBirqbalance\fR, a daemon responsible for IRQ distribution on Linux systems.
|
|
||||||
+It shows how IRQs are distributed over CPUs at given moment, and allows one to
|
|
||||||
+setup of the sleep interval and the IRQ and CPU banning at runtime.
|
|
||||||
+
|
|
||||||
+.SH "HOMEPAGE"
|
|
||||||
+https://github.com/Irqbalance/irqbalance
|
|
||||||
+
|
|
||||||
+.SH "SEE ALSO"
|
|
||||||
+irqbalance(1)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
From 30154d546fdaba74d45d1296b8d2bb8e7f139ca7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paride Legovini <pl@ninthfloor.org>
|
|
||||||
Date: Sun, 21 Jul 2019 12:15:24 +0200
|
|
||||||
Subject: [PATCH 07/53] Capitalize HOMEPAGE in irqbalance.1
|
|
||||||
|
|
||||||
---
|
|
||||||
irqbalance.1 | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.1 b/irqbalance.1
|
|
||||||
index aad27bc..3005f6b 100644
|
|
||||||
--- a/irqbalance.1
|
|
||||||
+++ b/irqbalance.1
|
|
||||||
@@ -192,6 +192,6 @@ Ban listed IRQs from being balanced, all old values of banned IRQs are forgotten
|
|
||||||
irqbalance checks SCM_CREDENTIALS of sender (only root user is allowed to interact).
|
|
||||||
Based on chosen tools, ancillary message with credentials needs to be sent with request.
|
|
||||||
|
|
||||||
-.SH "Homepage"
|
|
||||||
+.SH "HOMEPAGE"
|
|
||||||
https://github.com/Irqbalance/irqbalance
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
From 7265665307ab991d0aa452e0b4590b3c1072d0a0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sun, 22 Sep 2019 13:40:35 +0800
|
|
||||||
Subject: [PATCH 18/53] Checking return value of strdup() in
|
|
||||||
collect_full_irq_list()
|
|
||||||
|
|
||||||
strdup() may return NULL if memory allocation fail, checking the return
|
|
||||||
value before reference.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
procinterrupts.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 44c5c76..f3f57ad 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -189,6 +189,8 @@ GList* collect_full_irq_list()
|
|
||||||
continue;
|
|
||||||
|
|
||||||
savedline = strdup(line);
|
|
||||||
+ if (!savedline)
|
|
||||||
+ break;
|
|
||||||
irq_name = strtok_r(savedline, " ", &savedptr);
|
|
||||||
if (strstr(irq_name, "xen-dyn") != NULL)
|
|
||||||
is_xen_dyn = 1;
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
From 77a3914fb48c4f5ef72c8b84bba43f8a852d1725 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paride Legovini <pl@ninthfloor.org>
|
|
||||||
Date: Fri, 5 Jul 2019 00:00:05 +0200
|
|
||||||
Subject: [PATCH 02/53] Clarify the README description
|
|
||||||
|
|
||||||
---
|
|
||||||
README.md | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/README.md b/README.md
|
|
||||||
index 8e394bd..23427a9 100644
|
|
||||||
--- a/README.md
|
|
||||||
+++ b/README.md
|
|
||||||
@@ -2,10 +2,10 @@ What is Irqbalance
|
|
||||||
==================
|
|
||||||
|
|
||||||
Irqbalance is a daemon to help balance the cpu load generated by interrupts
|
|
||||||
-across all of a systems cpus. Irqbalance identifies the highest volume
|
|
||||||
-interrupt sources, and isolates them to a single unique cpu, so that load is
|
|
||||||
-spread as much as possible over an entire processor set, while minimizing cache
|
|
||||||
-miss rates for irq handlers.
|
|
||||||
+across all of a systems cpus. Irqbalance identifies the highest volume
|
|
||||||
+interrupt sources, and isolates each of them to a single unique cpu, so that
|
|
||||||
+load is spread as much as possible over an entire processor set, while
|
|
||||||
+minimizing cache miss rates for irq handlers.
|
|
||||||
|
|
||||||
## Building and Installing [](https://travis-ci.org/Irqbalance/irqbalance)
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,43 +0,0 @@
|
|||||||
From 761a3e73cfa0016e7a5f19fb2fe94702cc6925e9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Felix Yan <felixonmars@archlinux.org>
|
|
||||||
Date: Tue, 25 Feb 2020 04:15:50 +0800
|
|
||||||
Subject: [PATCH 50/53] Correct typos in irqbalance.c
|
|
||||||
|
|
||||||
---
|
|
||||||
irqbalance.c | 6 +++---
|
|
||||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index aa9941c..35c762d 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -198,7 +198,7 @@ static void parse_command_line(int argc, char **argv)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * This builds our object tree. The Heirarchy is typically pretty
|
|
||||||
+ * This builds our object tree. The Hierarchy is typically pretty
|
|
||||||
* straightforward.
|
|
||||||
* At the top are numa_nodes
|
|
||||||
* CPU packages belong to a single numa_node, unless the cache domains are in
|
|
||||||
@@ -633,7 +633,7 @@ int main(int argc, char** argv)
|
|
||||||
|
|
||||||
HZ = sysconf(_SC_CLK_TCK);
|
|
||||||
if (HZ == -1) {
|
|
||||||
- log(TO_ALL, LOG_WARNING, "Unable to determin HZ defaulting to 100\n");
|
|
||||||
+ log(TO_ALL, LOG_WARNING, "Unable to determine HZ defaulting to 100\n");
|
|
||||||
HZ = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -641,7 +641,7 @@ int main(int argc, char** argv)
|
|
||||||
int pidfd = -1;
|
|
||||||
if (daemon(0,0))
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
- /* Write pidfile which can be used to avoid starting mutiple instances */
|
|
||||||
+ /* Write pidfile which can be used to avoid starting multiple instances */
|
|
||||||
if (pidfile && (pidfd = open(pidfile,
|
|
||||||
O_WRONLY | O_CREAT | O_EXCL | O_TRUNC,
|
|
||||||
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) >= 0) {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
From c30406b2b6f0e9c23b7b0e4b9c2024d871b01557 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paride Legovini <pl@ninthfloor.org>
|
|
||||||
Date: Thu, 4 Jul 2019 23:53:37 +0200
|
|
||||||
Subject: [PATCH 01/53] Fix spelling errors
|
|
||||||
|
|
||||||
---
|
|
||||||
irqbalance.1 | 4 ++--
|
|
||||||
ui/irqbalance-ui.c | 2 +-
|
|
||||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.1 b/irqbalance.1
|
|
||||||
index 07f47d8..aad27bc 100644
|
|
||||||
--- a/irqbalance.1
|
|
||||||
+++ b/irqbalance.1
|
|
||||||
@@ -68,7 +68,7 @@ example to ban IRQs 43 and 44 from balancing, use the following command line:
|
|
||||||
|
|
||||||
.TP
|
|
||||||
.B -m, --banmod=<module_name>
|
|
||||||
-Add the specified module to the set of banned modules, similiar to --banirq.
|
|
||||||
+Add the specified module to the set of banned modules, similar to --banirq.
|
|
||||||
irqbalance will not affect the affinity of any IRQs of given modules, allowing
|
|
||||||
them to be specified manually. This option is additive and can be specified
|
|
||||||
multiple times. For example to ban all IRQs of module foo and module bar from
|
|
||||||
@@ -131,7 +131,7 @@ This indicates that the script has no policy for the referenced irq, and that
|
|
||||||
script processing should continue
|
|
||||||
.TP
|
|
||||||
.I 2
|
|
||||||
-This indicates that an error has occured in the script, and it should be skipped
|
|
||||||
+This indicates that an error has occurred in the script, and it should be skipped
|
|
||||||
(further processing to continue)
|
|
||||||
|
|
||||||
.TP
|
|
||||||
diff --git a/ui/irqbalance-ui.c b/ui/irqbalance-ui.c
|
|
||||||
index 1119665..fe00e94 100644
|
|
||||||
--- a/ui/irqbalance-ui.c
|
|
||||||
+++ b/ui/irqbalance-ui.c
|
|
||||||
@@ -390,7 +390,7 @@ gboolean key_loop(gpointer data __attribute__((unused)))
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
if(getuid() != 0) {
|
|
||||||
- printf("This program needs to be executed with root priviledges\n");
|
|
||||||
+ printf("This program needs to be executed with root privileges\n");
|
|
||||||
return EACCES;
|
|
||||||
}
|
|
||||||
if(argc > 1) {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
From 3a19387fb712c509f8137f06dbf899350ad2f84c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
Date: Mon, 8 Jun 2020 06:24:56 -0400
|
|
||||||
Subject: [PATCH 52/53] Fix typo in service unit file
|
|
||||||
|
|
||||||
Environmentfile should be EnvironmentFile
|
|
||||||
|
|
||||||
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
---
|
|
||||||
misc/irqbalance.service | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/misc/irqbalance.service b/misc/irqbalance.service
|
|
||||||
index cb7937a..e7a3336 100644
|
|
||||||
--- a/misc/irqbalance.service
|
|
||||||
+++ b/misc/irqbalance.service
|
|
||||||
@@ -5,7 +5,7 @@ Documentation=https://github.com/Irqbalance/irqbalance
|
|
||||||
ConditionVirtualization=!container
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
-Environmentfile=-/usr/lib/irqbalance/defaults.env
|
|
||||||
+EnvironmentFile=-/usr/lib/irqbalance/defaults.env
|
|
||||||
EnvironmentFile=-/path/to/irqbalance.env
|
|
||||||
ExecStart=/usr/sbin/irqbalance --foreground $IRQBALANCE_ARGS
|
|
||||||
CapabilityBoundingSet=
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
From 27335d21e392b1d17b030a7bfc1d99a9e61db421 Mon Sep 17 00:00:00 2001
|
|
||||||
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
|
||||||
Date: Fri, 20 Sep 2019 11:31:04 +0800
|
|
||||||
Subject: [PATCH 16/53] Update classify.c
|
|
||||||
|
|
||||||
---
|
|
||||||
classify.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 15d0ab2..de78bba 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -692,7 +692,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
new = get_irq_info(irqnum);
|
|
||||||
if (new)
|
|
||||||
goto done;
|
|
||||||
- get_irq_user_policy(irqnum, &pol);
|
|
||||||
+ get_irq_user_policy(devpath, irqnum, &pol);
|
|
||||||
if ((pol.ban == 1) || (check_for_irq_ban(irqnum, tmp_irqs))) {
|
|
||||||
add_banned_irq(irqnum, &banned_irqs);
|
|
||||||
goto done;
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,121 +0,0 @@
|
|||||||
From 55c5c321c73e4c9b54e041ba8c7d542598685bae Mon Sep 17 00:00:00 2001
|
|
||||||
From: l00520965 <liuchao173@huawei.com>
|
|
||||||
Date: Wed, 11 Mar 2020 11:46:42 +0800
|
|
||||||
Subject: [PATCH 51/53] arm64: Add irq aff change check For aarch64, the PPIs
|
|
||||||
format in /proc/interrputs can be parsed and add to interrupt db, and next,
|
|
||||||
the number of interrupts is counted and used to calculate the load. Finally
|
|
||||||
these interrupts maybe scheduled between the NUMA domains.
|
|
||||||
|
|
||||||
Acctually, the PPIs cannot change aff, and it should not be added to interrupt db. This patch fix it.
|
|
||||||
|
|
||||||
Add a check before add a interrupt to db, just only reads the irq's aff, and write it back to avoid any impact on the system, According to the result of writing to fitler the irq.
|
|
||||||
---
|
|
||||||
activate.c | 8 +++++++-
|
|
||||||
classify.c | 28 +++++++++++++++++++++++++---
|
|
||||||
irqbalance.h | 2 ++
|
|
||||||
3 files changed, 34 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/activate.c b/activate.c
|
|
||||||
index ab9702d..065f880 100644
|
|
||||||
--- a/activate.c
|
|
||||||
+++ b/activate.c
|
|
||||||
@@ -48,6 +48,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
|
||||||
{
|
|
||||||
char buf[PATH_MAX];
|
|
||||||
FILE *file;
|
|
||||||
+ int ret = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* only activate mappings for irqs that have moved
|
|
||||||
@@ -70,7 +71,12 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
|
||||||
return;
|
|
||||||
|
|
||||||
cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
|
|
||||||
- fprintf(file, "%s", buf);
|
|
||||||
+ ret = fprintf(file, "%s", buf);
|
|
||||||
+ if (ret < 0) {
|
|
||||||
+ log(TO_ALL, LOG_WARNING, "cannot change irq %i's affinity, add it to banned list", info->irq);
|
|
||||||
+ add_banned_irq(info->irq);
|
|
||||||
+ remove_one_irq_from_db(info->irq);
|
|
||||||
+ }
|
|
||||||
fclose(file);
|
|
||||||
info->moved = 0; /*migration is done*/
|
|
||||||
}
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index fa900f4..9f588bc 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -256,7 +256,7 @@ static gint compare_ints(gconstpointer a, gconstpointer b)
|
|
||||||
return ai->irq - bi->irq;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void add_banned_irq(int irq, GList **list)
|
|
||||||
+static void __add_banned_irq(int irq, GList **list)
|
|
||||||
{
|
|
||||||
struct irq_info find, *new;
|
|
||||||
GList *entry;
|
|
||||||
@@ -280,9 +280,14 @@ static void add_banned_irq(int irq, GList **list)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void add_banned_irq(int irq)
|
|
||||||
+{
|
|
||||||
+ __add_banned_irq(irq, &banned_irqs);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void add_cl_banned_irq(int irq)
|
|
||||||
{
|
|
||||||
- add_banned_irq(irq, &cl_banned_irqs);
|
|
||||||
+ __add_banned_irq(irq, &cl_banned_irqs);
|
|
||||||
}
|
|
||||||
|
|
||||||
gint substr_find(gconstpointer a, gconstpointer b)
|
|
||||||
@@ -376,6 +381,23 @@ get_numa_node:
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void remove_one_irq_from_db(int irq)
|
|
||||||
+{
|
|
||||||
+ struct irq_info find, *tmp;
|
|
||||||
+ GList *entry = NULL;
|
|
||||||
+
|
|
||||||
+ find.irq = irq;
|
|
||||||
+ entry = g_list_find_custom(interrupts_db, &find, compare_ints);
|
|
||||||
+ if (!entry)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ tmp = entry->data;
|
|
||||||
+ interrupts_db = g_list_remove(interrupts_db, tmp);
|
|
||||||
+ free(tmp);
|
|
||||||
+ log(TO_CONSOLE, LOG_INFO, "IRQ %d was removed from db.\n", irq);
|
|
||||||
+ return;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void parse_user_policy_key(char *buf, int irq, struct user_irq_policy *pol)
|
|
||||||
{
|
|
||||||
char *key, *value, *end;
|
|
||||||
@@ -585,7 +607,7 @@ static void add_new_irq(char *path, struct irq_info *hint, GList *proc_interrupt
|
|
||||||
/* Set NULL devpath for the irq has no sysfs entries */
|
|
||||||
get_irq_user_policy(path, irq, &pol);
|
|
||||||
if ((pol.ban == 1) || check_for_irq_ban(irq, proc_interrupts)) { /*FIXME*/
|
|
||||||
- add_banned_irq(irq, &banned_irqs);
|
|
||||||
+ __add_banned_irq(irq, &banned_irqs);
|
|
||||||
new = get_irq_info(irq);
|
|
||||||
} else
|
|
||||||
new = add_one_irq_to_db(path, hint, &pol);
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index cd93167..bc34d7e 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -106,6 +106,8 @@ extern struct irq_info *get_irq_info(int irq);
|
|
||||||
extern void migrate_irq(GList **from, GList **to, struct irq_info *info);
|
|
||||||
extern void free_cl_opts(void);
|
|
||||||
extern void add_cl_banned_module(char *modname);
|
|
||||||
+extern void add_banned_irq(int irq);
|
|
||||||
+extern void remove_one_irq_from_db(int irq);
|
|
||||||
#define irq_numa_node(irq) ((irq)->numa_node)
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
From 5cb5795d8be047b4bc23ccf47ac3086ac98f1b06 Mon Sep 17 00:00:00 2001
|
|
||||||
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
|
||||||
Date: Tue, 10 Sep 2019 18:46:24 +0800
|
|
||||||
Subject: [PATCH 12/53] change path to devpath
|
|
||||||
|
|
||||||
keep the parameters 'path' of check_for_irq_ban function consistent with line 699.
|
|
||||||
In check_for_irq_ban,
|
|
||||||
sprintf(cmd, "%s %s %d > /dev/null",banscript, path, irq);
|
|
||||||
the banscript is unique, so i think the path should keep consistent.
|
|
||||||
---
|
|
||||||
classify.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index f40ea99..9b0177d 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -693,7 +693,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
if (new)
|
|
||||||
goto done;
|
|
||||||
get_irq_user_policy(devpath, irqnum, &pol);
|
|
||||||
- if ((pol.ban == 1) || (check_for_irq_ban(path, irqnum, tmp_irqs))) {
|
|
||||||
+ if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
|
||||||
add_banned_irq(irqnum, &banned_irqs);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,108 +0,0 @@
|
|||||||
From 503a3e6e9fc8aa1d7dd9e8ba86fb21edcdcfe502 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Fri, 11 Oct 2019 23:41:17 +0800
|
|
||||||
Subject: [PATCH 23/53] correct to use realloc() function
|
|
||||||
|
|
||||||
The man doc about realloc() say:
|
|
||||||
"
|
|
||||||
If realloc() fails the original block is left untouched; it is not
|
|
||||||
freed or move
|
|
||||||
"
|
|
||||||
|
|
||||||
So make the handling of realloc() function correctly.
|
|
||||||
|
|
||||||
In addition, there is another problem about parameter using in
|
|
||||||
sock_handle(), it should be use the address of @setup instead of @setup.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
irqbalance.c | 33 +++++++++++++++++++++++----------
|
|
||||||
1 file changed, 23 insertions(+), 10 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index a06809c..e53bf65 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -308,14 +308,18 @@ gboolean scan(gpointer data __attribute__((unused)))
|
|
||||||
void get_irq_data(struct irq_info *irq, void *data)
|
|
||||||
{
|
|
||||||
char **irqdata = (char **)data;
|
|
||||||
+ char *newptr = NULL;
|
|
||||||
+
|
|
||||||
if (!*irqdata)
|
|
||||||
- *irqdata = calloc(24 + 1 + 11 + 20 + 20 + 11, 1);
|
|
||||||
+ newptr = calloc(24 + 1 + 11 + 20 + 20 + 11, 1);
|
|
||||||
else
|
|
||||||
- *irqdata = realloc(*irqdata, strlen(*irqdata) + 24 + 1 + 11 + 20 + 20 + 11);
|
|
||||||
+ newptr = realloc(*irqdata, strlen(*irqdata) + 24 + 1 + 11 + 20 + 20 + 11);
|
|
||||||
|
|
||||||
- if (!*irqdata)
|
|
||||||
+ if (!newptr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
+ *irqdata = newptr;
|
|
||||||
+
|
|
||||||
sprintf(*irqdata + strlen(*irqdata),
|
|
||||||
"IRQ %d LOAD %lu DIFF %lu CLASS %d ", irq->irq, irq->load,
|
|
||||||
(irq->irq_count - irq->last_irq_count), irq->class);
|
|
||||||
@@ -325,6 +329,7 @@ void get_object_stat(struct topo_obj *object, void *data)
|
|
||||||
{
|
|
||||||
char **stats = (char **)data;
|
|
||||||
char *irq_data = NULL;
|
|
||||||
+ char *newptr = NULL;
|
|
||||||
size_t irqdlen;
|
|
||||||
|
|
||||||
if (g_list_length(object->interrupts) > 0) {
|
|
||||||
@@ -342,13 +347,17 @@ void get_object_stat(struct topo_obj *object, void *data)
|
|
||||||
* This should be adjusted if the string in the sprintf is changed
|
|
||||||
*/
|
|
||||||
if (!*stats) {
|
|
||||||
- *stats = calloc(irqdlen + 31 + 11 + 20 + 11 + 1, 1);
|
|
||||||
+ newptr = calloc(irqdlen + 31 + 11 + 20 + 11 + 1, 1);
|
|
||||||
} else {
|
|
||||||
- *stats = realloc(*stats, strlen(*stats) + irqdlen + 31 + 11 + 20 + 11 + 1);
|
|
||||||
+ newptr = realloc(*stats, strlen(*stats) + irqdlen + 31 + 11 + 20 + 11 + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!*stats)
|
|
||||||
+ if (!newptr) {
|
|
||||||
+ free(irq_data);
|
|
||||||
return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ *stats = newptr;
|
|
||||||
|
|
||||||
sprintf(*stats + strlen(*stats), "TYPE %d NUMBER %d LOAD %lu SAVE_MODE %d %s",
|
|
||||||
object->obj_type, object->number, object->load,
|
|
||||||
@@ -465,20 +474,24 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
if (!strncmp(buff, "setup", strlen("setup"))) {
|
|
||||||
char banned[512];
|
|
||||||
char *setup = calloc(strlen("SLEEP ") + 11 + 1, 1);
|
|
||||||
+ char *newptr = NULL;
|
|
||||||
|
|
||||||
if (!setup)
|
|
||||||
goto out_close;
|
|
||||||
snprintf(setup, strlen("SLEEP ") + 11 + 1, "SLEEP %d ", sleep_interval);
|
|
||||||
if(g_list_length(cl_banned_irqs) > 0) {
|
|
||||||
- for_each_irq(cl_banned_irqs, get_irq_data, setup);
|
|
||||||
+ for_each_irq(cl_banned_irqs, get_irq_data, &setup);
|
|
||||||
}
|
|
||||||
cpumask_scnprintf(banned, 512, banned_cpus);
|
|
||||||
- setup = realloc(setup, strlen(setup) + strlen(banned) + 7 + 1);
|
|
||||||
- if (!setup)
|
|
||||||
- goto out_close;
|
|
||||||
+ newptr = realloc(setup, strlen(setup) + strlen(banned) + 7 + 1);
|
|
||||||
+ if (!newptr)
|
|
||||||
+ goto out_free_setup;
|
|
||||||
+
|
|
||||||
+ setup = newptr;
|
|
||||||
snprintf(setup + strlen(setup), strlen(banned) + 7 + 1,
|
|
||||||
"BANNED %s", banned);
|
|
||||||
send(sock, setup, strlen(setup), 0);
|
|
||||||
+out_free_setup:
|
|
||||||
free(setup);
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
From 926fbbc1a6992917a8e23d40da164301cfcf7f3a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Thu, 24 Oct 2019 22:17:40 +0800
|
|
||||||
Subject: [PATCH 30/53] delete the useless free for banned_irqs in
|
|
||||||
free_cl_opts()
|
|
||||||
|
|
||||||
free_cl_opts() is invoked after free_irq_db(), the list @banned_irqs has
|
|
||||||
alreadly be freed in free_irq_db().
|
|
||||||
|
|
||||||
main()
|
|
||||||
--> free_object_tree();
|
|
||||||
--> free_irq_db();
|
|
||||||
--> g_list_free(banned_irqs);
|
|
||||||
-- >free_cl_opts();
|
|
||||||
|
|
||||||
So delete the useless free for @banned_irqs list in free_cl_opts().
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 1 -
|
|
||||||
1 file changed, 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 7454c5f..2c0e7ed 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -718,7 +718,6 @@ void free_cl_opts(void)
|
|
||||||
{
|
|
||||||
g_list_free_full(cl_banned_modules, free);
|
|
||||||
g_list_free_full(cl_banned_irqs, free);
|
|
||||||
- g_list_free(banned_irqs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
From 88af3aa8ddc395d187e2bb34f6d66e811c9a08d8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sun, 22 Sep 2019 00:39:10 +0800
|
|
||||||
Subject: [PATCH 17/53] delete unused local variables in
|
|
||||||
parse_proc_interrupts()
|
|
||||||
|
|
||||||
The local variable @savedline[1024] is unused in parse_proc_interrupts(),
|
|
||||||
so delete it.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
procinterrupts.c | 3 ---
|
|
||||||
1 file changed, 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 03b4593..44c5c76 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -260,7 +260,6 @@ void parse_proc_interrupts(void)
|
|
||||||
uint64_t count;
|
|
||||||
char *c, *c2;
|
|
||||||
struct irq_info *info;
|
|
||||||
- char savedline[1024];
|
|
||||||
|
|
||||||
if (getline(&line, &size, file)<=0)
|
|
||||||
break;
|
|
||||||
@@ -280,8 +279,6 @@ void parse_proc_interrupts(void)
|
|
||||||
if (!c)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
- strncpy(savedline, line, sizeof(savedline)-1);
|
|
||||||
-
|
|
||||||
*c = 0;
|
|
||||||
c++;
|
|
||||||
number = strtoul(line, NULL, 10);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
From e4c249868cb33620691b77c570ea3b4064e4389f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Pyxisha <xiashuang1@huawei.com>
|
|
||||||
Date: Thu, 29 Aug 2019 14:31:25 +0800
|
|
||||||
Subject: [PATCH 10/53] fix guess_arm_irq_hints in aarch64, irqbalance will
|
|
||||||
guess irq's class and type according to irq's name, but it did't work
|
|
||||||
properly now, a irq's name will be matched twice and class will always be
|
|
||||||
IRQ_OTHER. such as a nic interrupt, the debug log will be: IRQ eth3-tx0
|
|
||||||
(109) guessed as class 5 IRQ eth3-tx0 (109) guessed as class 0 irq's
|
|
||||||
class should be IRQ_GBETH but is IRQ_OTHER.
|
|
||||||
|
|
||||||
---
|
|
||||||
procinterrupts.c | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 2088c58..3898b10 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -137,6 +137,7 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
|
||||||
if (matches[i].refine_match)
|
|
||||||
matches[i].refine_match(name, info);
|
|
||||||
log(TO_ALL, LOG_DEBUG, "IRQ %s(%d) guessed as class %d\n", name, info->irq,info->class);
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
From 6c350eb9af2e36c40f4c1f2122e4b5b270c011b2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Weiping Zhang <zhangweiping@didiglobal.com>
|
|
||||||
Date: Fri, 8 Nov 2019 23:43:55 +0800
|
|
||||||
Subject: [PATCH 41/53] fix invalid pointer dereference banned_cpumask_from_ui
|
|
||||||
|
|
||||||
The memory of cpu_ban_string was release in sock_handle function,
|
|
||||||
so the banned_cpumask_from_ui will dereference an invalid memory.
|
|
||||||
|
|
||||||
Fix this issue by delay release memory.
|
|
||||||
|
|
||||||
Reproduce:
|
|
||||||
echo "settings cpus 0-3" | nc -U `find /var/run/irqbalance/ -name *sock`
|
|
||||||
|
|
||||||
Signed-off-by: Weiping Zhang <zhangweiping@didiglobal.com>
|
|
||||||
---
|
|
||||||
cputree.c | 7 ++++++-
|
|
||||||
irqbalance.c | 21 ++++++++++++++++++---
|
|
||||||
2 files changed, 24 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 305f617..4c5fdf5 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -39,6 +39,7 @@
|
|
||||||
#include "irqbalance.h"
|
|
||||||
|
|
||||||
extern char *banned_cpumask_from_ui;
|
|
||||||
+extern char *cpu_ban_string;
|
|
||||||
|
|
||||||
GList *cpus;
|
|
||||||
GList *cache_domains;
|
|
||||||
@@ -104,9 +105,13 @@ static void setup_banned_cpus(void)
|
|
||||||
cpus_clear(nohz_full);
|
|
||||||
|
|
||||||
/* A manually specified cpumask overrides auto-detection. */
|
|
||||||
- if (banned_cpumask_from_ui != NULL) {
|
|
||||||
+ if (cpu_ban_string != NULL && banned_cpumask_from_ui != NULL) {
|
|
||||||
cpulist_parse(banned_cpumask_from_ui,
|
|
||||||
strlen(banned_cpumask_from_ui), banned_cpus);
|
|
||||||
+ /* release it safety, it was allocated in sock_handle */
|
|
||||||
+ free(cpu_ban_string);
|
|
||||||
+ cpu_ban_string = NULL;
|
|
||||||
+ banned_cpumask_from_ui = NULL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (getenv("IRQBALANCE_BANNED_CPUS")) {
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index c9379ad..7630e38 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -65,6 +65,7 @@ int sleep_interval = SLEEP_INTERVAL;
|
|
||||||
int last_interval;
|
|
||||||
GMainLoop *main_loop;
|
|
||||||
|
|
||||||
+char *cpu_ban_string = NULL;
|
|
||||||
char *banned_cpumask_from_ui = NULL;
|
|
||||||
|
|
||||||
static void sleep_approx(int seconds)
|
|
||||||
@@ -469,7 +470,14 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
free(irq_string);
|
|
||||||
} else if (!(strncmp(buff + strlen("settings "), "cpus ",
|
|
||||||
strlen("cpus")))) {
|
|
||||||
- char *cpu_ban_string = malloc(
|
|
||||||
+ /*
|
|
||||||
+ * if cpu_ban_string has not been consumed,
|
|
||||||
+ * just ignore this request.
|
|
||||||
+ */
|
|
||||||
+ if (cpu_ban_string != NULL)
|
|
||||||
+ goto out_close;
|
|
||||||
+
|
|
||||||
+ cpu_ban_string = malloc(
|
|
||||||
sizeof(char) * (recv_size - strlen("settings cpus ")));
|
|
||||||
|
|
||||||
if (!cpu_ban_string)
|
|
||||||
@@ -479,9 +487,16 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
banned_cpumask_from_ui = strtok(cpu_ban_string, " ");
|
|
||||||
if (!strncmp(banned_cpumask_from_ui, "NULL", strlen("NULL"))) {
|
|
||||||
banned_cpumask_from_ui = NULL;
|
|
||||||
+ free(cpu_ban_string);
|
|
||||||
+ cpu_ban_string = NULL;;
|
|
||||||
+ } else {
|
|
||||||
+ /*
|
|
||||||
+ * don't free cpu_ban_string at here, it will be
|
|
||||||
+ * released after we have store it to @banned_cpus
|
|
||||||
+ * in setup_banned_cpus function.
|
|
||||||
+ */
|
|
||||||
+ need_rescan = 1;
|
|
||||||
}
|
|
||||||
- need_rescan = 1;
|
|
||||||
- free(cpu_ban_string);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!strncmp(buff, "setup", strlen("setup"))) {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
From d23f36745e4523122fbe986e53f7133e06b7d877 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Fri, 11 Oct 2019 17:30:08 +0800
|
|
||||||
Subject: [PATCH 22/53] fix resource leak for not invoking closedir() after
|
|
||||||
opendir()
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 1 +
|
|
||||||
ui/irqbalance-ui.c | 1 +
|
|
||||||
2 files changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index de78bba..be1ad0c 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -583,6 +583,7 @@ static void get_irq_user_policy(char *path, int irq, struct user_irq_policy *pol
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ closedir(poldir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/ui/irqbalance-ui.c b/ui/irqbalance-ui.c
|
|
||||||
index fe00e94..ed8f408 100644
|
|
||||||
--- a/ui/irqbalance-ui.c
|
|
||||||
+++ b/ui/irqbalance-ui.c
|
|
||||||
@@ -424,6 +424,7 @@ int main(int argc, char **argv)
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
} while((entry) && (irqbalance_pid == -1));
|
|
||||||
+ closedir(dir);
|
|
||||||
}
|
|
||||||
if(irqbalance_pid == -1) {
|
|
||||||
printf("Unable to determine irqbalance PID\n");
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,70 +0,0 @@
|
|||||||
From eab9ac80148b6c70dd025c18ecac86fae6d6bf8e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sun, 20 Oct 2019 22:48:22 +0800
|
|
||||||
Subject: [PATCH 28/53] fix resource leak on the error paths in main()
|
|
||||||
|
|
||||||
Currently, both checking for core count < 2 and init_socket() fail, just
|
|
||||||
return directly, so lead to resource leak.
|
|
||||||
|
|
||||||
Make it correct to free resource when on these situation.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
irqbalance.c | 12 ++++++++----
|
|
||||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index e53bf65..3ff5f13 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -547,6 +547,7 @@ int init_socket()
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
sigset_t sigset, old_sigset;
|
|
||||||
+ int ret = EXIT_SUCCESS;
|
|
||||||
|
|
||||||
sigemptyset(&sigset);
|
|
||||||
sigaddset(&sigset,SIGINT);
|
|
||||||
@@ -637,7 +638,7 @@ int main(int argc, char** argv)
|
|
||||||
"single cpu. Shutting down\n";
|
|
||||||
|
|
||||||
log(TO_ALL, LOG_WARNING, "%s", msg);
|
|
||||||
- exit(EXIT_SUCCESS);
|
|
||||||
+ goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -660,7 +661,8 @@ int main(int argc, char** argv)
|
|
||||||
parse_proc_stat();
|
|
||||||
|
|
||||||
if (init_socket()) {
|
|
||||||
- return EXIT_FAILURE;
|
|
||||||
+ ret = EXIT_FAILURE;
|
|
||||||
+ goto out;
|
|
||||||
}
|
|
||||||
main_loop = g_main_loop_new(NULL, FALSE);
|
|
||||||
last_interval = sleep_interval;
|
|
||||||
@@ -669,6 +671,7 @@ int main(int argc, char** argv)
|
|
||||||
|
|
||||||
g_main_loop_quit(main_loop);
|
|
||||||
|
|
||||||
+out:
|
|
||||||
free_object_tree();
|
|
||||||
free_cl_opts();
|
|
||||||
|
|
||||||
@@ -676,9 +679,10 @@ int main(int argc, char** argv)
|
|
||||||
if (!foreground_mode && pidfile)
|
|
||||||
unlink(pidfile);
|
|
||||||
/* Remove socket */
|
|
||||||
- close(socket_fd);
|
|
||||||
+ if (socket_fd > 0)
|
|
||||||
+ close(socket_fd);
|
|
||||||
if (socket_name[0])
|
|
||||||
unlink(socket_name);
|
|
||||||
|
|
||||||
- return EXIT_SUCCESS;
|
|
||||||
+ return ret;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
From 97730f051e042e67da5728a3b59528c9d0fb72d2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Pyxisha <xiashuang1@huawei.com>
|
|
||||||
Date: Mon, 15 Jul 2019 20:47:07 +0800
|
|
||||||
Subject: [PATCH 05/53] fix sleep interval when sleep_interval is changed by
|
|
||||||
socket
|
|
||||||
|
|
||||||
currently, in scan, irqbalance compare sleep_interval's address to decide if sleep_interval is changed, accutually this judgement is always false now.
|
|
||||||
|
|
||||||
sign_off_by: Shuang Xia <xiashuang1@huawei.com>
|
|
||||||
---
|
|
||||||
irqbalance.c | 14 ++++++++------
|
|
||||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index c1a0e15..d424326 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -61,6 +61,7 @@ char *pidfile = NULL;
|
|
||||||
char *polscript = NULL;
|
|
||||||
long HZ;
|
|
||||||
int sleep_interval = SLEEP_INTERVAL;
|
|
||||||
+int last_interval;
|
|
||||||
GMainLoop *main_loop;
|
|
||||||
|
|
||||||
char *banned_cpumask_from_ui = NULL;
|
|
||||||
@@ -251,7 +252,7 @@ gboolean force_rescan(gpointer data __attribute__((unused)))
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
-gboolean scan(gpointer data)
|
|
||||||
+gboolean scan(gpointer data __attribute__((unused)))
|
|
||||||
{
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "\n\n\n-----------------------------------------------------------------------------\n");
|
|
||||||
clear_work_stats();
|
|
||||||
@@ -289,9 +290,10 @@ gboolean scan(gpointer data)
|
|
||||||
keep_going = 0;
|
|
||||||
cycle_count++;
|
|
||||||
|
|
||||||
- if (data != &sleep_interval) {
|
|
||||||
- data = &sleep_interval;
|
|
||||||
- g_timeout_add_seconds(sleep_interval, scan, data);
|
|
||||||
+ /* sleep_interval may be changed by socket */
|
|
||||||
+ if (last_interval != sleep_interval) {
|
|
||||||
+ last_interval = sleep_interval;
|
|
||||||
+ g_timeout_add_seconds(sleep_interval, scan, NULL);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -623,8 +625,8 @@ int main(int argc, char** argv)
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
main_loop = g_main_loop_new(NULL, FALSE);
|
|
||||||
- int *last_interval = &sleep_interval;
|
|
||||||
- g_timeout_add_seconds(sleep_interval, scan, last_interval);
|
|
||||||
+ last_interval = sleep_interval;
|
|
||||||
+ g_timeout_add_seconds(sleep_interval, scan, NULL);
|
|
||||||
g_main_loop_run(main_loop);
|
|
||||||
|
|
||||||
g_main_loop_quit(main_loop);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,65 +0,0 @@
|
|||||||
From a23a3b9881eff000f79ca4cf9bd0e526399e6a68 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
|
||||||
Date: Fri, 6 Sep 2019 21:00:52 +0800
|
|
||||||
Subject: [PATCH 11/53] * fix the pid file generates too late problem
|
|
||||||
|
|
||||||
When the system processes many irqs with using user policy script,
|
|
||||||
the build_object_tree function will fork many child processes which costs several minutes.
|
|
||||||
In the irqbalance main process, the pid file generates after build_object_tree.
|
|
||||||
Therefore, the generation time of the pid file is several minutes later than the process start time.
|
|
||||||
When the irqbalance service is started by systemd based forking mode, systemd will check the pid file.
|
|
||||||
If the pid file generates too late, systemd will think the irqbalance service as starting failed.
|
|
||||||
---
|
|
||||||
irqbalance.c | 29 +++++++++++++++--------------
|
|
||||||
1 file changed, 15 insertions(+), 14 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index d424326..8199c06 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -573,6 +573,21 @@ int main(int argc, char** argv)
|
|
||||||
log(TO_ALL, LOG_WARNING, "Unable to determin HZ defaulting to 100\n");
|
|
||||||
HZ = 100;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ if (!foreground_mode) {
|
|
||||||
+ int pidfd = -1;
|
|
||||||
+ if (daemon(0,0))
|
|
||||||
+ exit(EXIT_FAILURE);
|
|
||||||
+ /* Write pidfile which can be used to avoid starting mutiple instances */
|
|
||||||
+ if (pidfile && (pidfd = open(pidfile,
|
|
||||||
+ O_WRONLY | O_CREAT | O_EXCL | O_TRUNC,
|
|
||||||
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) >= 0) {
|
|
||||||
+ char str[16];
|
|
||||||
+ snprintf(str, sizeof(str), "%u\n", getpid());
|
|
||||||
+ write(pidfd, str, strlen(str));
|
|
||||||
+ close(pidfd);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
|
|
||||||
build_object_tree();
|
|
||||||
if (debug_mode)
|
|
||||||
@@ -588,20 +603,6 @@ int main(int argc, char** argv)
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!foreground_mode) {
|
|
||||||
- int pidfd = -1;
|
|
||||||
- if (daemon(0,0))
|
|
||||||
- exit(EXIT_FAILURE);
|
|
||||||
- /* Write pidfile */
|
|
||||||
- if (pidfile && (pidfd = open(pidfile,
|
|
||||||
- O_WRONLY | O_CREAT | O_EXCL | O_TRUNC,
|
|
||||||
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) >= 0) {
|
|
||||||
- char str[16];
|
|
||||||
- snprintf(str, sizeof(str), "%u\n", getpid());
|
|
||||||
- write(pidfd, str, strlen(str));
|
|
||||||
- close(pidfd);
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
|
|
||||||
g_unix_signal_add(SIGINT, handler, NULL);
|
|
||||||
g_unix_signal_add(SIGTERM, handler, NULL);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,67 +0,0 @@
|
|||||||
From fc30c5e39428196a075aec92135bd6c10baae19b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Mon, 14 Oct 2019 20:44:27 +0800
|
|
||||||
Subject: [PATCH 25/53] fix the problem of banmod that memory is freed before
|
|
||||||
using
|
|
||||||
|
|
||||||
Currently strdupa() is used to allocate memory for irq_info's name in
|
|
||||||
collect_full_irq_list(), we know that it allocate memory from stack,
|
|
||||||
when the invoking function return, the memory will be freed. so if the
|
|
||||||
irq_info's name is invalid, it will lead to check_for_module_ban() no
|
|
||||||
correct.
|
|
||||||
|
|
||||||
check_for_irq_ban
|
|
||||||
check_for_module_ban(res->name) // res->name is not valid
|
|
||||||
|
|
||||||
Use strdup() instead of strdupa(), and free the memory of irq_info's
|
|
||||||
name before freeing the irq_info.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 9 ++++++++-
|
|
||||||
procinterrupts.c | 2 +-
|
|
||||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index c1ac230..550f3b6 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -750,6 +750,13 @@ static void add_missing_irq(struct irq_info *info, void *attr)
|
|
||||||
add_new_irq(info->irq, info, proc_interrupts);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void free_tmp_irqs(gpointer data)
|
|
||||||
+{
|
|
||||||
+ struct irq_info *info = data;
|
|
||||||
+
|
|
||||||
+ free(info->name);
|
|
||||||
+ free(info);
|
|
||||||
+}
|
|
||||||
|
|
||||||
void rebuild_irq_db(void)
|
|
||||||
{
|
|
||||||
@@ -779,7 +786,7 @@ void rebuild_irq_db(void)
|
|
||||||
|
|
||||||
for_each_irq(tmp_irqs, add_missing_irq, interrupts_db);
|
|
||||||
|
|
||||||
- g_list_free_full(tmp_irqs, free);
|
|
||||||
+ g_list_free_full(tmp_irqs, free_tmp_irqs);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index f3f57ad..4a7a5d5 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -229,7 +229,7 @@ GList* collect_full_irq_list()
|
|
||||||
info->class = IRQ_OTHER;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
- info->name = strdupa(irq_mod);
|
|
||||||
+ info->name = strdup(irq_mod);
|
|
||||||
tmp_list = g_list_append(tmp_list, info);
|
|
||||||
}
|
|
||||||
free(savedline);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
From 0fab11043aef5b835ed5564dc15476cdbfb54d5b Mon Sep 17 00:00:00 2001
|
|
||||||
From: SuperSix173 <liuchao173@huawei.com>
|
|
||||||
Date: Thu, 6 Feb 2020 11:43:48 +0800
|
|
||||||
Subject: [PATCH 49/53] free cpu_ban_string when the next request come
|
|
||||||
|
|
||||||
---
|
|
||||||
cputree.c | 4 ----
|
|
||||||
irqbalance.c | 19 +++++--------------
|
|
||||||
2 files changed, 5 insertions(+), 18 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 9aa4794..bef1f40 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -118,10 +118,6 @@ static void setup_banned_cpus(void)
|
|
||||||
if (cpu_ban_string != NULL && banned_cpumask_from_ui != NULL) {
|
|
||||||
cpulist_parse(banned_cpumask_from_ui,
|
|
||||||
strlen(banned_cpumask_from_ui), banned_cpus);
|
|
||||||
- /* release it safety, it was allocated in sock_handle */
|
|
||||||
- free(cpu_ban_string);
|
|
||||||
- cpu_ban_string = NULL;
|
|
||||||
- banned_cpumask_from_ui = NULL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (getenv("IRQBALANCE_BANNED_CPUS")) {
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index e76d27b..9f65c88 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -471,12 +471,9 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
free(irq_string);
|
|
||||||
} else if (!(strncmp(buff + strlen("settings "), "cpus ",
|
|
||||||
strlen("cpus")))) {
|
|
||||||
- /*
|
|
||||||
- * if cpu_ban_string has not been consumed,
|
|
||||||
- * just ignore this request.
|
|
||||||
- */
|
|
||||||
- if (cpu_ban_string != NULL)
|
|
||||||
- goto out_close;
|
|
||||||
+ banned_cpumask_from_ui = NULL;
|
|
||||||
+ free(cpu_ban_string);
|
|
||||||
+ cpu_ban_string = NULL;
|
|
||||||
|
|
||||||
cpu_ban_string = malloc(
|
|
||||||
sizeof(char) * (recv_size - strlen("settings cpus ")));
|
|
||||||
@@ -489,15 +486,9 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
if (!strncmp(banned_cpumask_from_ui, "NULL", strlen("NULL"))) {
|
|
||||||
banned_cpumask_from_ui = NULL;
|
|
||||||
free(cpu_ban_string);
|
|
||||||
- cpu_ban_string = NULL;;
|
|
||||||
- } else {
|
|
||||||
- /*
|
|
||||||
- * don't free cpu_ban_string at here, it will be
|
|
||||||
- * released after we have store it to @banned_cpus
|
|
||||||
- * in setup_banned_cpus function.
|
|
||||||
- */
|
|
||||||
- need_rescan = 1;
|
|
||||||
+ cpu_ban_string = NULL;
|
|
||||||
}
|
|
||||||
+ need_rescan = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!strncmp(buff, "setup", strlen("setup"))) {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
From 3768776c7b4f7f79f52dc025d50a5e2d214f5b2c Mon Sep 17 00:00:00 2001
|
|
||||||
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
|
||||||
Date: Mon, 2 Dec 2019 19:46:53 +0800
|
|
||||||
Subject: [PATCH 44/53] free polscript if irqbalance exit
|
|
||||||
|
|
||||||
polscript is alloced in parse_command_line and isn't freed when irqbalance exit
|
|
||||||
---
|
|
||||||
irqbalance.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index 7630e38..5134f9d 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -702,6 +702,8 @@ int main(int argc, char** argv)
|
|
||||||
out:
|
|
||||||
free_object_tree();
|
|
||||||
free_cl_opts();
|
|
||||||
+ if (polscript)
|
|
||||||
+ free(polscript);
|
|
||||||
|
|
||||||
/* Remove pidfile */
|
|
||||||
if (!foreground_mode && pidfile)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
From 6e4ef7f8a13147c15ac542f829b5a7b6a93ce239 Mon Sep 17 00:00:00 2001
|
|
||||||
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
|
||||||
Date: Tue, 3 Dec 2019 09:30:40 +0800
|
|
||||||
Subject: [PATCH 45/53] free polscript to avoid resource leak
|
|
||||||
|
|
||||||
free polscript when irqbalance exit or the same option is passed twice on the comand line
|
|
||||||
---
|
|
||||||
irqbalance.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index 5134f9d..e76d27b 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -153,6 +153,7 @@ static void parse_command_line(int argc, char **argv)
|
|
||||||
add_cl_banned_irq((int)val);
|
|
||||||
break;
|
|
||||||
case 'l':
|
|
||||||
+ free(polscript);
|
|
||||||
polscript = strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
@@ -702,8 +703,7 @@ int main(int argc, char** argv)
|
|
||||||
out:
|
|
||||||
free_object_tree();
|
|
||||||
free_cl_opts();
|
|
||||||
- if (polscript)
|
|
||||||
- free(polscript);
|
|
||||||
+ free(polscript);
|
|
||||||
|
|
||||||
/* Remove pidfile */
|
|
||||||
if (!foreground_mode && pidfile)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
From 403b17259db89fed7a037a98948da3930fed6b24 Mon Sep 17 00:00:00 2001
|
|
||||||
From: yeyunfeng <yyfeng615@126.com>
|
|
||||||
Date: Sun, 6 Oct 2019 22:04:22 +0800
|
|
||||||
Subject: [PATCH 20/53] free the memory when getline() fail in add_one_node()
|
|
||||||
|
|
||||||
when getline() fail, the memory still need to be freed.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
numa.c | 7 +++----
|
|
||||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/numa.c b/numa.c
|
|
||||||
index f0b1a98..542e1f4 100644
|
|
||||||
--- a/numa.c
|
|
||||||
+++ b/numa.c
|
|
||||||
@@ -74,12 +74,11 @@ static void add_one_node(const char *nodename)
|
|
||||||
cpus_clear(new->mask);
|
|
||||||
} else {
|
|
||||||
ret = getline(&cpustr, &blen, f);
|
|
||||||
- if (ret <= 0) {
|
|
||||||
+ if (ret <= 0)
|
|
||||||
cpus_clear(new->mask);
|
|
||||||
- } else {
|
|
||||||
+ else
|
|
||||||
cpumask_parse_user(cpustr, ret, new->mask);
|
|
||||||
- free(cpustr);
|
|
||||||
- }
|
|
||||||
+ free(cpustr);
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
new->obj_type = OBJ_TYPE_NODE;
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,106 +0,0 @@
|
|||||||
From 50f7f4641534c8137b329f2c6cdeaa20987c9382 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Neil Horman <nhorman@hmswarspite.think-freely.org>
|
|
||||||
Date: Mon, 30 Sep 2019 11:46:37 -0400
|
|
||||||
Subject: [PATCH 19/53] getline: clean up freeing of lines from getline
|
|
||||||
|
|
||||||
It was noted that several calls to getline failed to free the resultant line,
|
|
||||||
which the man page for getline says to do even if the call fails. Clean that up
|
|
||||||
here
|
|
||||||
|
|
||||||
And while we're at it, merge some of the free calls so they're common to a
|
|
||||||
function where they can be, and not strewn all over the place
|
|
||||||
|
|
||||||
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
---
|
|
||||||
cputree.c | 29 +++++++++++++++++------------
|
|
||||||
1 file changed, 17 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 91c6111..a90cbbe 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -91,10 +91,10 @@ static void setup_banned_cpus(void)
|
|
||||||
if (getline(&line, &size, file) > 0) {
|
|
||||||
if (strlen(line) && line[0] != '\n')
|
|
||||||
cpulist_parse(line, strlen(line), isolated_cpus);
|
|
||||||
- free(line);
|
|
||||||
- line = NULL;
|
|
||||||
- size = 0;
|
|
||||||
}
|
|
||||||
+ free(line);
|
|
||||||
+ line = NULL;
|
|
||||||
+ size = 0;
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -103,10 +103,10 @@ static void setup_banned_cpus(void)
|
|
||||||
if (getline(&line, &size, file) > 0) {
|
|
||||||
if (strlen(line) && line[0] != '\n')
|
|
||||||
cpulist_parse(line, strlen(line), nohz_full);
|
|
||||||
- free(line);
|
|
||||||
- line = NULL;
|
|
||||||
- size = 0;
|
|
||||||
}
|
|
||||||
+ free(line);
|
|
||||||
+ line = NULL;
|
|
||||||
+ size = 0;
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -271,6 +271,7 @@ static void do_one_cpu(char *path)
|
|
||||||
int nodeid;
|
|
||||||
int packageid = 0;
|
|
||||||
unsigned int max_cache_index, cache_index, cache_stat;
|
|
||||||
+ int ret = 1;
|
|
||||||
|
|
||||||
/* skip offline cpus */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path,"/online"), "%s/online", path);
|
|
||||||
@@ -278,14 +279,12 @@ static void do_one_cpu(char *path)
|
|
||||||
if (file) {
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file)<=0)
|
|
||||||
- return;
|
|
||||||
+ if (getline(&line, &size, file)>0)
|
|
||||||
+ ret = (line && line[0]=='0') ? 1 : 0;
|
|
||||||
fclose(file);
|
|
||||||
- if (line && line[0]=='0') {
|
|
||||||
- free(line);
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
free(line);
|
|
||||||
+ if (ret)
|
|
||||||
+ return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu = calloc(sizeof(struct topo_obj), 1);
|
|
||||||
@@ -327,6 +326,8 @@ static void do_one_cpu(char *path)
|
|
||||||
cpumask_parse_user(line, strlen(line), package_mask);
|
|
||||||
fclose(file);
|
|
||||||
free(line);
|
|
||||||
+ line = NULL;
|
|
||||||
+ size = 0;
|
|
||||||
}
|
|
||||||
/* try to read the package id */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path, "/topology/physical_package_id"),
|
|
||||||
@@ -339,6 +340,8 @@ static void do_one_cpu(char *path)
|
|
||||||
packageid = strtoul(line, NULL, 10);
|
|
||||||
fclose(file);
|
|
||||||
free(line);
|
|
||||||
+ line = NULL;
|
|
||||||
+ size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* try to read the cache mask; if it doesn't exist assume solitary */
|
|
||||||
@@ -372,6 +375,8 @@ static void do_one_cpu(char *path)
|
|
||||||
cpumask_parse_user(line, strlen(line), cache_mask);
|
|
||||||
fclose(file);
|
|
||||||
free(line);
|
|
||||||
+ line = NULL;
|
|
||||||
+ size = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
From 0a28c3a67e43ec8f96ed046e9e076fb8a454ab01 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Adrian Friedli <adi@koalatux.ch>
|
|
||||||
Date: Tue, 27 Aug 2019 22:30:22 +0200
|
|
||||||
Subject: [PATCH 09/53] improve comments in env file
|
|
||||||
|
|
||||||
---
|
|
||||||
misc/irqbalance.env | 21 ++++++++++++---------
|
|
||||||
1 file changed, 12 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/misc/irqbalance.env b/misc/irqbalance.env
|
|
||||||
index bd87e3d..23570b2 100644
|
|
||||||
--- a/misc/irqbalance.env
|
|
||||||
+++ b/misc/irqbalance.env
|
|
||||||
@@ -1,26 +1,29 @@
|
|
||||||
# irqbalance is a daemon process that distributes interrupts across
|
|
||||||
-# CPUS on SMP systems. The default is to rebalance once every 10
|
|
||||||
-# seconds. This is the environment file that is specified to systemd via the
|
|
||||||
+# CPUs on SMP systems. The default is to rebalance once every 10
|
|
||||||
+# seconds. This is the environment file that is specified to systemd via the
|
|
||||||
# EnvironmentFile key in the service unit file (or via whatever method the init
|
|
||||||
-# system you're using has.
|
|
||||||
+# system you're using has).
|
|
||||||
+
|
|
||||||
#
|
|
||||||
-# ONESHOT=yes
|
|
||||||
-# after starting, wait for a minute, then look at the interrupt
|
|
||||||
+# IRQBALANCE_ONESHOT
|
|
||||||
+# After starting, wait for a minute, then look at the interrupt
|
|
||||||
# load and balance it once; after balancing exit and do not change
|
|
||||||
# it again.
|
|
||||||
+#
|
|
||||||
#IRQBALANCE_ONESHOT=
|
|
||||||
|
|
||||||
#
|
|
||||||
# IRQBALANCE_BANNED_CPUS
|
|
||||||
-# 64 bit bitmask which allows you to indicate which cpu's should
|
|
||||||
-# be skipped when reblancing irqs. Cpu numbers which have their
|
|
||||||
+# 64 bit bitmask which allows you to indicate which CPUs should
|
|
||||||
+# be skipped when reblancing IRQs. CPU numbers which have their
|
|
||||||
# corresponding bits set to one in this mask will not have any
|
|
||||||
-# irq's assigned to them on rebalance
|
|
||||||
+# IRQs assigned to them on rebalance.
|
|
||||||
#
|
|
||||||
#IRQBALANCE_BANNED_CPUS=
|
|
||||||
|
|
||||||
#
|
|
||||||
# IRQBALANCE_ARGS
|
|
||||||
-# append any args here to the irqbalance daemon as documented in the man page
|
|
||||||
+# Append any args here to the irqbalance daemon as documented in the man
|
|
||||||
+# page.
|
|
||||||
#
|
|
||||||
#IRQBALANCE_ARGS=
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,105 +0,0 @@
|
|||||||
From e9e28114036a198b311ee17dd542540f749e6a68 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
|
||||||
Date: Mon, 20 Jan 2020 23:20:47 +0800
|
|
||||||
Subject: [PATCH 48/53] improve irq migrate rule to avoid high irq load
|
|
||||||
|
|
||||||
---
|
|
||||||
irqbalance.c | 9 +++++++--
|
|
||||||
irqbalance.h | 1 +
|
|
||||||
irqlist.c | 10 +++++++++-
|
|
||||||
3 files changed, 17 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index be111f1..513ab5a 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -67,6 +67,7 @@ GMainLoop *main_loop;
|
|
||||||
|
|
||||||
char *cpu_ban_string = NULL;
|
|
||||||
char *banned_cpumask_from_ui = NULL;
|
|
||||||
+unsigned long migrate_ratio = 0;
|
|
||||||
|
|
||||||
static void sleep_approx(int seconds)
|
|
||||||
{
|
|
||||||
@@ -96,6 +97,7 @@ struct option lopts[] = {
|
|
||||||
{"banmod", 1 , NULL, 'm'},
|
|
||||||
{"interval", 1 , NULL, 't'},
|
|
||||||
{"version", 0, NULL, 'V'},
|
|
||||||
+ {"migrateval", 1, NULL, 'e'},
|
|
||||||
{0, 0, 0, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -103,7 +105,7 @@ static void usage(void)
|
|
||||||
{
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "irqbalance [--oneshot | -o] [--debug | -d] [--foreground | -f] [--journal | -j]\n");
|
|
||||||
log(TO_CONSOLE, LOG_INFO, " [--powerthresh= | -p <off> | <n>] [--banirq= | -i <n>] [--banmod= | -m <module>] [--policyscript= | -l <script>]\n");
|
|
||||||
- log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>]\n");
|
|
||||||
+ log(TO_CONSOLE, LOG_INFO, " [--pid= | -s <file>] [--deepestcache= | -c <n>] [--interval= | -t <n>] [--migrateval= | -e <n>]\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void version(void)
|
|
||||||
@@ -118,7 +120,7 @@ static void parse_command_line(int argc, char **argv)
|
|
||||||
unsigned long val;
|
|
||||||
|
|
||||||
while ((opt = getopt_long(argc, argv,
|
|
||||||
- "odfjVi:p:s:c:l:m:t:",
|
|
||||||
+ "odfjVi:p:s:c:l:m:t:e:",
|
|
||||||
lopts, &longind)) != -1) {
|
|
||||||
|
|
||||||
switch(opt) {
|
|
||||||
@@ -187,6 +189,9 @@ static void parse_command_line(int argc, char **argv)
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
+ case 'e':
|
|
||||||
+ migrate_ratio = strtoul(optarg, NULL, 10);
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 3e3ea5d..cd93167 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -77,6 +77,7 @@ extern char *polscript;
|
|
||||||
extern cpumask_t banned_cpus;
|
|
||||||
extern cpumask_t unbanned_cpus;
|
|
||||||
extern long HZ;
|
|
||||||
+extern unsigned long migrate_ratio;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Numa node access routines
|
|
||||||
diff --git a/irqlist.c b/irqlist.c
|
|
||||||
index 95ccc7a..9ab321a 100644
|
|
||||||
--- a/irqlist.c
|
|
||||||
+++ b/irqlist.c
|
|
||||||
@@ -76,6 +76,7 @@ static void compute_deviations(struct topo_obj *obj, void *data)
|
|
||||||
static void move_candidate_irqs(struct irq_info *info, void *data)
|
|
||||||
{
|
|
||||||
struct load_balance_info *lb_info = data;
|
|
||||||
+ unsigned long delta_load = 0;
|
|
||||||
|
|
||||||
/* Don't rebalance irqs that don't want it */
|
|
||||||
if (info->level == BALANCE_NONE)
|
|
||||||
@@ -91,10 +92,17 @@ static void move_candidate_irqs(struct irq_info *info, void *data)
|
|
||||||
if (info->load <= 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
+ if (migrate_ratio > 0) {
|
|
||||||
+ delta_load = (lb_info->adjustment_load - lb_info->min_load) / migrate_ratio;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* If we can migrate an irq without swapping the imbalance do it. */
|
|
||||||
- if ((lb_info->adjustment_load - info->load) > (lb_info->min_load + info->load)) {
|
|
||||||
+ if ((lb_info->min_load + info->load) - (lb_info->adjustment_load - info->load) < delta_load) {
|
|
||||||
lb_info->adjustment_load -= info->load;
|
|
||||||
lb_info->min_load += info->load;
|
|
||||||
+ if (lb_info->min_load > lb_info->adjustment_load) {
|
|
||||||
+ lb_info->min_load = lb_info->adjustment_load;
|
|
||||||
+ }
|
|
||||||
} else
|
|
||||||
return;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
Binary file not shown.
BIN
irqbalance-1.7.0.tar.gz
Normal file
BIN
irqbalance-1.7.0.tar.gz
Normal file
Binary file not shown.
@ -1,50 +0,0 @@
|
|||||||
From 47137bb3e74cdc35630cf48ed839bf82b4fcc01e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Wed, 6 Nov 2019 11:44:43 +0800
|
|
||||||
Subject: [PATCH 39/53] irqbalance: initialize package_mask before using in
|
|
||||||
do_one_cpu()
|
|
||||||
|
|
||||||
The local variable package_mask is used without initialized. add
|
|
||||||
cpus_clear(package_mask) before using, and move it to the error path
|
|
||||||
where getting packpage_mask fail from core_siblings.
|
|
||||||
|
|
||||||
In addition, the variable cache_mask is called cpu_set() twice, which
|
|
||||||
is unnecessary, so delete the redundant code.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cputree.c | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 8178ba8..aa69f56 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -299,12 +299,13 @@ static void do_one_cpu(char *path)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- cpu_set(cpu->number, package_mask);
|
|
||||||
-
|
|
||||||
/* try to read the package mask; if it doesn't exist assume solitary */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path, "/topology/core_siblings"),
|
|
||||||
"%s/topology/core_siblings", path);
|
|
||||||
- process_one_line(new_path, get_mask_from_bitmap, &package_mask);
|
|
||||||
+ if (process_one_line(new_path, get_mask_from_bitmap, &package_mask)) {
|
|
||||||
+ cpus_clear(package_mask);
|
|
||||||
+ cpu_set(cpu->number, package_mask);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* try to read the package id */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path, "/topology/physical_package_id"),
|
|
||||||
@@ -313,7 +314,6 @@ static void do_one_cpu(char *path)
|
|
||||||
|
|
||||||
/* try to read the cache mask; if it doesn't exist assume solitary */
|
|
||||||
/* We want the deepest cache level available */
|
|
||||||
- cpu_set(cpu->number, cache_mask);
|
|
||||||
max_cache_index = 0;
|
|
||||||
cache_index = 1;
|
|
||||||
do {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,91 +0,0 @@
|
|||||||
From 28df9e6207b4e894d9232b7c6d8eab7a0f02c7ad Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Wed, 30 Oct 2019 19:15:29 +0800
|
|
||||||
Subject: [PATCH 34/53] irqbalance: modify the order of input parameter for
|
|
||||||
calloc()
|
|
||||||
|
|
||||||
The man docs about calloc:
|
|
||||||
void *calloc(size_t nmemb, size_t size);
|
|
||||||
|
|
||||||
The calloc() function allocates memory for an array of nmemb elements
|
|
||||||
of size bytes each
|
|
||||||
|
|
||||||
The first parameter is elements count, so change the order of input
|
|
||||||
parameters for calloc().
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 4 ++--
|
|
||||||
cputree.c | 6 +++---
|
|
||||||
procinterrupts.c | 2 +-
|
|
||||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 2c0e7ed..b999cab 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -275,7 +275,7 @@ static void add_banned_irq(int irq, GList **list)
|
|
||||||
if (entry)
|
|
||||||
return;
|
|
||||||
|
|
||||||
- new = calloc(sizeof(struct irq_info), 1);
|
|
||||||
+ new = calloc(1, sizeof(struct irq_info));
|
|
||||||
if (!new) {
|
|
||||||
log(TO_CONSOLE, LOG_WARNING, "No memory to ban irq %d\n", irq);
|
|
||||||
return;
|
|
||||||
@@ -366,7 +366,7 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
- new = calloc(sizeof(struct irq_info), 1);
|
|
||||||
+ new = calloc(1, sizeof(struct irq_info));
|
|
||||||
if (!new)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 1c1c99b..97d4a78 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -192,7 +192,7 @@ static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!entry) {
|
|
||||||
- package = calloc(sizeof(struct topo_obj), 1);
|
|
||||||
+ package = calloc(1, sizeof(struct topo_obj));
|
|
||||||
if (!package)
|
|
||||||
return NULL;
|
|
||||||
package->mask = package_mask;
|
|
||||||
@@ -238,7 +238,7 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!entry) {
|
|
||||||
- cache = calloc(sizeof(struct topo_obj), 1);
|
|
||||||
+ cache = calloc(1, sizeof(struct topo_obj));
|
|
||||||
if (!cache)
|
|
||||||
return NULL;
|
|
||||||
cache->obj_type = OBJ_TYPE_CACHE;
|
|
||||||
@@ -302,7 +302,7 @@ static void do_one_cpu(char *path)
|
|
||||||
if (offline_status)
|
|
||||||
return;
|
|
||||||
|
|
||||||
- cpu = calloc(sizeof(struct topo_obj), 1);
|
|
||||||
+ cpu = calloc(1, sizeof(struct topo_obj));
|
|
||||||
if (!cpu)
|
|
||||||
return;
|
|
||||||
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 1a7ff26..35d3be8 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -214,7 +214,7 @@ GList* collect_full_irq_list()
|
|
||||||
*c = 0;
|
|
||||||
number = strtoul(line, NULL, 10);
|
|
||||||
|
|
||||||
- info = calloc(sizeof(struct irq_info), 1);
|
|
||||||
+ info = calloc(1, sizeof(struct irq_info));
|
|
||||||
if (info) {
|
|
||||||
info->irq = number;
|
|
||||||
if (strstr(irq_name, "-event") != NULL && is_xen_dyn == 1) {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,154 +0,0 @@
|
|||||||
From c2d1429ba289e9cea76dd08e24e2d40af3ab0435 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Thu, 31 Oct 2019 00:39:11 +0800
|
|
||||||
Subject: [PATCH 36/53] irqbalance: prevent NULL pointer dereference in
|
|
||||||
do_one_cpu()
|
|
||||||
|
|
||||||
add_cpu_to_cache_domain() will return NULL if memory allocation failure,
|
|
||||||
so check the return value before invoking add_cache_domain_to_package(),
|
|
||||||
and add a global variable need_rebuild to check this situation, if
|
|
||||||
need_rebuild is set, then invoke free_object_tree() and try again a few
|
|
||||||
times, if it still fail, then return scan().
|
|
||||||
|
|
||||||
In addition, also set need_rebuild where calloc fails throughout the
|
|
||||||
build_object_tree process.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cputree.c | 16 +++++++++++-----
|
|
||||||
irqbalance.c | 19 ++++++++++++++++---
|
|
||||||
irqbalance.h | 1 +
|
|
||||||
numa.c | 4 +++-
|
|
||||||
4 files changed, 31 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index c1b4950..6bbc2cb 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -176,8 +176,10 @@ static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
|
|
||||||
|
|
||||||
if (!entry) {
|
|
||||||
package = calloc(1, sizeof(struct topo_obj));
|
|
||||||
- if (!package)
|
|
||||||
+ if (!package) {
|
|
||||||
+ need_rebuild = 1;
|
|
||||||
return NULL;
|
|
||||||
+ }
|
|
||||||
package->mask = package_mask;
|
|
||||||
package->obj_type = OBJ_TYPE_PACKAGE;
|
|
||||||
package->obj_type_list = &packages;
|
|
||||||
@@ -214,8 +216,10 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
|
|
||||||
|
|
||||||
if (!entry) {
|
|
||||||
cache = calloc(1, sizeof(struct topo_obj));
|
|
||||||
- if (!cache)
|
|
||||||
+ if (!cache) {
|
|
||||||
+ need_rebuild = 1;
|
|
||||||
return NULL;
|
|
||||||
+ }
|
|
||||||
cache->obj_type = OBJ_TYPE_CACHE;
|
|
||||||
cache->mask = cache_mask;
|
|
||||||
cache->number = cache_domain_count;
|
|
||||||
@@ -271,8 +275,10 @@ static void do_one_cpu(char *path)
|
|
||||||
return;
|
|
||||||
|
|
||||||
cpu = calloc(1, sizeof(struct topo_obj));
|
|
||||||
- if (!cpu)
|
|
||||||
+ if (!cpu) {
|
|
||||||
+ need_rebuild = 1;
|
|
||||||
return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
cpu->obj_type = OBJ_TYPE_CPU;
|
|
||||||
|
|
||||||
@@ -372,8 +378,8 @@ static void do_one_cpu(char *path)
|
|
||||||
cpus_and(package_mask, package_mask, unbanned_cpus);
|
|
||||||
|
|
||||||
cache = add_cpu_to_cache_domain(cpu, cache_mask, nodeid);
|
|
||||||
- add_cache_domain_to_package(cache, packageid, package_mask,
|
|
||||||
- nodeid);
|
|
||||||
+ if (cache)
|
|
||||||
+ add_cache_domain_to_package(cache, packageid, package_mask, nodeid);
|
|
||||||
|
|
||||||
cpu->obj_type_list = &cpus;
|
|
||||||
cpus = g_list_append(cpus, cpu);
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index 3ff5f13..619f51f 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -52,6 +52,7 @@ int foreground_mode;
|
|
||||||
int numa_avail;
|
|
||||||
int journal_logging = 0;
|
|
||||||
int need_rescan;
|
|
||||||
+int need_rebuild;
|
|
||||||
unsigned int log_mask = TO_ALL;
|
|
||||||
const char *log_indent;
|
|
||||||
unsigned long power_thresh = ULONG_MAX;
|
|
||||||
@@ -260,14 +261,25 @@ gboolean scan(gpointer data __attribute__((unused)))
|
|
||||||
|
|
||||||
|
|
||||||
/* cope with cpu hotplug -- detected during /proc/interrupts parsing */
|
|
||||||
- if (need_rescan) {
|
|
||||||
+ if (need_rescan || need_rebuild) {
|
|
||||||
+ int try_times = 0;
|
|
||||||
+
|
|
||||||
need_rescan = 0;
|
|
||||||
cycle_count = 0;
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "Rescanning cpu topology \n");
|
|
||||||
clear_work_stats();
|
|
||||||
|
|
||||||
- free_object_tree();
|
|
||||||
- build_object_tree();
|
|
||||||
+ do {
|
|
||||||
+ free_object_tree();
|
|
||||||
+ if (++try_times > 3) {
|
|
||||||
+ log(TO_CONSOLE, LOG_WARNING, "Rescanning cpu topology: fail\n");
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ need_rebuild = 0;
|
|
||||||
+ build_object_tree();
|
|
||||||
+ } while (need_rebuild);
|
|
||||||
+
|
|
||||||
for_each_irq(NULL, force_rebalance_irq, NULL);
|
|
||||||
parse_proc_interrupts();
|
|
||||||
parse_proc_stat();
|
|
||||||
@@ -284,6 +296,7 @@ gboolean scan(gpointer data __attribute__((unused)))
|
|
||||||
calculate_placement();
|
|
||||||
activate_mappings();
|
|
||||||
|
|
||||||
+out:
|
|
||||||
if (debug_mode)
|
|
||||||
dump_tree();
|
|
||||||
if (one_shot_mode)
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 62c7151..79f5450 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -67,6 +67,7 @@ extern int debug_mode;
|
|
||||||
extern int journal_logging;
|
|
||||||
extern int one_shot_mode;
|
|
||||||
extern int need_rescan;
|
|
||||||
+extern int need_rebuild;
|
|
||||||
extern unsigned long long cycle_count;
|
|
||||||
extern unsigned long power_thresh;
|
|
||||||
extern unsigned long deepest_cache;
|
|
||||||
diff --git a/numa.c b/numa.c
|
|
||||||
index e76b6e0..9d55784 100644
|
|
||||||
--- a/numa.c
|
|
||||||
+++ b/numa.c
|
|
||||||
@@ -58,8 +58,10 @@ static void add_one_node(const char *nodename)
|
|
||||||
struct topo_obj *new;
|
|
||||||
|
|
||||||
new = calloc(1, sizeof(struct topo_obj));
|
|
||||||
- if (!new)
|
|
||||||
+ if (!new) {
|
|
||||||
+ need_rebuild = 1;
|
|
||||||
return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
cpus_clear(new->mask);
|
|
||||||
sprintf(path, "%s/%s/cpumap", SYSFS_NODE_PATH, nodename);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
From 4ed5d04734a2c4d80acc582ab72c7c5225b2e7e3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sun, 10 Nov 2019 22:08:25 +0000
|
|
||||||
Subject: [PATCH 43/53] irqbalance: remove redundancy check in
|
|
||||||
add_one_irq_to_db()
|
|
||||||
|
|
||||||
Before calling add_one_irq_to_db(), it has been checked by calling
|
|
||||||
get_irq_info(), so remove unnecessary redundancy check.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 26 --------------------------
|
|
||||||
1 file changed, 26 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 90b0f30..c99e0f7 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -285,17 +285,6 @@ void add_cl_banned_irq(int irq)
|
|
||||||
add_banned_irq(irq, &cl_banned_irqs);
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int is_banned_irq(int irq)
|
|
||||||
-{
|
|
||||||
- GList *entry;
|
|
||||||
- struct irq_info find;
|
|
||||||
-
|
|
||||||
- find.irq = irq;
|
|
||||||
-
|
|
||||||
- entry = g_list_find_custom(banned_irqs, &find, compare_ints);
|
|
||||||
- return entry ? 1:0;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
gint substr_find(gconstpointer a, gconstpointer b)
|
|
||||||
{
|
|
||||||
if (strstr(b, a))
|
|
||||||
@@ -340,21 +329,6 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
|
|
||||||
struct irq_info *new;
|
|
||||||
int numa_node;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
- GList *entry;
|
|
||||||
-
|
|
||||||
- /*
|
|
||||||
- * First check to make sure this isn't a duplicate entry
|
|
||||||
- */
|
|
||||||
- entry = g_list_find_custom(interrupts_db, hint, compare_ints);
|
|
||||||
- if (entry) {
|
|
||||||
- log(TO_CONSOLE, LOG_INFO, "DROPPING DUPLICATE ENTRY FOR IRQ %d on path %s\n", irq, devpath);
|
|
||||||
- return NULL;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (is_banned_irq(irq)) {
|
|
||||||
- log(TO_ALL, LOG_INFO, "SKIPPING BANNED IRQ %d\n", irq);
|
|
||||||
- return NULL;
|
|
||||||
- }
|
|
||||||
|
|
||||||
new = calloc(1, sizeof(struct irq_info));
|
|
||||||
if (!new)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
From 2efbc92fd249ff524b3acdefccb3d679ac20f080 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Wed, 30 Oct 2019 18:44:13 +0800
|
|
||||||
Subject: [PATCH 33/53] irqbalance: remove unused package_count variable
|
|
||||||
|
|
||||||
package_count variable is unused, so remote it. and cache_domain_count
|
|
||||||
variable only used in the local file, which no need to extern in
|
|
||||||
irqbalance.h
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cputree.c | 3 ---
|
|
||||||
irqbalance.h | 2 --
|
|
||||||
2 files changed, 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index c88feda..1c1c99b 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -44,7 +44,6 @@ GList *cpus;
|
|
||||||
GList *cache_domains;
|
|
||||||
GList *packages;
|
|
||||||
|
|
||||||
-int package_count;
|
|
||||||
int cache_domain_count;
|
|
||||||
int core_count;
|
|
||||||
|
|
||||||
@@ -201,7 +200,6 @@ static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
|
|
||||||
package->obj_type_list = &packages;
|
|
||||||
package->number = packageid;
|
|
||||||
packages = g_list_append(packages, package);
|
|
||||||
- package_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry = g_list_first(package->children);
|
|
||||||
@@ -558,7 +556,6 @@ void clear_cpu_tree(void)
|
|
||||||
{
|
|
||||||
g_list_free_full(packages, free_cpu_topo);
|
|
||||||
packages = NULL;
|
|
||||||
- package_count = 0;
|
|
||||||
|
|
||||||
g_list_free_full(cache_domains, free_cpu_topo);
|
|
||||||
cache_domains = NULL;
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index a3e561e..62c7151 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -29,8 +29,6 @@
|
|
||||||
#include <systemd/sd-journal.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-extern int package_count;
|
|
||||||
-extern int cache_domain_count;
|
|
||||||
extern int core_count;
|
|
||||||
extern char *classes[];
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,131 +0,0 @@
|
|||||||
From f31f3a01ccc2e78c49fc8b61a1c95ec94236bfb8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sun, 3 Nov 2019 21:56:53 +0800
|
|
||||||
Subject: [PATCH 37/53] irqbalance: use NUMA_NO_NODE macro instead of -1 for
|
|
||||||
numa
|
|
||||||
|
|
||||||
node id -1 is stand for no specific numa, and is used in many place, so
|
|
||||||
using NUMA_NO_NODE macro instead is better readability.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 2 +-
|
|
||||||
cputree.c | 8 ++++----
|
|
||||||
irqbalance.h | 2 ++
|
|
||||||
numa.c | 4 ++--
|
|
||||||
placement.c | 4 ++--
|
|
||||||
5 files changed, 11 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index b999cab..5fb8233 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -391,7 +391,7 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
|
|
||||||
new->level = map_class_to_level[new->class];
|
|
||||||
|
|
||||||
get_numa_node:
|
|
||||||
- numa_node = -1;
|
|
||||||
+ numa_node = NUMA_NO_NODE;
|
|
||||||
if (devpath != NULL && numa_avail) {
|
|
||||||
sprintf(path, "%s/numa_node", devpath);
|
|
||||||
fd = fopen(path, "r");
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 6bbc2cb..69f4c6d 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -138,7 +138,7 @@ static void add_numa_node_to_topo_obj(struct topo_obj *obj, int nodeid)
|
|
||||||
struct topo_obj *node;
|
|
||||||
|
|
||||||
node = get_numa_node(nodeid);
|
|
||||||
- if (!node || (numa_avail && (node->number == -1)))
|
|
||||||
+ if (!node || (numa_avail && (node->number == NUMA_NO_NODE)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
entry = g_list_find(obj->numa_nodes, node);
|
|
||||||
@@ -193,7 +193,7 @@ static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
|
|
||||||
cache->parent = package;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!numa_avail || (nodeid > -1))
|
|
||||||
+ if (!numa_avail || (nodeid > NUMA_NO_NODE))
|
|
||||||
add_numa_node_to_topo_obj(package, nodeid);
|
|
||||||
|
|
||||||
return package;
|
|
||||||
@@ -234,7 +234,7 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
|
|
||||||
cpu->parent = (struct topo_obj *)cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!numa_avail || (nodeid > -1))
|
|
||||||
+ if (!numa_avail || (nodeid > NUMA_NO_NODE))
|
|
||||||
add_numa_node_to_topo_obj(cache, nodeid);
|
|
||||||
|
|
||||||
return cache;
|
|
||||||
@@ -340,7 +340,7 @@ static void do_one_cpu(char *path)
|
|
||||||
process_one_line(new_path, get_mask_from_bitmap, &cache_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
- nodeid=-1;
|
|
||||||
+ nodeid = NUMA_NO_NODE;
|
|
||||||
if (numa_avail) {
|
|
||||||
struct topo_obj *node;
|
|
||||||
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 79f5450..61d7550 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -29,6 +29,8 @@
|
|
||||||
#include <systemd/sd-journal.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#define NUMA_NO_NODE (-1)
|
|
||||||
+
|
|
||||||
extern int core_count;
|
|
||||||
extern char *classes[];
|
|
||||||
|
|
||||||
diff --git a/numa.c b/numa.c
|
|
||||||
index 9d55784..a2f99e2 100644
|
|
||||||
--- a/numa.c
|
|
||||||
+++ b/numa.c
|
|
||||||
@@ -41,7 +41,7 @@ GList *numa_nodes = NULL;
|
|
||||||
|
|
||||||
static struct topo_obj unspecified_node_template = {
|
|
||||||
.load = 0,
|
|
||||||
- .number = -1,
|
|
||||||
+ .number = NUMA_NO_NODE,
|
|
||||||
.obj_type = OBJ_TYPE_NODE,
|
|
||||||
.mask = CPU_MASK_ALL,
|
|
||||||
.interrupts = NULL,
|
|
||||||
@@ -178,7 +178,7 @@ struct topo_obj *get_numa_node(int nodeid)
|
|
||||||
if (!numa_avail)
|
|
||||||
return &unspecified_node;
|
|
||||||
|
|
||||||
- if (nodeid == -1)
|
|
||||||
+ if (nodeid == NUMA_NO_NODE)
|
|
||||||
return &unspecified_node;
|
|
||||||
|
|
||||||
find.number = nodeid;
|
|
||||||
diff --git a/placement.c b/placement.c
|
|
||||||
index efa8c57..17a9f2e 100644
|
|
||||||
--- a/placement.c
|
|
||||||
+++ b/placement.c
|
|
||||||
@@ -45,7 +45,7 @@ static void find_best_object(struct topo_obj *d, void *data)
|
|
||||||
/*
|
|
||||||
* Don't consider the unspecified numa node here
|
|
||||||
*/
|
|
||||||
- if (numa_avail && (d->obj_type == OBJ_TYPE_NODE) && (d->number == -1))
|
|
||||||
+ if (numa_avail && (d->obj_type == OBJ_TYPE_NODE) && (d->number == NUMA_NO_NODE))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -130,7 +130,7 @@ static void place_irq_in_node(struct irq_info *info, void *data __attribute__((u
|
|
||||||
if ((info->level == BALANCE_NONE) && cpus_empty(banned_cpus))
|
|
||||||
return;
|
|
||||||
|
|
||||||
- if (irq_numa_node(info)->number != -1 || !numa_avail) {
|
|
||||||
+ if (irq_numa_node(info)->number != NUMA_NO_NODE || !numa_avail) {
|
|
||||||
/*
|
|
||||||
* Need to make sure this node is elligible for migration
|
|
||||||
* given the banned cpu list
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,138 +0,0 @@
|
|||||||
From 5dbcee82bfd5fa0585a69286ea3b0030d4ecd222 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Wed, 11 Dec 2019 21:18:56 +0800
|
|
||||||
Subject: [PATCH 46/53] irqbalance: use add_new_irq() instead of the same logic
|
|
||||||
|
|
||||||
There are some same logic codes in build_one_dev_entry() that can be
|
|
||||||
replaced by add_new_irq().
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 73 +++++++++++++++++++-----------------------------------
|
|
||||||
1 file changed, 26 insertions(+), 47 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index c99e0f7..fa900f4 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -572,6 +572,28 @@ static int check_for_irq_ban(int irq, GList *proc_interrupts)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void add_new_irq(char *path, struct irq_info *hint, GList *proc_interrupts)
|
|
||||||
+{
|
|
||||||
+ struct irq_info *new;
|
|
||||||
+ struct user_irq_policy pol;
|
|
||||||
+ int irq = hint->irq;
|
|
||||||
+
|
|
||||||
+ new = get_irq_info(irq);
|
|
||||||
+ if (new)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ /* Set NULL devpath for the irq has no sysfs entries */
|
|
||||||
+ get_irq_user_policy(path, irq, &pol);
|
|
||||||
+ if ((pol.ban == 1) || check_for_irq_ban(irq, proc_interrupts)) { /*FIXME*/
|
|
||||||
+ add_banned_irq(irq, &banned_irqs);
|
|
||||||
+ new = get_irq_info(irq);
|
|
||||||
+ } else
|
|
||||||
+ new = add_one_irq_to_db(path, hint, &pol);
|
|
||||||
+
|
|
||||||
+ if (!new)
|
|
||||||
+ log(TO_CONSOLE, LOG_WARNING, "add_new_irq: Failed to add irq %d\n", irq);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* Figures out which interrupt(s) relate to the device we"re looking at in dirname
|
|
||||||
*/
|
|
||||||
@@ -580,10 +602,9 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
struct dirent *entry;
|
|
||||||
DIR *msidir;
|
|
||||||
int irqnum;
|
|
||||||
- struct irq_info *new, hint;
|
|
||||||
+ struct irq_info hint;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
char devpath[PATH_MAX];
|
|
||||||
- struct user_irq_policy pol;
|
|
||||||
|
|
||||||
sprintf(path, "%s/%s/msi_irqs", SYSPCI_DIR, dirname);
|
|
||||||
sprintf(devpath, "%s/%s", SYSPCI_DIR, dirname);
|
|
||||||
@@ -600,19 +621,9 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
break;
|
|
||||||
irqnum = strtol(entry->d_name, NULL, 10);
|
|
||||||
if (irqnum) {
|
|
||||||
- new = get_irq_info(irqnum);
|
|
||||||
- if (new)
|
|
||||||
- continue;
|
|
||||||
- get_irq_user_policy(devpath, irqnum, &pol);
|
|
||||||
- if ((pol.ban == 1) || (check_for_irq_ban(irqnum, tmp_irqs))) {
|
|
||||||
- add_banned_irq(irqnum, &banned_irqs);
|
|
||||||
- continue;
|
|
||||||
- }
|
|
||||||
hint.irq = irqnum;
|
|
||||||
hint.type = IRQ_TYPE_MSIX;
|
|
||||||
- new = add_one_irq_to_db(devpath, &hint, &pol);
|
|
||||||
- if (!new)
|
|
||||||
- continue;
|
|
||||||
+ add_new_irq(devpath, &hint, tmp_irqs);
|
|
||||||
}
|
|
||||||
} while (entry != NULL);
|
|
||||||
closedir(msidir);
|
|
||||||
@@ -632,20 +643,9 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
#else
|
|
||||||
if (irqnum) {
|
|
||||||
#endif
|
|
||||||
- new = get_irq_info(irqnum);
|
|
||||||
- if (new)
|
|
||||||
- goto done;
|
|
||||||
- get_irq_user_policy(devpath, irqnum, &pol);
|
|
||||||
- if ((pol.ban == 1) || (check_for_irq_ban(irqnum, tmp_irqs))) {
|
|
||||||
- add_banned_irq(irqnum, &banned_irqs);
|
|
||||||
- goto done;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
hint.irq = irqnum;
|
|
||||||
hint.type = IRQ_TYPE_LEGACY;
|
|
||||||
- new = add_one_irq_to_db(devpath, &hint, &pol);
|
|
||||||
- if (!new)
|
|
||||||
- goto done;
|
|
||||||
+ add_new_irq(devpath, &hint, tmp_irqs);
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
@@ -675,32 +675,11 @@ void free_cl_opts(void)
|
|
||||||
g_list_free_full(cl_banned_irqs, free);
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
|
||||||
-{
|
|
||||||
- struct irq_info *new;
|
|
||||||
- struct user_irq_policy pol;
|
|
||||||
-
|
|
||||||
- new = get_irq_info(irq);
|
|
||||||
- if (new)
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- /* Set NULL devpath for the irq has no sysfs entries */
|
|
||||||
- get_irq_user_policy(NULL, irq, &pol);
|
|
||||||
- if ((pol.ban == 1) || check_for_irq_ban(irq, proc_interrupts)) { /*FIXME*/
|
|
||||||
- add_banned_irq(irq, &banned_irqs);
|
|
||||||
- new = get_irq_info(irq);
|
|
||||||
- } else
|
|
||||||
- new = add_one_irq_to_db(NULL, hint, &pol);
|
|
||||||
-
|
|
||||||
- if (!new)
|
|
||||||
- log(TO_CONSOLE, LOG_WARNING, "add_new_irq: Failed to add irq %d\n", irq);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
static void add_missing_irq(struct irq_info *info, void *attr)
|
|
||||||
{
|
|
||||||
GList *proc_interrupts = (GList *) attr;
|
|
||||||
|
|
||||||
- add_new_irq(info->irq, info, proc_interrupts);
|
|
||||||
+ add_new_irq(NULL, info, proc_interrupts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_tmp_irqs(gpointer data)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,158 +0,0 @@
|
|||||||
From 4f361d0a7cd1d764855d5fcd49d849e8a17381cb Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Mon, 4 Nov 2019 15:16:51 +0800
|
|
||||||
Subject: [PATCH 40/53] irqbalance: use add_one_node() to create unspecified
|
|
||||||
node for numa
|
|
||||||
|
|
||||||
Use add_one_node(NUMA_NO_NODE) to create a unspecified node instead of
|
|
||||||
global variable.
|
|
||||||
|
|
||||||
It can reuse the function add_one_node() and delete two global variable
|
|
||||||
unspecified_node_template and unspecified_node. Also it can reuse the
|
|
||||||
function free_cpu_topo() instead of free_numa_node().
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cputree.c | 2 +-
|
|
||||||
irqbalance.h | 1 +
|
|
||||||
numa.c | 62 ++++++++++++----------------------------------------
|
|
||||||
3 files changed, 16 insertions(+), 49 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index aa69f56..305f617 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -508,7 +508,7 @@ void parse_cpu_tree(void)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void free_cpu_topo(gpointer data)
|
|
||||||
+void free_cpu_topo(gpointer data)
|
|
||||||
{
|
|
||||||
struct topo_obj *obj = data;
|
|
||||||
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 85fcbf2..900db9d 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -51,6 +51,7 @@ 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/numa.c b/numa.c
|
|
||||||
index a2f99e2..13d7ebd 100644
|
|
||||||
--- a/numa.c
|
|
||||||
+++ b/numa.c
|
|
||||||
@@ -39,20 +39,7 @@
|
|
||||||
|
|
||||||
GList *numa_nodes = NULL;
|
|
||||||
|
|
||||||
-static struct topo_obj unspecified_node_template = {
|
|
||||||
- .load = 0,
|
|
||||||
- .number = NUMA_NO_NODE,
|
|
||||||
- .obj_type = OBJ_TYPE_NODE,
|
|
||||||
- .mask = CPU_MASK_ALL,
|
|
||||||
- .interrupts = NULL,
|
|
||||||
- .children = NULL,
|
|
||||||
- .parent = NULL,
|
|
||||||
- .obj_type_list = &numa_nodes,
|
|
||||||
-};
|
|
||||||
-
|
|
||||||
-static struct topo_obj unspecified_node;
|
|
||||||
-
|
|
||||||
-static void add_one_node(const char *nodename)
|
|
||||||
+static void add_one_node(int nodeid)
|
|
||||||
{
|
|
||||||
char path[PATH_MAX];
|
|
||||||
struct topo_obj *new;
|
|
||||||
@@ -63,12 +50,16 @@ static void add_one_node(const char *nodename)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- cpus_clear(new->mask);
|
|
||||||
- sprintf(path, "%s/%s/cpumap", SYSFS_NODE_PATH, nodename);
|
|
||||||
- process_one_line(path, get_mask_from_bitmap, &new->mask);
|
|
||||||
+ if (nodeid == NUMA_NO_NODE) {
|
|
||||||
+ cpus_setall(new->mask);
|
|
||||||
+ } else {
|
|
||||||
+ cpus_clear(new->mask);
|
|
||||||
+ sprintf(path, "%s/node%d/cpumap", SYSFS_NODE_PATH, nodeid);
|
|
||||||
+ process_one_line(path, get_mask_from_bitmap, &new->mask);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
new->obj_type = OBJ_TYPE_NODE;
|
|
||||||
- new->number = strtoul(&nodename[4], NULL, 10);
|
|
||||||
+ new->number = nodeid;
|
|
||||||
new->obj_type_list = &numa_nodes;
|
|
||||||
numa_nodes = g_list_append(numa_nodes, new);
|
|
||||||
}
|
|
||||||
@@ -78,17 +69,8 @@ void build_numa_node_list(void)
|
|
||||||
DIR *dir;
|
|
||||||
struct dirent *entry;
|
|
||||||
|
|
||||||
- /*
|
|
||||||
- * Note that we copy the unspcified node from the template here
|
|
||||||
- * in the event we just freed the object tree during a rescan.
|
|
||||||
- * This ensures we don't get stale list pointers anywhere
|
|
||||||
- */
|
|
||||||
- memcpy(&unspecified_node, &unspecified_node_template, sizeof (struct topo_obj));
|
|
||||||
-
|
|
||||||
- /*
|
|
||||||
- * Add the unspecified node
|
|
||||||
- */
|
|
||||||
- numa_nodes = g_list_append(numa_nodes, &unspecified_node);
|
|
||||||
+ /* Add the unspecified node */
|
|
||||||
+ add_one_node(NUMA_NO_NODE);
|
|
||||||
|
|
||||||
if (!numa_avail)
|
|
||||||
return;
|
|
||||||
@@ -104,25 +86,15 @@ void build_numa_node_list(void)
|
|
||||||
if ((entry->d_type == DT_DIR) &&
|
|
||||||
(strncmp(entry->d_name, "node", 4) == 0) &&
|
|
||||||
isdigit(entry->d_name[4])) {
|
|
||||||
- add_one_node(entry->d_name);
|
|
||||||
+ add_one_node(strtoul(&entry->d_name[4], NULL, 10));
|
|
||||||
}
|
|
||||||
} while (entry);
|
|
||||||
closedir(dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void free_numa_node(gpointer data)
|
|
||||||
-{
|
|
||||||
- struct topo_obj *obj = data;
|
|
||||||
- g_list_free(obj->children);
|
|
||||||
- g_list_free(obj->interrupts);
|
|
||||||
-
|
|
||||||
- if (data != &unspecified_node)
|
|
||||||
- free(data);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
void free_numa_node_list(void)
|
|
||||||
{
|
|
||||||
- g_list_free_full(numa_nodes, free_numa_node);
|
|
||||||
+ g_list_free_full(numa_nodes, free_cpu_topo);
|
|
||||||
numa_nodes = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -175,13 +147,7 @@ struct topo_obj *get_numa_node(int nodeid)
|
|
||||||
struct topo_obj find;
|
|
||||||
GList *entry;
|
|
||||||
|
|
||||||
- if (!numa_avail)
|
|
||||||
- return &unspecified_node;
|
|
||||||
-
|
|
||||||
- if (nodeid == NUMA_NO_NODE)
|
|
||||||
- return &unspecified_node;
|
|
||||||
-
|
|
||||||
- find.number = nodeid;
|
|
||||||
+ find.number = numa_avail ? nodeid : NUMA_NO_NODE;
|
|
||||||
|
|
||||||
entry = g_list_find_custom(numa_nodes, &find, compare_node);
|
|
||||||
return entry ? entry->data : NULL;
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,135 +0,0 @@
|
|||||||
From 82f05296c7b8e53791047fb1668d4f41149c91d8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Wed, 30 Oct 2019 19:55:18 +0800
|
|
||||||
Subject: [PATCH 35/53] irqbalance: use g_list_find() instead of the search
|
|
||||||
logic for cpu_topo
|
|
||||||
|
|
||||||
There are some search logic of list can be replaced by g_list_find(),
|
|
||||||
which can make the code more simpler. the list to be search is start
|
|
||||||
from head, so remove g_list_first().
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cputree.c | 40 ++++------------------------------------
|
|
||||||
numa.c | 10 +---------
|
|
||||||
2 files changed, 5 insertions(+), 45 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 97d4a78..c1b4950 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -136,33 +136,17 @@ static void add_numa_node_to_topo_obj(struct topo_obj *obj, int nodeid)
|
|
||||||
{
|
|
||||||
GList *entry;
|
|
||||||
struct topo_obj *node;
|
|
||||||
- struct topo_obj *cand_node;
|
|
||||||
- struct topo_obj *package;
|
|
||||||
|
|
||||||
node = get_numa_node(nodeid);
|
|
||||||
if (!node || (numa_avail && (node->number == -1)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
- entry = g_list_first(obj->numa_nodes);
|
|
||||||
- while (entry) {
|
|
||||||
- cand_node = entry->data;
|
|
||||||
- if (cand_node == node)
|
|
||||||
- break;
|
|
||||||
- entry = g_list_next(entry);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
+ entry = g_list_find(obj->numa_nodes, node);
|
|
||||||
if (!entry)
|
|
||||||
obj->numa_nodes = g_list_append(obj->numa_nodes, node);
|
|
||||||
|
|
||||||
if (!numa_avail && obj->obj_type == OBJ_TYPE_PACKAGE) {
|
|
||||||
- entry = g_list_first(node->children);
|
|
||||||
- while (entry) {
|
|
||||||
- package = entry->data;
|
|
||||||
- if (package == obj)
|
|
||||||
- break;
|
|
||||||
- entry = g_list_next(entry);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
+ entry = g_list_find(node->children, obj);
|
|
||||||
if (!entry) {
|
|
||||||
node->children = g_list_append(node->children, obj);
|
|
||||||
obj->parent = node;
|
|
||||||
@@ -177,7 +161,6 @@ static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
|
|
||||||
{
|
|
||||||
GList *entry;
|
|
||||||
struct topo_obj *package;
|
|
||||||
- struct topo_obj *lcache;
|
|
||||||
|
|
||||||
entry = g_list_first(packages);
|
|
||||||
|
|
||||||
@@ -202,14 +185,7 @@ static struct topo_obj* add_cache_domain_to_package(struct topo_obj *cache,
|
|
||||||
packages = g_list_append(packages, package);
|
|
||||||
}
|
|
||||||
|
|
||||||
- entry = g_list_first(package->children);
|
|
||||||
- while (entry) {
|
|
||||||
- lcache = entry->data;
|
|
||||||
- if (lcache == cache)
|
|
||||||
- break;
|
|
||||||
- entry = g_list_next(entry);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
+ entry = g_list_find(package->children, cache);
|
|
||||||
if (!entry) {
|
|
||||||
package->children = g_list_append(package->children, cache);
|
|
||||||
cache->parent = package;
|
|
||||||
@@ -226,7 +202,6 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
|
|
||||||
{
|
|
||||||
GList *entry;
|
|
||||||
struct topo_obj *cache;
|
|
||||||
- struct topo_obj *lcpu;
|
|
||||||
|
|
||||||
entry = g_list_first(cache_domains);
|
|
||||||
|
|
||||||
@@ -249,14 +224,7 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
|
|
||||||
cache_domain_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
- entry = g_list_first(cache->children);
|
|
||||||
- while (entry) {
|
|
||||||
- lcpu = entry->data;
|
|
||||||
- if (lcpu == cpu)
|
|
||||||
- break;
|
|
||||||
- entry = g_list_next(entry);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
+ entry = g_list_find(cache->children, cpu);
|
|
||||||
if (!entry) {
|
|
||||||
cache->children = g_list_append(cache->children, cpu);
|
|
||||||
cpu->parent = (struct topo_obj *)cache;
|
|
||||||
diff --git a/numa.c b/numa.c
|
|
||||||
index f1284da..e76b6e0 100644
|
|
||||||
--- a/numa.c
|
|
||||||
+++ b/numa.c
|
|
||||||
@@ -136,7 +136,6 @@ void connect_cpu_mem_topo(struct topo_obj *p, void *data __attribute__((unused))
|
|
||||||
{
|
|
||||||
GList *entry;
|
|
||||||
struct topo_obj *node;
|
|
||||||
- struct topo_obj *lchild;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
len = g_list_length(p->numa_nodes);
|
|
||||||
@@ -154,14 +153,7 @@ void connect_cpu_mem_topo(struct topo_obj *p, void *data __attribute__((unused))
|
|
||||||
if (p->obj_type == OBJ_TYPE_PACKAGE && !p->parent)
|
|
||||||
p->parent = node;
|
|
||||||
|
|
||||||
- entry = g_list_first(node->children);
|
|
||||||
- while (entry) {
|
|
||||||
- lchild = entry->data;
|
|
||||||
- if (lchild == p)
|
|
||||||
- break;
|
|
||||||
- entry = g_list_next(entry);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
+ entry = g_list_find(node->children, p);
|
|
||||||
if (!entry)
|
|
||||||
node->children = g_list_append(node->children, p);
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
From d289ecd663a43d59c68b52c33e981b0096519063 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Mon, 28 Oct 2019 19:03:19 +0800
|
|
||||||
Subject: [PATCH 32/53] irqbalance: use g_list_free_full() in clear_cpu_tree()
|
|
||||||
|
|
||||||
Resource is freed by traversing each list in clear_cpu_tree(), which can
|
|
||||||
be replaced by g_list_free_full(), so make the code simpler.
|
|
||||||
|
|
||||||
In addition, the children and numa_nodes list of cpus is empty, so
|
|
||||||
free_cpu_topo() also free the list for cpus have no impact.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cputree.c | 47 +++++++++++++++--------------------------------
|
|
||||||
1 file changed, 15 insertions(+), 32 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index acf6a47..c88feda 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -540,6 +540,15 @@ void parse_cpu_tree(void)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void free_cpu_topo(gpointer data)
|
|
||||||
+{
|
|
||||||
+ struct topo_obj *obj = data;
|
|
||||||
+
|
|
||||||
+ g_list_free(obj->children);
|
|
||||||
+ g_list_free(obj->interrupts);
|
|
||||||
+ g_list_free(obj->numa_nodes);
|
|
||||||
+ free(obj);
|
|
||||||
+}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function frees all memory related to a cpu tree so that a new tree
|
|
||||||
@@ -547,43 +556,17 @@ void parse_cpu_tree(void)
|
|
||||||
*/
|
|
||||||
void clear_cpu_tree(void)
|
|
||||||
{
|
|
||||||
- GList *item;
|
|
||||||
- struct topo_obj *cpu;
|
|
||||||
- struct topo_obj *cache_domain;
|
|
||||||
- struct topo_obj *package;
|
|
||||||
-
|
|
||||||
- while (packages) {
|
|
||||||
- item = g_list_first(packages);
|
|
||||||
- package = item->data;
|
|
||||||
- g_list_free(package->children);
|
|
||||||
- g_list_free(package->interrupts);
|
|
||||||
- g_list_free(package->numa_nodes);
|
|
||||||
- free(package);
|
|
||||||
- packages = g_list_delete_link(packages, item);
|
|
||||||
- }
|
|
||||||
+ g_list_free_full(packages, free_cpu_topo);
|
|
||||||
+ packages = NULL;
|
|
||||||
package_count = 0;
|
|
||||||
|
|
||||||
- while (cache_domains) {
|
|
||||||
- item = g_list_first(cache_domains);
|
|
||||||
- cache_domain = item->data;
|
|
||||||
- g_list_free(cache_domain->children);
|
|
||||||
- g_list_free(cache_domain->interrupts);
|
|
||||||
- g_list_free(cache_domain->numa_nodes);
|
|
||||||
- free(cache_domain);
|
|
||||||
- cache_domains = g_list_delete_link(cache_domains, item);
|
|
||||||
- }
|
|
||||||
+ g_list_free_full(cache_domains, free_cpu_topo);
|
|
||||||
+ cache_domains = NULL;
|
|
||||||
cache_domain_count = 0;
|
|
||||||
|
|
||||||
-
|
|
||||||
- while (cpus) {
|
|
||||||
- item = g_list_first(cpus);
|
|
||||||
- cpu = item->data;
|
|
||||||
- g_list_free(cpu->interrupts);
|
|
||||||
- free(cpu);
|
|
||||||
- cpus = g_list_delete_link(cpus, item);
|
|
||||||
- }
|
|
||||||
+ g_list_free_full(cpus, free_cpu_topo);
|
|
||||||
+ cpus = NULL;
|
|
||||||
core_count = 0;
|
|
||||||
-
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint compare_cpus(gconstpointer a, gconstpointer b)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
From c0da4d95c2b86003ebe20a7c5e88df54648411fe Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sat, 26 Oct 2019 20:51:15 +0800
|
|
||||||
Subject: [PATCH 31/53] irqbalance: use isdigit() instead of the logic of
|
|
||||||
character judgment
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
procinterrupts.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 29b0fef..1a7ff26 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -182,7 +182,7 @@ GList* collect_full_irq_list()
|
|
||||||
while (isblank(*(c)))
|
|
||||||
c++;
|
|
||||||
|
|
||||||
- if (!(*c>='0' && *c<='9'))
|
|
||||||
+ if (!isdigit(*c))
|
|
||||||
break;
|
|
||||||
c = strchr(line, ':');
|
|
||||||
if (!c)
|
|
||||||
@@ -274,7 +274,7 @@ void parse_proc_interrupts(void)
|
|
||||||
while (isblank(*(c)))
|
|
||||||
c++;
|
|
||||||
|
|
||||||
- if (!(*c>='0' && *c<='9'))
|
|
||||||
+ if (!isdigit(*c))
|
|
||||||
break;
|
|
||||||
c = strchr(line, ':');
|
|
||||||
if (!c)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,227 +0,0 @@
|
|||||||
From 8799a564dc331732af431bad25a8744e043f8409 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Mon, 4 Nov 2019 11:51:46 +0800
|
|
||||||
Subject: [PATCH 38/53] irqbalance: use num_online_cpus() instead core_count
|
|
||||||
|
|
||||||
The variable core_count is actually the number of online cpus, and
|
|
||||||
cpu_possible_map is unused, so change cpu_possible_map to cpu_online_map
|
|
||||||
and use num_online_cpus() instead of core_count.
|
|
||||||
|
|
||||||
In addition, remove cpu_possible_map and cpu_present_map, also its
|
|
||||||
associated macros, which there are unused.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cpumask.h | 79 +-----------------------------------------------
|
|
||||||
cputree.c | 10 ++----
|
|
||||||
irqbalance.c | 2 +-
|
|
||||||
irqbalance.h | 1 -
|
|
||||||
procinterrupts.c | 2 +-
|
|
||||||
5 files changed, 6 insertions(+), 88 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cpumask.h b/cpumask.h
|
|
||||||
index 0774a88..5bebbeb 100644
|
|
||||||
--- a/cpumask.h
|
|
||||||
+++ b/cpumask.h
|
|
||||||
@@ -59,18 +59,10 @@
|
|
||||||
* for_each_cpu_mask(cpu, mask) for-loop cpu over mask
|
|
||||||
*
|
|
||||||
* int num_online_cpus() Number of online CPUs
|
|
||||||
- * int num_possible_cpus() Number of all possible CPUs
|
|
||||||
- * int num_present_cpus() Number of present CPUs
|
|
||||||
*
|
|
||||||
* int cpu_online(cpu) Is some cpu online?
|
|
||||||
- * int cpu_possible(cpu) Is some cpu possible?
|
|
||||||
- * int cpu_present(cpu) Is some cpu present (can schedule)?
|
|
||||||
*
|
|
||||||
- * int any_online_cpu(mask) First online cpu in mask
|
|
||||||
- *
|
|
||||||
- * for_each_possible_cpu(cpu) for-loop cpu over cpu_possible_map
|
|
||||||
* for_each_online_cpu(cpu) for-loop cpu over cpu_online_map
|
|
||||||
- * for_each_present_cpu(cpu) for-loop cpu over cpu_present_map
|
|
||||||
*
|
|
||||||
* Subtlety:
|
|
||||||
* 1) The 'type-checked' form of cpu_isset() causes gcc (3.3.2, anyway)
|
|
||||||
@@ -314,87 +306,18 @@ static inline void __cpus_remap(cpumask_t *dstp, const cpumask_t *srcp,
|
|
||||||
#endif /* NR_CPUS */
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * The following particular system cpumasks and operations manage
|
|
||||||
- * possible, present and online cpus. Each of them is a fixed size
|
|
||||||
- * bitmap of size NR_CPUS.
|
|
||||||
- *
|
|
||||||
- * #ifdef CONFIG_HOTPLUG_CPU
|
|
||||||
- * cpu_possible_map - has bit 'cpu' set iff cpu is populatable
|
|
||||||
- * cpu_present_map - has bit 'cpu' set iff cpu is populated
|
|
||||||
- * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler
|
|
||||||
- * #else
|
|
||||||
- * cpu_possible_map - has bit 'cpu' set iff cpu is populated
|
|
||||||
- * cpu_present_map - copy of cpu_possible_map
|
|
||||||
- * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler
|
|
||||||
- * #endif
|
|
||||||
- *
|
|
||||||
- * In either case, NR_CPUS is fixed at compile time, as the static
|
|
||||||
- * size of these bitmaps. The cpu_possible_map is fixed at boot
|
|
||||||
- * time, as the set of CPU id's that it is possible might ever
|
|
||||||
- * be plugged in at anytime during the life of that system boot.
|
|
||||||
- * The cpu_present_map is dynamic(*), representing which CPUs
|
|
||||||
- * are currently plugged in. And cpu_online_map is the dynamic
|
|
||||||
- * subset of cpu_present_map, indicating those CPUs available
|
|
||||||
- * for scheduling.
|
|
||||||
- *
|
|
||||||
- * If HOTPLUG is enabled, then cpu_possible_map is forced to have
|
|
||||||
- * all NR_CPUS bits set, otherwise it is just the set of CPUs that
|
|
||||||
- * ACPI reports present at boot.
|
|
||||||
- *
|
|
||||||
- * If HOTPLUG is enabled, then cpu_present_map varies dynamically,
|
|
||||||
- * depending on what ACPI reports as currently plugged in, otherwise
|
|
||||||
- * cpu_present_map is just a copy of cpu_possible_map.
|
|
||||||
- *
|
|
||||||
- * (*) Well, cpu_present_map is dynamic in the hotplug case. If not
|
|
||||||
- * hotplug, it's a copy of cpu_possible_map, hence fixed at boot.
|
|
||||||
- *
|
|
||||||
- * Subtleties:
|
|
||||||
- * 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode
|
|
||||||
- * assumption that their single CPU is online. The UP
|
|
||||||
- * cpu_{online,possible,present}_maps are placebos. Changing them
|
|
||||||
- * will have no useful affect on the following num_*_cpus()
|
|
||||||
- * and cpu_*() macros in the UP case. This ugliness is a UP
|
|
||||||
- * optimization - don't waste any instructions or memory references
|
|
||||||
- * asking if you're online or how many CPUs there are if there is
|
|
||||||
- * only one CPU.
|
|
||||||
- * 2) Most SMP arch's #define some of these maps to be some
|
|
||||||
- * other map specific to that arch. Therefore, the following
|
|
||||||
- * must be #define macros, not inlines. To see why, examine
|
|
||||||
- * the assembly code produced by the following. Note that
|
|
||||||
- * set1() writes phys_x_map, but set2() writes x_map:
|
|
||||||
- * int x_map, phys_x_map;
|
|
||||||
- * #define set1(a) x_map = a
|
|
||||||
- * inline void set2(int a) { x_map = a; }
|
|
||||||
- * #define x_map phys_x_map
|
|
||||||
- * main(){ set1(3); set2(5); }
|
|
||||||
+ * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler
|
|
||||||
*/
|
|
||||||
-
|
|
||||||
-extern cpumask_t cpu_possible_map;
|
|
||||||
extern cpumask_t cpu_online_map;
|
|
||||||
-extern cpumask_t cpu_present_map;
|
|
||||||
|
|
||||||
#if NR_CPUS > 1
|
|
||||||
#define num_online_cpus() cpus_weight(cpu_online_map)
|
|
||||||
-#define num_possible_cpus() cpus_weight(cpu_possible_map)
|
|
||||||
-#define num_present_cpus() cpus_weight(cpu_present_map)
|
|
||||||
#define cpu_online(cpu) cpu_isset((cpu), cpu_online_map)
|
|
||||||
-#define cpu_possible(cpu) cpu_isset((cpu), cpu_possible_map)
|
|
||||||
-#define cpu_present(cpu) cpu_isset((cpu), cpu_present_map)
|
|
||||||
#else
|
|
||||||
#define num_online_cpus() 1
|
|
||||||
-#define num_possible_cpus() 1
|
|
||||||
-#define num_present_cpus() 1
|
|
||||||
#define cpu_online(cpu) ((cpu) == 0)
|
|
||||||
-#define cpu_possible(cpu) ((cpu) == 0)
|
|
||||||
-#define cpu_present(cpu) ((cpu) == 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-int highest_possible_processor_id(void);
|
|
||||||
-#define any_online_cpu(mask) __any_online_cpu(&(mask))
|
|
||||||
-int __any_online_cpu(const cpumask_t *mask);
|
|
||||||
-
|
|
||||||
-#define for_each_possible_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map)
|
|
||||||
#define for_each_online_cpu(cpu) for_each_cpu_mask((cpu), cpu_online_map)
|
|
||||||
-#define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map)
|
|
||||||
|
|
||||||
#endif /* __LINUX_CPUMASK_H */
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 69f4c6d..8178ba8 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -45,12 +45,11 @@ GList *cache_domains;
|
|
||||||
GList *packages;
|
|
||||||
|
|
||||||
int cache_domain_count;
|
|
||||||
-int core_count;
|
|
||||||
|
|
||||||
/* Users want to be able to keep interrupts away from some cpus; store these in a cpumask_t */
|
|
||||||
cpumask_t banned_cpus;
|
|
||||||
|
|
||||||
-cpumask_t cpu_possible_map;
|
|
||||||
+cpumask_t cpu_online_map;
|
|
||||||
|
|
||||||
/*
|
|
||||||
it's convenient to have the complement of banned_cpus available so that
|
|
||||||
@@ -284,7 +283,7 @@ static void do_one_cpu(char *path)
|
|
||||||
|
|
||||||
cpu->number = strtoul(&path[27], NULL, 10);
|
|
||||||
|
|
||||||
- cpu_set(cpu->number, cpu_possible_map);
|
|
||||||
+ cpu_set(cpu->number, cpu_online_map);
|
|
||||||
|
|
||||||
cpu_set(cpu->number, cpu->mask);
|
|
||||||
|
|
||||||
@@ -297,8 +296,6 @@ static void do_one_cpu(char *path)
|
|
||||||
/* if the cpu is on the banned list, just don't add it */
|
|
||||||
if (cpus_intersects(cpu->mask, banned_cpus)) {
|
|
||||||
free(cpu);
|
|
||||||
- /* even though we don't use the cpu we do need to count it */
|
|
||||||
- core_count++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -383,7 +380,6 @@ static void do_one_cpu(char *path)
|
|
||||||
|
|
||||||
cpu->obj_type_list = &cpus;
|
|
||||||
cpus = g_list_append(cpus, cpu);
|
|
||||||
- core_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_irq(struct irq_info *info, void *data)
|
|
||||||
@@ -537,7 +533,7 @@ void clear_cpu_tree(void)
|
|
||||||
|
|
||||||
g_list_free_full(cpus, free_cpu_topo);
|
|
||||||
cpus = NULL;
|
|
||||||
- core_count = 0;
|
|
||||||
+ cpus_clear(cpu_online_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint compare_cpus(gconstpointer a, gconstpointer b)
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index 619f51f..c9379ad 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -646,7 +646,7 @@ int main(int argc, char** argv)
|
|
||||||
|
|
||||||
|
|
||||||
/* On single core UP systems irqbalance obviously has no work to do */
|
|
||||||
- if (core_count<2) {
|
|
||||||
+ if (num_online_cpus() <= 1) {
|
|
||||||
char *msg = "Balancing is ineffective on systems with a "
|
|
||||||
"single cpu. Shutting down\n";
|
|
||||||
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 61d7550..85fcbf2 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -31,7 +31,6 @@
|
|
||||||
|
|
||||||
#define NUMA_NO_NODE (-1)
|
|
||||||
|
|
||||||
-extern int core_count;
|
|
||||||
extern char *classes[];
|
|
||||||
|
|
||||||
extern void parse_cpu_tree(void);
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 35d3be8..858b66b 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -303,7 +303,7 @@ void parse_proc_interrupts(void)
|
|
||||||
c=c2;
|
|
||||||
cpunr++;
|
|
||||||
}
|
|
||||||
- if (cpunr != core_count) {
|
|
||||||
+ if (cpunr != num_online_cpus()) {
|
|
||||||
need_rescan = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,176 +0,0 @@
|
|||||||
From 56679afd67ba2706387407ea258eb0d2413c0c1e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sun, 10 Nov 2019 19:18:07 +0000
|
|
||||||
Subject: [PATCH 42/53] irqbalance: use process_one_line() instead of fscanf()
|
|
||||||
|
|
||||||
The logic using fscanf() to get data from open file can be instead by
|
|
||||||
process_one_line(), and provide two functions get_hex() and get_int()
|
|
||||||
to convert string to integer. also use get_int() instead of
|
|
||||||
get_offline_status() and get_packageid().
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 27 ++++-----------------------
|
|
||||||
cputree.c | 32 ++++++++++++++------------------
|
|
||||||
irqbalance.h | 2 ++
|
|
||||||
3 files changed, 20 insertions(+), 41 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 5fb8233..90b0f30 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -187,20 +187,11 @@ static int map_pci_irq_class(unsigned int pci_class)
|
|
||||||
static unsigned int read_pci_data(const char *devpath, const char* file)
|
|
||||||
{
|
|
||||||
char path[PATH_MAX];
|
|
||||||
- FILE *fd;
|
|
||||||
unsigned int data = PCI_INVAL_DATA;
|
|
||||||
|
|
||||||
sprintf(path, "%s/%s", devpath, file);
|
|
||||||
-
|
|
||||||
- fd = fopen(path, "r");
|
|
||||||
-
|
|
||||||
- if (!fd) {
|
|
||||||
- log(TO_CONSOLE, LOG_WARNING, "PCI: can't open file:%s\n", path);
|
|
||||||
- return data;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- (void) fscanf(fd, "%x", &data);
|
|
||||||
- fclose(fd);
|
|
||||||
+ if (process_one_line(path, get_hex, &data) < 0)
|
|
||||||
+ log(TO_CONSOLE, LOG_WARNING, "PCI: can't get from file:%s\n", path);
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
@@ -349,7 +340,6 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
|
|
||||||
struct irq_info *new;
|
|
||||||
int numa_node;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
- FILE *fd;
|
|
||||||
GList *entry;
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -394,11 +384,7 @@ get_numa_node:
|
|
||||||
numa_node = NUMA_NO_NODE;
|
|
||||||
if (devpath != NULL && numa_avail) {
|
|
||||||
sprintf(path, "%s/numa_node", devpath);
|
|
||||||
- fd = fopen(path, "r");
|
|
||||||
- if (fd) {
|
|
||||||
- fscanf(fd, "%d", &numa_node);
|
|
||||||
- fclose(fd);
|
|
||||||
- }
|
|
||||||
+ process_one_line(path, get_int, &numa_node);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pol->numa_node_set == 1)
|
|
||||||
@@ -619,7 +605,6 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
{
|
|
||||||
struct dirent *entry;
|
|
||||||
DIR *msidir;
|
|
||||||
- FILE *fd;
|
|
||||||
int irqnum;
|
|
||||||
struct irq_info *new, hint;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
@@ -661,10 +646,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(path, "%s/%s/irq", SYSPCI_DIR, dirname);
|
|
||||||
- fd = fopen(path, "r");
|
|
||||||
- if (!fd)
|
|
||||||
- return;
|
|
||||||
- if (fscanf(fd, "%d", &irqnum) < 0)
|
|
||||||
+ if (process_one_line(path, get_int, &irqnum) < 0)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -693,7 +675,6 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
- fclose(fd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 4c5fdf5..9aa4794 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -78,6 +78,16 @@ int process_one_line(char *path, void (*cb)(char *line, void *data), void *data)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void get_hex(char *line, void *data)
|
|
||||||
+{
|
|
||||||
+ *(int *)data = strtoul(line, NULL, 16);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void get_int(char *line, void *data)
|
|
||||||
+{
|
|
||||||
+ *(int *)data = strtoul(line, NULL, 10);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void get_mask_from_bitmap(char *line, void *mask)
|
|
||||||
{
|
|
||||||
cpumask_parse_user(line, strlen(line), *(cpumask_t *)mask);
|
|
||||||
@@ -244,20 +254,6 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
|
|
||||||
return cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void get_offline_status(char *line, void *data)
|
|
||||||
-{
|
|
||||||
- int *status = (int *)data;
|
|
||||||
-
|
|
||||||
- *status = (line && line[0] == '0') ? 1 : 0;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void get_packageid(char *line, void *data)
|
|
||||||
-{
|
|
||||||
- int *packageid = (int *)data;
|
|
||||||
-
|
|
||||||
- *packageid = strtoul(line, NULL, 10);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
#define ADJ_SIZE(r,s) PATH_MAX-strlen(r)-strlen(#s)
|
|
||||||
static void do_one_cpu(char *path)
|
|
||||||
{
|
|
||||||
@@ -270,12 +266,12 @@ static void do_one_cpu(char *path)
|
|
||||||
int nodeid;
|
|
||||||
int packageid = 0;
|
|
||||||
unsigned int max_cache_index, cache_index, cache_stat;
|
|
||||||
- int offline_status = 0;
|
|
||||||
+ int online_status = 1;
|
|
||||||
|
|
||||||
/* skip offline cpus */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path,"/online"), "%s/online", path);
|
|
||||||
- process_one_line(new_path, get_offline_status, &offline_status);
|
|
||||||
- if (offline_status)
|
|
||||||
+ process_one_line(new_path, get_int, &online_status);
|
|
||||||
+ if (!online_status)
|
|
||||||
return;
|
|
||||||
|
|
||||||
cpu = calloc(1, sizeof(struct topo_obj));
|
|
||||||
@@ -315,7 +311,7 @@ static void do_one_cpu(char *path)
|
|
||||||
/* try to read the package id */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path, "/topology/physical_package_id"),
|
|
||||||
"%s/topology/physical_package_id", path);
|
|
||||||
- process_one_line(new_path, get_packageid, &packageid);
|
|
||||||
+ process_one_line(new_path, get_int, &packageid);
|
|
||||||
|
|
||||||
/* try to read the cache mask; if it doesn't exist assume solitary */
|
|
||||||
/* We want the deepest cache level available */
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 900db9d..3e3ea5d 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -163,6 +163,8 @@ extern unsigned int log_mask;
|
|
||||||
|
|
||||||
extern int process_one_line(char *path, void (*cb)(char *line, void *data), void *data);
|
|
||||||
extern void get_mask_from_bitmap(char *line, void *mask);
|
|
||||||
+extern void get_int(char *line, void *data);
|
|
||||||
+extern void get_hex(char *line, void *data);
|
|
||||||
|
|
||||||
#endif /* __INCLUDE_GUARD_IRQBALANCE_H_ */
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
Summary: A dynamic adaptive IRQ balancing daemon
|
Summary: A dynamic adaptive IRQ balancing daemon
|
||||||
Name: irqbalance
|
Name: irqbalance
|
||||||
Version: 1.6.0
|
Version: 1.7.0
|
||||||
Release: 1
|
Release: 1
|
||||||
Epoch: 3
|
Epoch: 3
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
@ -21,59 +21,6 @@ Requires: numactl-libs
|
|||||||
|
|
||||||
%define _hardened_build 1
|
%define _hardened_build 1
|
||||||
|
|
||||||
Patch0001:Fix-spelling-errors.patch
|
|
||||||
Patch0002:Clarify-the-README-description.patch
|
|
||||||
Patch0003:use-policy-prior-to-the-default-values.patch
|
|
||||||
Patch0004:some-variable-and-judgement-are-unnecessary-in-activ.patch
|
|
||||||
Patch0005:fix-sleep-interval-when-sleep_interval-is-changed-by.patch
|
|
||||||
Patch0006:Add-stub-manpage-for-irqbalance-ui.patch
|
|
||||||
Patch0007:Capitalize-HOMEPAGE-in-irqbalance.1.patch
|
|
||||||
Patch0008:Add-irqbalance-ui.1-to-dist_man_MANS.patch
|
|
||||||
Patch0009:improve-comments-in-env-file.patch
|
|
||||||
Patch0010:fix-guess_arm_irq_hints.patch
|
|
||||||
Patch0011:fix-the-pid-file-generates-too-late-problem.patch
|
|
||||||
Patch0012:change-path-to-devpath.patch
|
|
||||||
Patch0013:Add-optional-config-file-in-usr-lib.patch
|
|
||||||
Patch0014:make-the-return-value-of-getline-handled-correct.patch
|
|
||||||
Patch0015:remove-unused-path-in-check_for_irq_ban.patch
|
|
||||||
Patch0016:Update-classify.c.patch
|
|
||||||
Patch0017:delete-unused-local-variables-in-parse_proc_interrup.patch
|
|
||||||
Patch0018:Checking-return-value-of-strdup-in-collect_full_irq_.patch
|
|
||||||
Patch0019:getline-clean-up-freeing-of-lines-from-getline.patch
|
|
||||||
Patch0020:free-the-memory-when-getline-fail-in-add_one_node.patch
|
|
||||||
Patch0021:prevent-NULL-pointer-dereference-when-memory-allocat.patch
|
|
||||||
Patch0022:fix-resource-leak-for-not-invoking-closedir-after-op.patch
|
|
||||||
Patch0023:correct-to-use-realloc-function.patch
|
|
||||||
Patch0024:reduce-redundant-code-for-file-processing.patch
|
|
||||||
Patch0025:fix-the-problem-of-banmod-that-memory-is-freed-befor.patch
|
|
||||||
Patch0026:when-devpath-is-NULL-skip-reading-files.patch
|
|
||||||
Patch0027:remove-c-in-parse_proc_interrupts.patch
|
|
||||||
Patch0028:fix-resource-leak-on-the-error-paths-in-main.patch
|
|
||||||
Patch0029:reduce-redundant-check-in-add_missing_irq.patch
|
|
||||||
Patch0030:delete-the-useless-free-for-banned_irqs-in-free_cl_o.patch
|
|
||||||
Patch0031:irqbalance-use-isdigit-instead-of-the-logic-of-chara.patch
|
|
||||||
Patch0032:irqbalance-use-g_list_free_full-in-clear_cpu_tree.patch
|
|
||||||
Patch0033:irqbalance-remove-unused-package_count-variable.patch
|
|
||||||
Patch0034:irqbalance-modify-the-order-of-input-parameter-for-c.patch
|
|
||||||
Patch0035:irqbalance-use-g_list_find-instead-of-the-search-log.patch
|
|
||||||
Patch0036:irqbalance-prevent-NULL-pointer-dereference-in-do_on.patch
|
|
||||||
Patch0037:irqbalance-use-NUMA_NO_NODE-macro-instead-of-1-for-n.patch
|
|
||||||
Patch0038:irqbalance-use-num_online_cpus-instead-core_count.patch
|
|
||||||
Patch0039:irqbalance-initialize-package_mask-before-using-in-d.patch
|
|
||||||
Patch0040:irqbalance-use-add_one_node-to-create-unspecified-no.patch
|
|
||||||
Patch0041:fix-invalid-pointer-dereference-banned_cpumask_from_.patch
|
|
||||||
Patch0042:irqbalance-use-process_one_line-instead-of-fscanf.patch
|
|
||||||
Patch0043:irqbalance-remove-redundancy-check-in-add_one_irq_to.patch
|
|
||||||
Patch0044:free-polscript-if-irqbalance-exit.patch
|
|
||||||
Patch0045:free-polscript-to-avoid-resource-leak.patch
|
|
||||||
Patch0046:irqbalance-use-add_new_irq-instead-of-the-same-logic.patch
|
|
||||||
Patch0047:make-the-option-V-closer-to-the-option-with-no-arg.patch
|
|
||||||
Patch0048:improve-irq-migrate-rule-to-avoid-high-irq-load.patch
|
|
||||||
Patch0049:free-cpu_ban_string-when-the-next-request-come.patch
|
|
||||||
Patch0050:Correct-typos-in-irqbalance.c.patch
|
|
||||||
Patch0051:arm64-Add-irq-aff-change-check.patch
|
|
||||||
Patch0052:Fix-typo-in-service-unit-file.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
|
||||||
interrupts across all of a systems cpus. Irqbalance identifies the
|
interrupts across all of a systems cpus. Irqbalance identifies the
|
||||||
@ -130,6 +77,12 @@ fi
|
|||||||
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Aug 14 2020 Liu Chao <liuchao173@huawei.com> - 3:1.7.0-1
|
||||||
|
- Type:enhanced
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC:rebase to v1.7.0
|
||||||
|
|
||||||
* Fri Jul 3 2020 Liu Chao <liuchao173@huawei.com> - 3:1.6.0-1
|
* Fri Jul 3 2020 Liu Chao <liuchao173@huawei.com> - 3:1.6.0-1
|
||||||
- Type:enhanced
|
- Type:enhanced
|
||||||
- ID:NA
|
- ID:NA
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
From 7f77fc97cb259da3f6097be347e4fcacd4f864d9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hejingxian 00273181 <hejingxian@huawei.com>
|
|
||||||
Date: Mon, 20 Jan 2020 23:01:19 +0800
|
|
||||||
Subject: [PATCH 47/53] make the option 'V' closer to the option with no arg
|
|
||||||
|
|
||||||
---
|
|
||||||
irqbalance.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index e76d27b..be111f1 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -118,7 +118,7 @@ static void parse_command_line(int argc, char **argv)
|
|
||||||
unsigned long val;
|
|
||||||
|
|
||||||
while ((opt = getopt_long(argc, argv,
|
|
||||||
- "odfji:p:s:c:l:m:t:V",
|
|
||||||
+ "odfjVi:p:s:c:l:m:t:",
|
|
||||||
lopts, &longind)) != -1) {
|
|
||||||
|
|
||||||
switch(opt) {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,129 +0,0 @@
|
|||||||
From 735c0241afa78459eefb7eb9a60fe0b7b0029430 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Wed, 18 Sep 2019 22:26:44 +0800
|
|
||||||
Subject: [PATCH 14/53] make the return value of getline() handled correct
|
|
||||||
|
|
||||||
getline() will return -1 when fail, so make the return value handle
|
|
||||||
correct.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
activate.c | 2 +-
|
|
||||||
cputree.c | 8 ++++----
|
|
||||||
procinterrupts.c | 12 ++++++------
|
|
||||||
3 files changed, 11 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/activate.c b/activate.c
|
|
||||||
index 8fd9bde..2812976 100644
|
|
||||||
--- a/activate.c
|
|
||||||
+++ b/activate.c
|
|
||||||
@@ -44,7 +44,7 @@ static int check_affinity(struct irq_info *info, cpumask_t applied_mask)
|
|
||||||
file = fopen(buf, "r");
|
|
||||||
if (!file)
|
|
||||||
return 1;
|
|
||||||
- if (getline(&line, &size, file)==0) {
|
|
||||||
+ if (getline(&line, &size, file)<=0) {
|
|
||||||
free(line);
|
|
||||||
fclose(file);
|
|
||||||
return 1;
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 5551784..91c6111 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -278,7 +278,7 @@ static void do_one_cpu(char *path)
|
|
||||||
if (file) {
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file)==0)
|
|
||||||
+ if (getline(&line, &size, file)<=0)
|
|
||||||
return;
|
|
||||||
fclose(file);
|
|
||||||
if (line && line[0]=='0') {
|
|
||||||
@@ -323,7 +323,7 @@ static void do_one_cpu(char *path)
|
|
||||||
if (file) {
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file))
|
|
||||||
+ if (getline(&line, &size, file) > 0)
|
|
||||||
cpumask_parse_user(line, strlen(line), package_mask);
|
|
||||||
fclose(file);
|
|
||||||
free(line);
|
|
||||||
@@ -335,7 +335,7 @@ static void do_one_cpu(char *path)
|
|
||||||
if (file) {
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file))
|
|
||||||
+ if (getline(&line, &size, file) > 0)
|
|
||||||
packageid = strtoul(line, NULL, 10);
|
|
||||||
fclose(file);
|
|
||||||
free(line);
|
|
||||||
@@ -368,7 +368,7 @@ static void do_one_cpu(char *path)
|
|
||||||
if (file) {
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file))
|
|
||||||
+ if (getline(&line, &size, file) > 0)
|
|
||||||
cpumask_parse_user(line, strlen(line), cache_mask);
|
|
||||||
fclose(file);
|
|
||||||
free(line);
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 3898b10..03b4593 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -161,7 +161,7 @@ GList* collect_full_irq_list()
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* first line is the header we don't need; nuke it */
|
|
||||||
- if (getline(&line, &size, file)==0) {
|
|
||||||
+ if (getline(&line, &size, file)<=0) {
|
|
||||||
free(line);
|
|
||||||
fclose(file);
|
|
||||||
return NULL;
|
|
||||||
@@ -174,7 +174,7 @@ GList* collect_full_irq_list()
|
|
||||||
char *c;
|
|
||||||
char *savedline = NULL;
|
|
||||||
|
|
||||||
- if (getline(&line, &size, file)==0)
|
|
||||||
+ if (getline(&line, &size, file)<=0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* lines with letters in front are special, like NMI count. Ignore */
|
|
||||||
@@ -248,7 +248,7 @@ void parse_proc_interrupts(void)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* first line is the header we don't need; nuke it */
|
|
||||||
- if (getline(&line, &size, file)==0) {
|
|
||||||
+ if (getline(&line, &size, file)<=0) {
|
|
||||||
free(line);
|
|
||||||
fclose(file);
|
|
||||||
return;
|
|
||||||
@@ -262,7 +262,7 @@ void parse_proc_interrupts(void)
|
|
||||||
struct irq_info *info;
|
|
||||||
char savedline[1024];
|
|
||||||
|
|
||||||
- if (getline(&line, &size, file)==0)
|
|
||||||
+ if (getline(&line, &size, file)<=0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!proc_int_has_msi)
|
|
||||||
@@ -444,7 +444,7 @@ void parse_proc_stat(void)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* first line is the header we don't need; nuke it */
|
|
||||||
- if (getline(&line, &size, file)==0) {
|
|
||||||
+ if (getline(&line, &size, file)<=0) {
|
|
||||||
free(line);
|
|
||||||
log(TO_ALL, LOG_WARNING, "WARNING read /proc/stat. balancing is broken\n");
|
|
||||||
fclose(file);
|
|
||||||
@@ -453,7 +453,7 @@ void parse_proc_stat(void)
|
|
||||||
|
|
||||||
cpucount = 0;
|
|
||||||
while (!feof(file)) {
|
|
||||||
- if (getline(&line, &size, file)==0)
|
|
||||||
+ if (getline(&line, &size, file)<=0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!strstr(line, "cpu"))
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,114 +0,0 @@
|
|||||||
From 0e741b26246bf7bd5630812c551221d3f87f43d7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Mon, 7 Oct 2019 11:52:08 +0800
|
|
||||||
Subject: [PATCH 21/53] prevent NULL pointer dereference when memory allocation
|
|
||||||
failure
|
|
||||||
|
|
||||||
There are several places where memory allocation does not check return
|
|
||||||
values, adding null pointer checks.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
cputree.c | 2 ++
|
|
||||||
irqbalance.c | 24 ++++++++++++++++++++++++
|
|
||||||
2 files changed, 26 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index a90cbbe..8b9413b 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -432,6 +432,8 @@ static void dump_irq(struct irq_info *info, void *data)
|
|
||||||
int i;
|
|
||||||
char * indent = malloc (sizeof(char) * (spaces + 1));
|
|
||||||
|
|
||||||
+ if (!indent)
|
|
||||||
+ return;
|
|
||||||
for ( i = 0; i < spaces; i++ )
|
|
||||||
indent[i] = log_indent[0];
|
|
||||||
|
|
||||||
diff --git a/irqbalance.c b/irqbalance.c
|
|
||||||
index 8199c06..a06809c 100644
|
|
||||||
--- a/irqbalance.c
|
|
||||||
+++ b/irqbalance.c
|
|
||||||
@@ -313,6 +313,9 @@ void get_irq_data(struct irq_info *irq, void *data)
|
|
||||||
else
|
|
||||||
*irqdata = realloc(*irqdata, strlen(*irqdata) + 24 + 1 + 11 + 20 + 20 + 11);
|
|
||||||
|
|
||||||
+ if (!*irqdata)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
sprintf(*irqdata + strlen(*irqdata),
|
|
||||||
"IRQ %d LOAD %lu DIFF %lu CLASS %d ", irq->irq, irq->load,
|
|
||||||
(irq->irq_count - irq->last_irq_count), irq->class);
|
|
||||||
@@ -344,6 +347,9 @@ void get_object_stat(struct topo_obj *object, void *data)
|
|
||||||
*stats = realloc(*stats, strlen(*stats) + irqdlen + 31 + 11 + 20 + 11 + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (!*stats)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
sprintf(*stats + strlen(*stats), "TYPE %d NUMBER %d LOAD %lu SAVE_MODE %d %s",
|
|
||||||
object->obj_type, object->number, object->load,
|
|
||||||
object->powersave_mode, irq_data ? irq_data : "");
|
|
||||||
@@ -380,6 +386,10 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
goto out_close;
|
|
||||||
}
|
|
||||||
cmsg = CMSG_FIRSTHDR(&msg);
|
|
||||||
+ if (!cmsg) {
|
|
||||||
+ log(TO_ALL, LOG_WARNING, "Connection no memory.\n");
|
|
||||||
+ goto out_close;
|
|
||||||
+ }
|
|
||||||
if ((cmsg->cmsg_level == SOL_SOCKET) &&
|
|
||||||
(cmsg->cmsg_type == SCM_CREDENTIALS)) {
|
|
||||||
struct ucred *credentials = (struct ucred *) CMSG_DATA(cmsg);
|
|
||||||
@@ -403,6 +413,9 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
strlen("sleep ")))) {
|
|
||||||
char *sleep_string = malloc(
|
|
||||||
sizeof(char) * (recv_size - strlen("settings sleep ")));
|
|
||||||
+
|
|
||||||
+ if (!sleep_string)
|
|
||||||
+ goto out_close;
|
|
||||||
strncpy(sleep_string, buff + strlen("settings sleep "),
|
|
||||||
recv_size - strlen("settings sleep "));
|
|
||||||
int new_iterval = strtoul(sleep_string, NULL, 10);
|
|
||||||
@@ -415,6 +428,9 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
char *end;
|
|
||||||
char *irq_string = malloc(
|
|
||||||
sizeof(char) * (recv_size - strlen("settings ban irqs ")));
|
|
||||||
+
|
|
||||||
+ if (!irq_string)
|
|
||||||
+ goto out_close;
|
|
||||||
strncpy(irq_string, buff + strlen("settings ban irqs "),
|
|
||||||
recv_size - strlen("settings ban irqs "));
|
|
||||||
g_list_free_full(cl_banned_irqs, free);
|
|
||||||
@@ -433,6 +449,9 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
strlen("cpus")))) {
|
|
||||||
char *cpu_ban_string = malloc(
|
|
||||||
sizeof(char) * (recv_size - strlen("settings cpus ")));
|
|
||||||
+
|
|
||||||
+ if (!cpu_ban_string)
|
|
||||||
+ goto out_close;
|
|
||||||
strncpy(cpu_ban_string, buff + strlen("settings cpus "),
|
|
||||||
recv_size - strlen("settings cpus "));
|
|
||||||
banned_cpumask_from_ui = strtok(cpu_ban_string, " ");
|
|
||||||
@@ -446,12 +465,17 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
|
||||||
if (!strncmp(buff, "setup", strlen("setup"))) {
|
|
||||||
char banned[512];
|
|
||||||
char *setup = calloc(strlen("SLEEP ") + 11 + 1, 1);
|
|
||||||
+
|
|
||||||
+ if (!setup)
|
|
||||||
+ goto out_close;
|
|
||||||
snprintf(setup, strlen("SLEEP ") + 11 + 1, "SLEEP %d ", sleep_interval);
|
|
||||||
if(g_list_length(cl_banned_irqs) > 0) {
|
|
||||||
for_each_irq(cl_banned_irqs, get_irq_data, setup);
|
|
||||||
}
|
|
||||||
cpumask_scnprintf(banned, 512, banned_cpus);
|
|
||||||
setup = realloc(setup, strlen(setup) + strlen(banned) + 7 + 1);
|
|
||||||
+ if (!setup)
|
|
||||||
+ goto out_close;
|
|
||||||
snprintf(setup + strlen(setup), strlen(banned) + 7 + 1,
|
|
||||||
"BANNED %s", banned);
|
|
||||||
send(sock, setup, strlen(setup), 0);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
From 4c22b5fa6009a2f7262801925105749aee9ff0bc Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Thu, 24 Oct 2019 21:51:54 +0800
|
|
||||||
Subject: [PATCH 29/53] reduce redundant check in add_missing_irq()
|
|
||||||
|
|
||||||
get_irq_info() is invoked in add_new_irq(), it is unnecessary to invoke
|
|
||||||
again in add_missing_irq().
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 4 +---
|
|
||||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 81ad8a6..7454c5f 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -744,11 +744,9 @@ static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
|
||||||
|
|
||||||
static void add_missing_irq(struct irq_info *info, void *attr)
|
|
||||||
{
|
|
||||||
- struct irq_info *lookup = get_irq_info(info->irq);
|
|
||||||
GList *proc_interrupts = (GList *) attr;
|
|
||||||
|
|
||||||
- if (!lookup)
|
|
||||||
- add_new_irq(info->irq, info, proc_interrupts);
|
|
||||||
+ add_new_irq(info->irq, info, proc_interrupts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_tmp_irqs(gpointer data)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,347 +0,0 @@
|
|||||||
From c7122666e0f72634512284fe90258daf1dca5914 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
Date: Sat, 12 Oct 2019 12:00:59 +0800
|
|
||||||
Subject: [PATCH 24/53] reduce redundant code for file processing
|
|
||||||
|
|
||||||
There are some redundant codes about file processing which with the same
|
|
||||||
logic. so abstract the same logic to the one function, and invoke it
|
|
||||||
where it need.
|
|
||||||
|
|
||||||
A different is that in add_one_node(), not return if fopen() fail, and
|
|
||||||
remove the ferror() judgement, I think it has no effect.
|
|
||||||
|
|
||||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
|
||||||
---
|
|
||||||
activate.c | 14 +-----
|
|
||||||
classify.c | 21 ++------
|
|
||||||
cputree.c | 132 +++++++++++++++++++++++----------------------------
|
|
||||||
irqbalance.h | 3 ++
|
|
||||||
numa.c | 24 ++--------
|
|
||||||
5 files changed, 71 insertions(+), 123 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/activate.c b/activate.c
|
|
||||||
index 2812976..ab9702d 100644
|
|
||||||
--- a/activate.c
|
|
||||||
+++ b/activate.c
|
|
||||||
@@ -36,22 +36,10 @@ static int check_affinity(struct irq_info *info, cpumask_t applied_mask)
|
|
||||||
{
|
|
||||||
cpumask_t current_mask;
|
|
||||||
char buf[PATH_MAX];
|
|
||||||
- char *line = NULL;
|
|
||||||
- size_t size = 0;
|
|
||||||
- FILE *file;
|
|
||||||
|
|
||||||
sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
|
|
||||||
- file = fopen(buf, "r");
|
|
||||||
- if (!file)
|
|
||||||
+ if (process_one_line(buf, get_mask_from_bitmap, ¤t_mask) < 0)
|
|
||||||
return 1;
|
|
||||||
- if (getline(&line, &size, file)<=0) {
|
|
||||||
- free(line);
|
|
||||||
- fclose(file);
|
|
||||||
- return 1;
|
|
||||||
- }
|
|
||||||
- cpumask_parse_user(line, strlen(line), current_mask);
|
|
||||||
- fclose(file);
|
|
||||||
- free(line);
|
|
||||||
|
|
||||||
return cpus_equal(applied_mask, current_mask);
|
|
||||||
}
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index be1ad0c..c1ac230 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -350,10 +350,7 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
|
|
||||||
int numa_node;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
FILE *fd;
|
|
||||||
- char *lcpu_mask;
|
|
||||||
GList *entry;
|
|
||||||
- ssize_t ret;
|
|
||||||
- size_t blen;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First check to make sure this isn't a duplicate entry
|
|
||||||
@@ -409,23 +406,11 @@ get_numa_node:
|
|
||||||
else
|
|
||||||
new->numa_node = get_numa_node(numa_node);
|
|
||||||
|
|
||||||
+ cpus_setall(new->cpumask);
|
|
||||||
+
|
|
||||||
sprintf(path, "%s/local_cpus", devpath);
|
|
||||||
- fd = fopen(path, "r");
|
|
||||||
- if (!fd) {
|
|
||||||
- cpus_setall(new->cpumask);
|
|
||||||
- goto out;
|
|
||||||
- }
|
|
||||||
- lcpu_mask = NULL;
|
|
||||||
- ret = getline(&lcpu_mask, &blen, fd);
|
|
||||||
- fclose(fd);
|
|
||||||
- if (ret <= 0) {
|
|
||||||
- cpus_setall(new->cpumask);
|
|
||||||
- } else {
|
|
||||||
- cpumask_parse_user(lcpu_mask, ret, new->cpumask);
|
|
||||||
- }
|
|
||||||
- free(lcpu_mask);
|
|
||||||
+ process_one_line(path, get_mask_from_bitmap, &new->cpumask);
|
|
||||||
|
|
||||||
-out:
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "Adding IRQ %d to database\n", irq);
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
diff --git a/cputree.c b/cputree.c
|
|
||||||
index 8b9413b..acf6a47 100644
|
|
||||||
--- a/cputree.c
|
|
||||||
+++ b/cputree.c
|
|
||||||
@@ -59,6 +59,37 @@ cpumask_t cpu_possible_map;
|
|
||||||
*/
|
|
||||||
cpumask_t unbanned_cpus;
|
|
||||||
|
|
||||||
+int process_one_line(char *path, void (*cb)(char *line, void *data), void *data)
|
|
||||||
+{
|
|
||||||
+ FILE *file;
|
|
||||||
+ char *line = NULL;
|
|
||||||
+ size_t size = 0;
|
|
||||||
+ int ret = -1;
|
|
||||||
+
|
|
||||||
+ file = fopen(path, "r");
|
|
||||||
+ if (!file)
|
|
||||||
+ return ret;
|
|
||||||
+
|
|
||||||
+ if (getline(&line, &size, file) > 0) {
|
|
||||||
+ cb(line, data);
|
|
||||||
+ ret = 0;
|
|
||||||
+ }
|
|
||||||
+ free(line);
|
|
||||||
+ fclose(file);
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void get_mask_from_bitmap(char *line, void *mask)
|
|
||||||
+{
|
|
||||||
+ cpumask_parse_user(line, strlen(line), *(cpumask_t *)mask);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void get_mask_from_cpulist(char *line, void *mask)
|
|
||||||
+{
|
|
||||||
+ if (strlen(line) && line[0] != '\n')
|
|
||||||
+ cpulist_parse(line, strlen(line), *(cpumask_t *)mask);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* By default do not place IRQs on CPUs the kernel keeps isolated or
|
|
||||||
* nohz_full, as specified through the boot commandline. Users can
|
|
||||||
@@ -66,9 +97,7 @@ cpumask_t unbanned_cpus;
|
|
||||||
*/
|
|
||||||
static void setup_banned_cpus(void)
|
|
||||||
{
|
|
||||||
- FILE *file;
|
|
||||||
- char *line = NULL;
|
|
||||||
- size_t size = 0;
|
|
||||||
+ char *path = NULL;
|
|
||||||
char buffer[4096];
|
|
||||||
cpumask_t nohz_full;
|
|
||||||
cpumask_t isolated_cpus;
|
|
||||||
@@ -86,29 +115,12 @@ static void setup_banned_cpus(void)
|
|
||||||
cpumask_parse_user(getenv("IRQBALANCE_BANNED_CPUS"), strlen(getenv("IRQBALANCE_BANNED_CPUS")), banned_cpus);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
- file = fopen("/sys/devices/system/cpu/isolated", "r");
|
|
||||||
- if (file) {
|
|
||||||
- if (getline(&line, &size, file) > 0) {
|
|
||||||
- if (strlen(line) && line[0] != '\n')
|
|
||||||
- cpulist_parse(line, strlen(line), isolated_cpus);
|
|
||||||
- }
|
|
||||||
- free(line);
|
|
||||||
- line = NULL;
|
|
||||||
- size = 0;
|
|
||||||
- fclose(file);
|
|
||||||
- }
|
|
||||||
|
|
||||||
- file = fopen("/sys/devices/system/cpu/nohz_full", "r");
|
|
||||||
- if (file) {
|
|
||||||
- if (getline(&line, &size, file) > 0) {
|
|
||||||
- if (strlen(line) && line[0] != '\n')
|
|
||||||
- cpulist_parse(line, strlen(line), nohz_full);
|
|
||||||
- }
|
|
||||||
- free(line);
|
|
||||||
- line = NULL;
|
|
||||||
- size = 0;
|
|
||||||
- fclose(file);
|
|
||||||
- }
|
|
||||||
+ path = "/sys/devices/system/cpu/isolated";
|
|
||||||
+ process_one_line(path, get_mask_from_cpulist, &isolated_cpus);
|
|
||||||
+
|
|
||||||
+ path = "/sys/devices/system/cpu/nohz_full";
|
|
||||||
+ process_one_line(path, get_mask_from_cpulist, &nohz_full);
|
|
||||||
|
|
||||||
cpus_or(banned_cpus, nohz_full, isolated_cpus);
|
|
||||||
|
|
||||||
@@ -258,11 +270,24 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
|
|
||||||
return cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void get_offline_status(char *line, void *data)
|
|
||||||
+{
|
|
||||||
+ int *status = (int *)data;
|
|
||||||
+
|
|
||||||
+ *status = (line && line[0] == '0') ? 1 : 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void get_packageid(char *line, void *data)
|
|
||||||
+{
|
|
||||||
+ int *packageid = (int *)data;
|
|
||||||
+
|
|
||||||
+ *packageid = strtoul(line, NULL, 10);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#define ADJ_SIZE(r,s) PATH_MAX-strlen(r)-strlen(#s)
|
|
||||||
static void do_one_cpu(char *path)
|
|
||||||
{
|
|
||||||
struct topo_obj *cpu;
|
|
||||||
- FILE *file;
|
|
||||||
char new_path[PATH_MAX];
|
|
||||||
cpumask_t cache_mask, package_mask;
|
|
||||||
struct topo_obj *cache;
|
|
||||||
@@ -271,21 +296,13 @@ static void do_one_cpu(char *path)
|
|
||||||
int nodeid;
|
|
||||||
int packageid = 0;
|
|
||||||
unsigned int max_cache_index, cache_index, cache_stat;
|
|
||||||
- int ret = 1;
|
|
||||||
+ int offline_status = 0;
|
|
||||||
|
|
||||||
/* skip offline cpus */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path,"/online"), "%s/online", path);
|
|
||||||
- file = fopen(new_path, "r");
|
|
||||||
- if (file) {
|
|
||||||
- char *line = NULL;
|
|
||||||
- size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file)>0)
|
|
||||||
- ret = (line && line[0]=='0') ? 1 : 0;
|
|
||||||
- fclose(file);
|
|
||||||
- free(line);
|
|
||||||
- if (ret)
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
+ process_one_line(new_path, get_offline_status, &offline_status);
|
|
||||||
+ if (offline_status)
|
|
||||||
+ return;
|
|
||||||
|
|
||||||
cpu = calloc(sizeof(struct topo_obj), 1);
|
|
||||||
if (!cpu)
|
|
||||||
@@ -313,36 +330,17 @@ static void do_one_cpu(char *path)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ cpu_set(cpu->number, package_mask);
|
|
||||||
|
|
||||||
/* try to read the package mask; if it doesn't exist assume solitary */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path, "/topology/core_siblings"),
|
|
||||||
"%s/topology/core_siblings", path);
|
|
||||||
- file = fopen(new_path, "r");
|
|
||||||
- cpu_set(cpu->number, package_mask);
|
|
||||||
- if (file) {
|
|
||||||
- char *line = NULL;
|
|
||||||
- size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file) > 0)
|
|
||||||
- cpumask_parse_user(line, strlen(line), package_mask);
|
|
||||||
- fclose(file);
|
|
||||||
- free(line);
|
|
||||||
- line = NULL;
|
|
||||||
- size = 0;
|
|
||||||
- }
|
|
||||||
+ process_one_line(new_path, get_mask_from_bitmap, &package_mask);
|
|
||||||
+
|
|
||||||
/* try to read the package id */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path, "/topology/physical_package_id"),
|
|
||||||
"%s/topology/physical_package_id", path);
|
|
||||||
- file = fopen(new_path, "r");
|
|
||||||
- if (file) {
|
|
||||||
- char *line = NULL;
|
|
||||||
- size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file) > 0)
|
|
||||||
- packageid = strtoul(line, NULL, 10);
|
|
||||||
- fclose(file);
|
|
||||||
- free(line);
|
|
||||||
- line = NULL;
|
|
||||||
- size = 0;
|
|
||||||
- }
|
|
||||||
+ process_one_line(new_path, get_packageid, &packageid);
|
|
||||||
|
|
||||||
/* try to read the cache mask; if it doesn't exist assume solitary */
|
|
||||||
/* We want the deepest cache level available */
|
|
||||||
@@ -367,17 +365,7 @@ static void do_one_cpu(char *path)
|
|
||||||
/* Extra 10 subtraction is for the max character length of %d */
|
|
||||||
snprintf(new_path, ADJ_SIZE(path, "/cache/index%d/shared_cpu_map") - 10,
|
|
||||||
"%s/cache/index%d/shared_cpu_map", path, max_cache_index);
|
|
||||||
- file = fopen(new_path, "r");
|
|
||||||
- if (file) {
|
|
||||||
- char *line = NULL;
|
|
||||||
- size_t size = 0;
|
|
||||||
- if (getline(&line, &size, file) > 0)
|
|
||||||
- cpumask_parse_user(line, strlen(line), cache_mask);
|
|
||||||
- fclose(file);
|
|
||||||
- free(line);
|
|
||||||
- line = NULL;
|
|
||||||
- size = 0;
|
|
||||||
- }
|
|
||||||
+ process_one_line(new_path, get_mask_from_bitmap, &cache_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeid=-1;
|
|
||||||
diff --git a/irqbalance.h b/irqbalance.h
|
|
||||||
index 5895e34..a3e561e 100644
|
|
||||||
--- a/irqbalance.h
|
|
||||||
+++ b/irqbalance.h
|
|
||||||
@@ -160,5 +160,8 @@ extern unsigned int log_mask;
|
|
||||||
#define SOCKET_PATH "irqbalance"
|
|
||||||
#define SOCKET_TMPFS "/run/irqbalance/"
|
|
||||||
|
|
||||||
+extern int process_one_line(char *path, void (*cb)(char *line, void *data), void *data);
|
|
||||||
+extern void get_mask_from_bitmap(char *line, void *mask);
|
|
||||||
+
|
|
||||||
#endif /* __INCLUDE_GUARD_IRQBALANCE_H_ */
|
|
||||||
|
|
||||||
diff --git a/numa.c b/numa.c
|
|
||||||
index 542e1f4..f1284da 100644
|
|
||||||
--- a/numa.c
|
|
||||||
+++ b/numa.c
|
|
||||||
@@ -56,31 +56,15 @@ static void add_one_node(const char *nodename)
|
|
||||||
{
|
|
||||||
char path[PATH_MAX];
|
|
||||||
struct topo_obj *new;
|
|
||||||
- char *cpustr = NULL;
|
|
||||||
- FILE *f;
|
|
||||||
- ssize_t ret;
|
|
||||||
- size_t blen;
|
|
||||||
|
|
||||||
new = calloc(1, sizeof(struct topo_obj));
|
|
||||||
if (!new)
|
|
||||||
return;
|
|
||||||
+
|
|
||||||
+ cpus_clear(new->mask);
|
|
||||||
sprintf(path, "%s/%s/cpumap", SYSFS_NODE_PATH, nodename);
|
|
||||||
- f = fopen(path, "r");
|
|
||||||
- if (!f) {
|
|
||||||
- free(new);
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
- if (ferror(f)) {
|
|
||||||
- cpus_clear(new->mask);
|
|
||||||
- } else {
|
|
||||||
- ret = getline(&cpustr, &blen, f);
|
|
||||||
- if (ret <= 0)
|
|
||||||
- cpus_clear(new->mask);
|
|
||||||
- else
|
|
||||||
- cpumask_parse_user(cpustr, ret, new->mask);
|
|
||||||
- free(cpustr);
|
|
||||||
- }
|
|
||||||
- fclose(f);
|
|
||||||
+ process_one_line(path, get_mask_from_bitmap, &new->mask);
|
|
||||||
+
|
|
||||||
new->obj_type = OBJ_TYPE_NODE;
|
|
||||||
new->number = strtoul(&nodename[4], NULL, 10);
|
|
||||||
new->obj_type_list = &numa_nodes;
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
From 83917c1c266ee2c3b3f948fc7785d5ff73d3b297 Mon Sep 17 00:00:00 2001
|
|
||||||
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
|
||||||
Date: Mon, 21 Oct 2019 19:41:49 +0800
|
|
||||||
Subject: [PATCH 27/53] remove "c++;" in parse_proc_interrupts
|
|
||||||
|
|
||||||
in parse_proc_interrupts, just get irq's name. After "*c = 0", characters after ":" in line and c are useless. There is no need to let c increase.
|
|
||||||
---
|
|
||||||
procinterrupts.c | 1 -
|
|
||||||
1 file changed, 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
|
||||||
index 4a7a5d5..29b0fef 100644
|
|
||||||
--- a/procinterrupts.c
|
|
||||||
+++ b/procinterrupts.c
|
|
||||||
@@ -212,7 +212,6 @@ GList* collect_full_irq_list()
|
|
||||||
irq_mod = last_token;
|
|
||||||
|
|
||||||
*c = 0;
|
|
||||||
- c++;
|
|
||||||
number = strtoul(line, NULL, 10);
|
|
||||||
|
|
||||||
info = calloc(sizeof(struct irq_info), 1);
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
From 9e6048da9767b9695d3bd5d95bfa604a358b2cf2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
|
||||||
Date: Fri, 20 Sep 2019 10:15:51 +0800
|
|
||||||
Subject: [PATCH 15/53] remove unused path in check_for_irq_ban
|
|
||||||
|
|
||||||
that path variable is actually unused in check_for_irq_ban. And in build_one_dev_entry, sometimes the path is a file, sometimes it's a path. So remove the path variable entirely.
|
|
||||||
---
|
|
||||||
classify.c | 10 +++++-----
|
|
||||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 9b0177d..15d0ab2 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -599,7 +599,7 @@ static int check_for_module_ban(char *name)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int check_for_irq_ban(char *path __attribute__((unused)), int irq, GList *proc_interrupts)
|
|
||||||
+static int check_for_irq_ban(int irq, GList *proc_interrupts)
|
|
||||||
{
|
|
||||||
struct irq_info find, *res;
|
|
||||||
GList *entry;
|
|
||||||
@@ -658,7 +658,7 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
if (new)
|
|
||||||
continue;
|
|
||||||
get_irq_user_policy(devpath, irqnum, &pol);
|
|
||||||
- if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
|
||||||
+ if ((pol.ban == 1) || (check_for_irq_ban(irqnum, tmp_irqs))) {
|
|
||||||
add_banned_irq(irqnum, &banned_irqs);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
@@ -692,8 +692,8 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
new = get_irq_info(irqnum);
|
|
||||||
if (new)
|
|
||||||
goto done;
|
|
||||||
- get_irq_user_policy(devpath, irqnum, &pol);
|
|
||||||
- if ((pol.ban == 1) || (check_for_irq_ban(devpath, irqnum, tmp_irqs))) {
|
|
||||||
+ get_irq_user_policy(irqnum, &pol);
|
|
||||||
+ if ((pol.ban == 1) || (check_for_irq_ban(irqnum, tmp_irqs))) {
|
|
||||||
add_banned_irq(irqnum, &banned_irqs);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
@@ -745,7 +745,7 @@ static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
|
||||||
|
|
||||||
/* Set NULL devpath for the irq has no sysfs entries */
|
|
||||||
get_irq_user_policy(NULL, irq, &pol);
|
|
||||||
- if ((pol.ban == 1) || check_for_irq_ban(NULL, irq, proc_interrupts)) { /*FIXME*/
|
|
||||||
+ if ((pol.ban == 1) || check_for_irq_ban(irq, proc_interrupts)) { /*FIXME*/
|
|
||||||
add_banned_irq(irq, &banned_irqs);
|
|
||||||
new = get_irq_info(irq);
|
|
||||||
} else
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
From cfe3d10d37e44be4bb94cb715dbe6fde9e8a60ff Mon Sep 17 00:00:00 2001
|
|
||||||
From: Pyxisha <xiashuang1@huawei.com>
|
|
||||||
Date: Mon, 15 Jul 2019 10:44:50 +0800
|
|
||||||
Subject: [PATCH 04/53] some variable and judgement are unnecessary in
|
|
||||||
activate_mappings
|
|
||||||
|
|
||||||
sign_off_by Shuang Xia <xiashuang1@huawei.com>
|
|
||||||
---
|
|
||||||
activate.c | 15 ++++-----------
|
|
||||||
1 file changed, 4 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/activate.c b/activate.c
|
|
||||||
index 8fd3dd0..8fd9bde 100644
|
|
||||||
--- a/activate.c
|
|
||||||
+++ b/activate.c
|
|
||||||
@@ -60,8 +60,6 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
|
||||||
{
|
|
||||||
char buf[PATH_MAX];
|
|
||||||
FILE *file;
|
|
||||||
- cpumask_t applied_mask;
|
|
||||||
- int valid_mask = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* only activate mappings for irqs that have moved
|
|
||||||
@@ -69,18 +67,13 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
|
||||||
if (!info->moved)
|
|
||||||
return;
|
|
||||||
|
|
||||||
- if (info->assigned_obj) {
|
|
||||||
- applied_mask = info->assigned_obj->mask;
|
|
||||||
- valid_mask = 1;
|
|
||||||
- }
|
|
||||||
+ if (!info->assigned_obj)
|
|
||||||
+ return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't activate anything for which we have an invalid mask
|
|
||||||
*/
|
|
||||||
- if (!valid_mask || check_affinity(info, applied_mask))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- if (!info->assigned_obj)
|
|
||||||
+ if (check_affinity(info, info->assigned_obj->mask))
|
|
||||||
return;
|
|
||||||
|
|
||||||
sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
|
|
||||||
@@ -88,7 +81,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
|
|
||||||
if (!file)
|
|
||||||
return;
|
|
||||||
|
|
||||||
- cpumask_scnprintf(buf, PATH_MAX, applied_mask);
|
|
||||||
+ cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
|
|
||||||
fprintf(file, "%s", buf);
|
|
||||||
fclose(file);
|
|
||||||
info->moved = 0; /*migration is done*/
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,152 +0,0 @@
|
|||||||
From 0c097c000e6af0f317c54ef1ded53610ec54194d Mon Sep 17 00:00:00 2001
|
|
||||||
From: x00456305 <xiashuang1@huawei.com>
|
|
||||||
Date: Thu, 11 Jul 2019 16:08:08 +0800
|
|
||||||
Subject: [PATCH 03/53] use policy prior to the default values
|
|
||||||
|
|
||||||
Currently user-defined policies against non-PCI devices' interrupts
|
|
||||||
are not working properly.
|
|
||||||
|
|
||||||
For example, when trying to set "balance_level=core" for a non-PCI
|
|
||||||
device interrupt which is classified as "other", will result in
|
|
||||||
the level of "package" because overrided in add_new_irq().
|
|
||||||
|
|
||||||
This patch fixes this by restricting irq info initializations in
|
|
||||||
add_one_irq_to_db(), which requires a change on its parameters.
|
|
||||||
|
|
||||||
Signed-off-by: Shuang Xia <xiashuang1@huawei.com>
|
|
||||||
Signed-off-by: Yun Wu <wuyun.wu@huawei.com>
|
|
||||||
---
|
|
||||||
classify.c | 49 +++++++++++++++++++++----------------------------
|
|
||||||
1 file changed, 21 insertions(+), 28 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 8a0dc14..f40ea99 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -343,10 +343,10 @@ void add_cl_banned_module(char *modname)
|
|
||||||
* related device. NULL devpath means no sysfs entries for
|
|
||||||
* this irq.
|
|
||||||
*/
|
|
||||||
-static struct irq_info *add_one_irq_to_db(const char *devpath, int irq, struct user_irq_policy *pol)
|
|
||||||
+static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *hint, struct user_irq_policy *pol)
|
|
||||||
{
|
|
||||||
- int irq_class = IRQ_OTHER;
|
|
||||||
- struct irq_info *new, find;
|
|
||||||
+ int irq = hint->irq;
|
|
||||||
+ struct irq_info *new;
|
|
||||||
int numa_node;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
FILE *fd;
|
|
||||||
@@ -358,8 +358,7 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, int irq, struct u
|
|
||||||
/*
|
|
||||||
* First check to make sure this isn't a duplicate entry
|
|
||||||
*/
|
|
||||||
- find.irq = irq;
|
|
||||||
- entry = g_list_find_custom(interrupts_db, &find, compare_ints);
|
|
||||||
+ entry = g_list_find_custom(interrupts_db, hint, compare_ints);
|
|
||||||
if (entry) {
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "DROPPING DUPLICATE ENTRY FOR IRQ %d on path %s\n", irq, devpath);
|
|
||||||
return NULL;
|
|
||||||
@@ -375,23 +374,24 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, int irq, struct u
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
new->irq = irq;
|
|
||||||
- new->class = IRQ_OTHER;
|
|
||||||
+ new->type = hint->type;
|
|
||||||
+ new->class = hint->class;
|
|
||||||
|
|
||||||
interrupts_db = g_list_append(interrupts_db, new);
|
|
||||||
|
|
||||||
/* Some special irqs have NULL devpath */
|
|
||||||
if (devpath != NULL) {
|
|
||||||
/* Map PCI class code to irq class */
|
|
||||||
- irq_class = get_irq_class(devpath);
|
|
||||||
+ int irq_class = get_irq_class(devpath);
|
|
||||||
if (irq_class < 0)
|
|
||||||
goto get_numa_node;
|
|
||||||
+ new->class = irq_class;
|
|
||||||
}
|
|
||||||
|
|
||||||
- new->class = irq_class;
|
|
||||||
if (pol->level >= 0)
|
|
||||||
new->level = pol->level;
|
|
||||||
else
|
|
||||||
- new->level = map_class_to_level[irq_class];
|
|
||||||
+ new->level = map_class_to_level[new->class];
|
|
||||||
|
|
||||||
get_numa_node:
|
|
||||||
numa_node = -1;
|
|
||||||
@@ -634,13 +634,16 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
DIR *msidir;
|
|
||||||
FILE *fd;
|
|
||||||
int irqnum;
|
|
||||||
- struct irq_info *new;
|
|
||||||
+ struct irq_info *new, hint;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
char devpath[PATH_MAX];
|
|
||||||
struct user_irq_policy pol;
|
|
||||||
|
|
||||||
sprintf(path, "%s/%s/msi_irqs", SYSPCI_DIR, dirname);
|
|
||||||
sprintf(devpath, "%s/%s", SYSPCI_DIR, dirname);
|
|
||||||
+
|
|
||||||
+ /* Needs to be further classified */
|
|
||||||
+ hint.class = IRQ_OTHER;
|
|
||||||
|
|
||||||
msidir = opendir(path);
|
|
||||||
|
|
||||||
@@ -659,10 +662,11 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
add_banned_irq(irqnum, &banned_irqs);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
- new = add_one_irq_to_db(devpath, irqnum, &pol);
|
|
||||||
+ hint.irq = irqnum;
|
|
||||||
+ hint.type = IRQ_TYPE_MSIX;
|
|
||||||
+ new = add_one_irq_to_db(devpath, &hint, &pol);
|
|
||||||
if (!new)
|
|
||||||
continue;
|
|
||||||
- new->type = IRQ_TYPE_MSIX;
|
|
||||||
}
|
|
||||||
} while (entry != NULL);
|
|
||||||
closedir(msidir);
|
|
||||||
@@ -694,10 +698,11 @@ static void build_one_dev_entry(const char *dirname, GList *tmp_irqs)
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
- new = add_one_irq_to_db(devpath, irqnum, &pol);
|
|
||||||
+ hint.irq = irqnum;
|
|
||||||
+ hint.type = IRQ_TYPE_LEGACY;
|
|
||||||
+ new = add_one_irq_to_db(devpath, &hint, &pol);
|
|
||||||
if (!new)
|
|
||||||
goto done;
|
|
||||||
- new->type = IRQ_TYPE_LEGACY;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
@@ -744,22 +749,10 @@ static void add_new_irq(int irq, struct irq_info *hint, GList *proc_interrupts)
|
|
||||||
add_banned_irq(irq, &banned_irqs);
|
|
||||||
new = get_irq_info(irq);
|
|
||||||
} else
|
|
||||||
- new = add_one_irq_to_db(NULL, irq, &pol);
|
|
||||||
+ new = add_one_irq_to_db(NULL, hint, &pol);
|
|
||||||
|
|
||||||
- if (!new) {
|
|
||||||
+ if (!new)
|
|
||||||
log(TO_CONSOLE, LOG_WARNING, "add_new_irq: Failed to add irq %d\n", irq);
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /*
|
|
||||||
- * Override some of the new irq defaults here
|
|
||||||
- */
|
|
||||||
- if (hint) {
|
|
||||||
- new->type = hint->type;
|
|
||||||
- new->class = hint->class;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- new->level = map_class_to_level[new->class];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void add_missing_irq(struct irq_info *info, void *attr)
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
From 083c99d9bfaf8a0a04ea533bb2a17457d56945ec Mon Sep 17 00:00:00 2001
|
|
||||||
From: liuchao173 <55137861+liuchao173@users.noreply.github.com>
|
|
||||||
Date: Mon, 21 Oct 2019 19:15:11 +0800
|
|
||||||
Subject: [PATCH 26/53] when devpath is NULL, skip reading files
|
|
||||||
|
|
||||||
If devpath is NULL, read devpath/numa_node and devpath/local_cpus will fail. So just skip it. The old code won't cause any bugs.
|
|
||||||
---
|
|
||||||
classify.c | 9 +++++----
|
|
||||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/classify.c b/classify.c
|
|
||||||
index 550f3b6..81ad8a6 100644
|
|
||||||
--- a/classify.c
|
|
||||||
+++ b/classify.c
|
|
||||||
@@ -392,7 +392,7 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
|
|
||||||
|
|
||||||
get_numa_node:
|
|
||||||
numa_node = -1;
|
|
||||||
- if (numa_avail) {
|
|
||||||
+ if (devpath != NULL && numa_avail) {
|
|
||||||
sprintf(path, "%s/numa_node", devpath);
|
|
||||||
fd = fopen(path, "r");
|
|
||||||
if (fd) {
|
|
||||||
@@ -407,9 +407,10 @@ get_numa_node:
|
|
||||||
new->numa_node = get_numa_node(numa_node);
|
|
||||||
|
|
||||||
cpus_setall(new->cpumask);
|
|
||||||
-
|
|
||||||
- sprintf(path, "%s/local_cpus", devpath);
|
|
||||||
- process_one_line(path, get_mask_from_bitmap, &new->cpumask);
|
|
||||||
+ if (devpath != NULL) {
|
|
||||||
+ sprintf(path, "%s/local_cpus", devpath);
|
|
||||||
+ process_one_line(path, get_mask_from_bitmap, &new->cpumask);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
log(TO_CONSOLE, LOG_INFO, "Adding IRQ %d to database\n", irq);
|
|
||||||
return new;
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user