genirq: Add default affinity mask command line option: optimization and cleanup
Hi,
I'd like to propose a couple of minor changes to the patch genirq-add-default-mask-cmdline-option, part of the RT patch series for 3.4 and above.
Quoted 42 lines
From genirq-add-default-mask-cmdline-option.patch:
Subject: genirq: Add default affinity mask command line option
From: Thomas Gleixner <[email protected]>
Date: Fri, 25 May 2012 16:59:47 +0200If we isolate CPUs, then we don't want random device interrupts on them. Even w/o the user space irq balancer enabled we can end up with irqs on non boot cpus.
Allow to restrict the default irq affinity mask.
Signed-off-by Thomas Gleixner <[email protected]>--- Documentation/kernel-parameters.txt | 9 +++++++++ kernel/irq/irqdesc.c | 21 +++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-)Index:
linux-stable/Documentation/kernel-parameters.txt
===================================================================Documentation/kernel-parameters.txt +9
-0@@ -1157,6 +1157,15 @@ bytes respectively. Such letter suffixes See comment before ip2_setup() in drivers/char/ip2/ip2base.c. + irqaffinity= [SMP] Set the default irq affinity mask + Format: + <cpu number>,...,<cpu number> + or + <cpu number>-<cpu number> + (must be a positive range in ascending order) + or a mixture + <cpu number>,...,<cpu number>-<cpu number> + irqfixup [HW] When an interrupt is not handled search all handlers for it. Intended to get systems with badly brokenIndex:
linux-stable/kernel/irq/irqdesc.c
===================================================================
kernel/irq/irqdesc.c line 29
Quoted 7 lines
kernel/irq/irqdesc.c +4
-0@@ -23,10 +23,27 @@static struct lock_class_key irq_desc_lock_class;#if defined(CONFIG_SMP ) +static int __init irq_affinity_setup (char *str) +{ +zalloc_cpumask_var (&irq_default_affinity,GFP_NOWAIT ); +cpulist_parse (str, irq_default_affinity);
Since cpulist_parse() sets all the bits of its cpumask argument, it's not necessary to initialize them to zero during allocation, so I would use alloc_cpumask_var() instead of zalloc_cpumask_var().
Quoted 7 lines
kernel/irq/irqdesc.c +7
-0+/* +* Set at least the boot cpu. We don't want to end up with +* bugreports caused by random comandline masks +*/ +cpumask_set_cpu (smp_processor_id (), irq_default_affinity); +return 1 ; +}
kernel/irq/irqdesc.c line 44
Quoted 10 lines
kernel/irq/irqdesc.c +6
-2+__setup ("irqaffinity=" , irq_affinity_setup); +static void __init init_irq_default_affinity (void ) { -alloc_cpumask_var (&irq_default_affinity,GFP_NOWAIT ); -cpumask_setall (irq_default_affinity); +#ifdef CONFIG_CPUMASK_OFFSTACK +if (!irq_default_affinity) +zalloc_cpumask_var (&irq_default_affinity,GFP_NOWAIT ); +#endif
The #ifdefery is not necessary here, because if CONFIG_CPUMASK_OFFSTACK is not defined irq_default_affinity cannot be NULL.
kernel/irq/irqdesc.c line 49
Quoted 5 lines
kernel/irq/irqdesc.c +2
-0+if (cpumask_empty (irq_default_affinity)) + cpumask_setall(irq_default_affinity); }#else static void __init init_irq_default_affinity (void )
--
Francesco