aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/irq/irqdesc.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c
index a250d3a0af12..6f6644f819dd 100644
--- a/kernel/irq/irqdesc.c
+++ b/kernel/irq/irqdesc.c
@@ -206,6 +206,14 @@ struct irq_desc * __ref irq_to_desc_alloc_node(unsigned int irq, int node)
206 return NULL; 206 return NULL;
207} 207}
208 208
209static int irq_expand_nr_irqs(unsigned int cnt)
210{
211 if (nr_irqs + cnt > IRQ_BITMAP_BITS)
212 return -ENOMEM;
213 nr_irqs += cnt;
214 return 0;
215}
216
209int __init early_irq_init(void) 217int __init early_irq_init(void)
210{ 218{
211 int i, initcnt, node = first_online_node; 219 int i, initcnt, node = first_online_node;
@@ -287,6 +295,12 @@ static inline int alloc_descs(unsigned int start, unsigned int cnt, int node)
287{ 295{
288 return start; 296 return start;
289} 297}
298
299static int irq_expand_nr_irqs(unsigned int cnt)
300{
301 return -ENOMEM;
302}
303
290#endif /* !CONFIG_SPARSE_IRQ */ 304#endif /* !CONFIG_SPARSE_IRQ */
291 305
292/* Dynamic interrupt handling */ 306/* Dynamic interrupt handling */
@@ -335,9 +349,11 @@ irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node)
335 if (irq >=0 && start != irq) 349 if (irq >=0 && start != irq)
336 goto err; 350 goto err;
337 351
338 ret = -ENOMEM; 352 if (start >= nr_irqs) {
339 if (start >= nr_irqs) 353 ret = irq_expand_nr_irqs(cnt);
340 goto err; 354 if (ret)
355 goto err;
356 }
341 357
342 bitmap_set(allocated_irqs, start, cnt); 358 bitmap_set(allocated_irqs, start, cnt);
343 mutex_unlock(&sparse_irq_lock); 359 mutex_unlock(&sparse_irq_lock);