x86: Increase NR_IRQS and nr_irqs
I have a system with lots of igb and ixgbe, when iov/vf are
enabled for them, we hit the limit of 3064.
when system has 20 pcie installed, and one card has 2
functions, and one function needs 64 msi-x,
may need 20 * 2 * 64 = 2560 for msi-x
but if iov and vf are enabled
may need 20 * 2 * 64 * 3 = 7680 for msi-x
assume system with 5 ioapic, nr_irqs_gsi will be 120.
NR_CPUS = 512, and nr_cpu_ids = 128
will have NR_IRQS = 256 + 512 * 64 = 33024
will have nr_irqs = 120 + 8 * 128 + 120 * 64 = 8824
When SPARSE_IRQ is not set, there is no increase with kernel data
size.
when NR_CPUS=128, and SPARSE_IRQ is set:
text data bss dec hex filename
21837444 4216564 12480736 38534744 24bfe58 vmlinux.before
21837442 4216580
12480736 38534758 24bfe66 vmlinux.after
when NR_CPUS=4096, and SPARSE_IRQ is set
text data bss dec hex filename
21878619 5610244 13415392 40904255 270263f vmlinux.before
21878617 5610244 13415392 40904253 270263d vmlinux.after
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <4B398ECD.1080506@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
6b7b284958
commit
9959c888a3
|
@ -154,21 +154,21 @@ static inline int invalid_vm86_irq(int irq)
|
||||||
|
|
||||||
#define NR_IRQS_LEGACY 16
|
#define NR_IRQS_LEGACY 16
|
||||||
|
|
||||||
#define CPU_VECTOR_LIMIT ( 8 * NR_CPUS )
|
|
||||||
#define IO_APIC_VECTOR_LIMIT ( 32 * MAX_IO_APICS )
|
#define IO_APIC_VECTOR_LIMIT ( 32 * MAX_IO_APICS )
|
||||||
|
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
# ifdef CONFIG_SPARSE_IRQ
|
# ifdef CONFIG_SPARSE_IRQ
|
||||||
|
# define CPU_VECTOR_LIMIT (64 * NR_CPUS)
|
||||||
# define NR_IRQS \
|
# define NR_IRQS \
|
||||||
(CPU_VECTOR_LIMIT > IO_APIC_VECTOR_LIMIT ? \
|
(CPU_VECTOR_LIMIT > IO_APIC_VECTOR_LIMIT ? \
|
||||||
(NR_VECTORS + CPU_VECTOR_LIMIT) : \
|
(NR_VECTORS + CPU_VECTOR_LIMIT) : \
|
||||||
(NR_VECTORS + IO_APIC_VECTOR_LIMIT))
|
(NR_VECTORS + IO_APIC_VECTOR_LIMIT))
|
||||||
# else
|
# else
|
||||||
# if NR_CPUS < MAX_IO_APICS
|
# define CPU_VECTOR_LIMIT (32 * NR_CPUS)
|
||||||
# define NR_IRQS (NR_VECTORS + 4*CPU_VECTOR_LIMIT)
|
# define NR_IRQS \
|
||||||
# else
|
(CPU_VECTOR_LIMIT < IO_APIC_VECTOR_LIMIT ? \
|
||||||
# define NR_IRQS (NR_VECTORS + IO_APIC_VECTOR_LIMIT)
|
(NR_VECTORS + CPU_VECTOR_LIMIT) : \
|
||||||
# endif
|
(NR_VECTORS + IO_APIC_VECTOR_LIMIT))
|
||||||
# endif
|
# endif
|
||||||
#else /* !CONFIG_X86_IO_APIC: */
|
#else /* !CONFIG_X86_IO_APIC: */
|
||||||
# define NR_IRQS NR_IRQS_LEGACY
|
# define NR_IRQS NR_IRQS_LEGACY
|
||||||
|
|
|
@ -3840,7 +3840,7 @@ int __init arch_probe_nr_irqs(void)
|
||||||
/*
|
/*
|
||||||
* for MSI and HT dyn irq
|
* for MSI and HT dyn irq
|
||||||
*/
|
*/
|
||||||
nr += nr_irqs_gsi * 16;
|
nr += nr_irqs_gsi * 64;
|
||||||
#endif
|
#endif
|
||||||
if (nr < nr_irqs)
|
if (nr < nr_irqs)
|
||||||
nr_irqs = nr;
|
nr_irqs = nr;
|
||||||
|
|
Loading…
Reference in New Issue