From c8757c6d870c4788da4980abaf21cb7369702ee9 Mon Sep 17 00:00:00 2001 From: Paride Legovini 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 . --- 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);