lkml.org 
[lkml]   [2010]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
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);

\
 
 \ /
  Last update: 2010-11-23 10:25    [W:0.054 / U:0.016 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site