Package: irqbalance / 1.7.0-1

c8757c6d870c4788da4980abaf21cb7369702ee9.debpatch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
From c8757c6d870c4788da4980abaf21cb7369702ee9 Mon Sep 17 00:00:00 2001
From: Paride Legovini <paride@debian.org>
Date: Tue, 25 Aug 2020 23:18:27 +0200
Subject: [PATCH] activate_mapping: activate only online CPUs

When echoing a mask to /proc/irq/N/smp_affinity make sure to activate
only CPUs which are online. Activating a CPU which is not online results
in a EOVERFLOW.

Originally fixed in Debian by Helge Deller <deller@gmx.de>.
---
 activate.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/activate.c b/activate.c
index 065f880..62cfd08 100644
--- a/activate.c
+++ b/activate.c
@@ -49,6 +49,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
 	char buf[PATH_MAX];
 	FILE *file;
 	int ret = 0;
+	cpumask_t applied_mask;
 
 	/*
  	 * only activate mappings for irqs that have moved
@@ -59,10 +60,13 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
 	if (!info->assigned_obj)
 		return;
 
+	/* activate only online cpus, otherwise writing to procfs returns EOVERFLOW */
+	cpus_and(applied_mask, cpu_online_map, info->assigned_obj->mask);
+
 	/*
  	 * Don't activate anything for which we have an invalid mask 
  	 */
-	if (check_affinity(info, info->assigned_obj->mask))
+	if (check_affinity(info, applied_mask))
 		return;
 
 	sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq);
@@ -70,7 +74,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
 	if (!file)
 		return;
 
-	cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
+	cpumask_scnprintf(buf, PATH_MAX, applied_mask);
 	ret = fprintf(file, "%s", buf);
 	if (ret < 0) {
 		log(TO_ALL, LOG_WARNING, "cannot change irq %i's affinity, add it to banned list", info->irq);