Messages in this thread Patch in this message |  | | Date | Wed, 8 Apr 2026 01:20:01 +0530 | | Subject | Re: [PATCH v2 00/17] sched/paravirt: Introduce cpu_preferred_mask and steal-driven vCPU backoff | | From | Shrikanth Hegde <> |
| |
> I will attach the irqbalance patch which detects the changes in this > mask and re-adjusts the irq affinities. Series doesn't address when > irqbalance=n. Assuming many distros have irqbalance=y by default. >
Subject: [PATCH] irqbalance: Check for changes in cpu_preferred_mask
--- cputree.c | 28 +++++++++++++++++++++++++++- irqbalance.c | 2 ++ irqbalance.h | 1 + 3 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/cputree.c b/cputree.c index 9baa264..1db3422 100644 --- a/cputree.c +++ b/cputree.c @@ -56,6 +56,11 @@ cpumask_t banned_cpus; cpumask_t cpu_online_map; +/* This can dynamically change. If any change in mask detect + * and trigger a rebuild + */ +cpumask_t cpu_preferred_mask; + /* it's convenient to have the complement of banned_cpus available so that the AND operator can be used to mask out unwanted cpus @@ -506,15 +511,36 @@ void clear_work_stats(void) for_each_object(numa_nodes, clear_obj_stats, NULL); } +void parse_preferred_cpus(void) +{ + cpumask_t preferred; + char *path = NULL; + + path = "/sys/devices/system/cpu/preferred"; + cpus_clear(preferred); + process_one_line(path, get_mask_from_cpulist, &preferred); + + /* Did anything change compared to earlier */ + if (!cpus_equal(preferred, cpu_preferred_mask)) { + log(TO_CONSOLE, LOG_INFO, "cpu preferred mask changed\n"); + need_rebuild = 1; + } + + cpus_copy(cpu_preferred_mask, preferred); +} void parse_cpu_tree(void) { DIR *dir; struct dirent *entry; + char buffer[4096]; setup_banned_cpus(); - cpus_complement(unbanned_cpus, banned_cpus); + cpus_andnot(unbanned_cpus, cpu_preferred_mask, banned_cpus); + + cpumask_scnprintf(buffer, 4096, unbanned_cpus); + log(TO_CONSOLE, LOG_INFO, "Unbanned CPUs: %s\n", buffer); dir = opendir("/sys/devices/system/cpu"); if (!dir) diff --git a/irqbalance.c b/irqbalance.c index f80244c..f3d46b8 100644 --- a/irqbalance.c +++ b/irqbalance.c @@ -229,6 +229,7 @@ static void parse_command_line(int argc, char **argv) static void build_object_tree(void) { build_numa_node_list(); + parse_preferred_cpus(); parse_cpu_tree(); rebuild_irq_db(); } @@ -275,6 +276,7 @@ gboolean scan(gpointer data __attribute__((unused))) log(TO_CONSOLE, LOG_INFO, "\n\n\n-----------------------------------------------------------------------------\n"); clear_work_stats(); parse_proc_interrupts(); + parse_preferred_cpus(); /* cope with cpu hotplug -- detected during /proc/interrupts parsing */ diff --git a/irqbalance.h b/irqbalance.h index 47e40cc..593b183 100644 --- a/irqbalance.h +++ b/irqbalance.h @@ -57,6 +57,7 @@ void migrate_irq_obj(struct topo_obj *from, struct topo_obj *to, struct irq_info void activate_mappings(void); void clear_cpu_tree(void); void free_cpu_topo(gpointer data); +extern void parse_preferred_cpus(void); /*===================NEW BALANCER FUNCTIONS============================*/ /* -- 2.47.3
|  |