rebase to v1.7.0

This commit is contained in:
root 2020-08-14 14:28:45 +08:00
parent 322199ddcd
commit 3a0401770d
55 changed files with 7 additions and 4073 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 [![Build Status](https://travis-ci.org/Irqbalance/irqbalance.svg?branch=master)](https://travis-ci.org/Irqbalance/irqbalance)
--
2.23.0

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,6 +1,6 @@
Summary: A dynamic adaptive IRQ balancing daemon
Name: irqbalance
Version: 1.6.0
Version: 1.7.0
Release: 1
Epoch: 3
License: GPLv2
@ -21,59 +21,6 @@ Requires: numactl-libs
%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
Irqbalance is a daemon to help balance the cpu load generated by
interrupts across all of a systems cpus. Irqbalance identifies the
@ -130,6 +77,12 @@ fi
/sbin/chkconfig --del %{name} >/dev/null 2>&1 || :
%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
- Type:enhanced
- ID:NA

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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, &current_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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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