genirq: Encapsulate sparse bitmap handling

Move the open coded sparse bitmap handling into helper functions as
a preparatory step for converting the sparse interrupt management
to a maple tree.

No functional change.

Signed-off-by: Shanker Donthineni <sdonthineni@nvidia.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20230519134902.1495562-3-sdonthineni@nvidia.com

authored by Shanker Donthineni and committed by Thomas Gleixner 5e630aa8 bc06a9e0

+22 -12
+2 -2
kernel/irq/internals.h
··· 12 #include <linux/sched/clock.h> 13 14 #ifdef CONFIG_SPARSE_IRQ 15 - # define IRQ_BITMAP_BITS (NR_IRQS + 8196) 16 #else 17 - # define IRQ_BITMAP_BITS NR_IRQS 18 #endif 19 20 #define istate core_internal_state__do_not_mess_with_it
··· 12 #include <linux/sched/clock.h> 13 14 #ifdef CONFIG_SPARSE_IRQ 15 + # define MAX_SPARSE_IRQS (NR_IRQS + 8196) 16 #else 17 + # define MAX_SPARSE_IRQS NR_IRQS 18 #endif 19 20 #define istate core_internal_state__do_not_mess_with_it
+20 -10
kernel/irq/irqdesc.c
··· 131 EXPORT_SYMBOL_GPL(nr_irqs); 132 133 static DEFINE_MUTEX(sparse_irq_lock); 134 - static DECLARE_BITMAP(allocated_irqs, IRQ_BITMAP_BITS); 135 136 #ifdef CONFIG_SPARSE_IRQ 137 ··· 528 529 static int irq_expand_nr_irqs(unsigned int nr) 530 { 531 - if (nr > IRQ_BITMAP_BITS) 532 return -ENOMEM; 533 nr_irqs = nr; 534 return 0; ··· 546 printk(KERN_INFO "NR_IRQS: %d, nr_irqs: %d, preallocated irqs: %d\n", 547 NR_IRQS, nr_irqs, initcnt); 548 549 - if (WARN_ON(nr_irqs > IRQ_BITMAP_BITS)) 550 - nr_irqs = IRQ_BITMAP_BITS; 551 552 - if (WARN_ON(initcnt > IRQ_BITMAP_BITS)) 553 - initcnt = IRQ_BITMAP_BITS; 554 555 if (initcnt > nr_irqs) 556 nr_irqs = initcnt; ··· 823 824 mutex_lock(&sparse_irq_lock); 825 826 - start = bitmap_find_next_zero_area(allocated_irqs, IRQ_BITMAP_BITS, 827 - from, cnt, 0); 828 ret = -EEXIST; 829 if (irq >=0 && start != irq) 830 goto unlock; ··· 844 * irq_get_next_irq - get next allocated irq number 845 * @offset: where to start the search 846 * 847 - * Returns next irq number after offset or nr_irqs if none is found. 848 */ 849 unsigned int irq_get_next_irq(unsigned int offset) 850 { 851 - return find_next_bit(allocated_irqs, nr_irqs, offset); 852 } 853 854 struct irq_desc *
··· 131 EXPORT_SYMBOL_GPL(nr_irqs); 132 133 static DEFINE_MUTEX(sparse_irq_lock); 134 + static DECLARE_BITMAP(allocated_irqs, MAX_SPARSE_IRQS); 135 + 136 + static int irq_find_free_area(unsigned int from, unsigned int cnt) 137 + { 138 + return bitmap_find_next_zero_area(allocated_irqs, MAX_SPARSE_IRQS, 139 + from, cnt, 0); 140 + } 141 + 142 + static unsigned int irq_find_at_or_after(unsigned int offset) 143 + { 144 + return find_next_bit(allocated_irqs, nr_irqs, offset); 145 + } 146 147 #ifdef CONFIG_SPARSE_IRQ 148 ··· 517 518 static int irq_expand_nr_irqs(unsigned int nr) 519 { 520 + if (nr > MAX_SPARSE_IRQS) 521 return -ENOMEM; 522 nr_irqs = nr; 523 return 0; ··· 535 printk(KERN_INFO "NR_IRQS: %d, nr_irqs: %d, preallocated irqs: %d\n", 536 NR_IRQS, nr_irqs, initcnt); 537 538 + if (WARN_ON(nr_irqs > MAX_SPARSE_IRQS)) 539 + nr_irqs = MAX_SPARSE_IRQS; 540 541 + if (WARN_ON(initcnt > MAX_SPARSE_IRQS)) 542 + initcnt = MAX_SPARSE_IRQS; 543 544 if (initcnt > nr_irqs) 545 nr_irqs = initcnt; ··· 812 813 mutex_lock(&sparse_irq_lock); 814 815 + start = irq_find_free_area(from, cnt); 816 ret = -EEXIST; 817 if (irq >=0 && start != irq) 818 goto unlock; ··· 834 * irq_get_next_irq - get next allocated irq number 835 * @offset: where to start the search 836 * 837 + * Returns next irq number at or after offset or nr_irqs if none is found. 838 */ 839 unsigned int irq_get_next_irq(unsigned int offset) 840 { 841 + return irq_find_at_or_after(offset); 842 } 843 844 struct irq_desc *