Messages in this thread Patch in this message | | | Date | Tue, 23 Nov 2010 01:21:01 -0800 | From | Yinghai Lu <> | Subject | [PATCH] sparseirq: Increase nr_irqs if needed |
| |
only do that when we need more.
For x86_64 system: when we have 128 cpus with 5 ioapics, will have nr_irqs = 3064 120 + 8 * 128 + 120 * 16 systems could take 20 pcie, when intel 10g are used with sriov and ixgbevf, every vf will need 3 irqs, and one device have 64 vf. so will need 20 * 3 * 64 = 3840. some 6 ports Intel 10gb may need more.
with this patch, nr_irqs will increase 25% every time if nr_irqs is not big enough.
Also later We could change nr_irqs initial value to min(nr_irqs_gsi, 224*nr_cpu_ids). for x86.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
--- kernel/irq/irqdesc.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-)
Index: linux-2.6/kernel/irq/irqdesc.c =================================================================== --- linux-2.6.orig/kernel/irq/irqdesc.c +++ linux-2.6/kernel/irq/irqdesc.c @@ -301,6 +301,27 @@ void irq_free_descs(unsigned int from, u mutex_unlock(&sparse_irq_lock); } +static bool increase_nr_irqs(void) +{ +#ifdef CONFIG_SPARSE_IRQ + int new; + + if (nr_irqs == NR_IRQS) + return false; + + new = nr_irqs; + new += nr_irqs >> 2; + if (new > NR_IRQS) + new = NR_IRQS; + if (new > nr_irqs) { + nr_irqs = new; + printk(KERN_INFO "nr_irqs increase to %d\n", nr_irqs); + return true; + } +#endif + return false; +} + /** * irq_alloc_descs - allocate and initialize a range of irq descriptors * @irq: Allocate for specific irq number if irq >= 0 @@ -320,14 +341,16 @@ irq_alloc_descs(int irq, unsigned int fr mutex_lock(&sparse_irq_lock); - start = bitmap_find_next_zero_area(allocated_irqs, nr_irqs, from, cnt, 0); + start = bitmap_find_next_zero_area(allocated_irqs, NR_IRQS, from, cnt, 0); ret = -EEXIST; if (irq >=0 && start != irq) goto err; ret = -ENOMEM; - if (start >= nr_irqs) - goto err; + while ((start + cnt) >= nr_irqs) { + if (!increase_nr_irqs()) + goto err; + } bitmap_set(allocated_irqs, start, cnt); mutex_unlock(&sparse_irq_lock);
| |