Skip to content

Commit 5e630aa

Browse files
shankerd04KAGA-KOKO
authored andcommitted
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
1 parent bc06a9e commit 5e630aa

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

kernel/irq/internals.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
#include <linux/sched/clock.h>
1313

1414
#ifdef CONFIG_SPARSE_IRQ
15-
# define IRQ_BITMAP_BITS (NR_IRQS + 8196)
15+
# define MAX_SPARSE_IRQS (NR_IRQS + 8196)
1616
#else
17-
# define IRQ_BITMAP_BITS NR_IRQS
17+
# define MAX_SPARSE_IRQS NR_IRQS
1818
#endif
1919

2020
#define istate core_internal_state__do_not_mess_with_it

kernel/irq/irqdesc.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,18 @@ int nr_irqs = NR_IRQS;
131131
EXPORT_SYMBOL_GPL(nr_irqs);
132132

133133
static DEFINE_MUTEX(sparse_irq_lock);
134-
static DECLARE_BITMAP(allocated_irqs, IRQ_BITMAP_BITS);
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+
}
135146

136147
#ifdef CONFIG_SPARSE_IRQ
137148

@@ -517,7 +528,7 @@ static int alloc_descs(unsigned int start, unsigned int cnt, int node,
517528

518529
static int irq_expand_nr_irqs(unsigned int nr)
519530
{
520-
if (nr > IRQ_BITMAP_BITS)
531+
if (nr > MAX_SPARSE_IRQS)
521532
return -ENOMEM;
522533
nr_irqs = nr;
523534
return 0;
@@ -535,11 +546,11 @@ int __init early_irq_init(void)
535546
printk(KERN_INFO "NR_IRQS: %d, nr_irqs: %d, preallocated irqs: %d\n",
536547
NR_IRQS, nr_irqs, initcnt);
537548

538-
if (WARN_ON(nr_irqs > IRQ_BITMAP_BITS))
539-
nr_irqs = IRQ_BITMAP_BITS;
549+
if (WARN_ON(nr_irqs > MAX_SPARSE_IRQS))
550+
nr_irqs = MAX_SPARSE_IRQS;
540551

541-
if (WARN_ON(initcnt > IRQ_BITMAP_BITS))
542-
initcnt = IRQ_BITMAP_BITS;
552+
if (WARN_ON(initcnt > MAX_SPARSE_IRQS))
553+
initcnt = MAX_SPARSE_IRQS;
543554

544555
if (initcnt > nr_irqs)
545556
nr_irqs = initcnt;
@@ -812,8 +823,7 @@ __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
812823

813824
mutex_lock(&sparse_irq_lock);
814825

815-
start = bitmap_find_next_zero_area(allocated_irqs, IRQ_BITMAP_BITS,
816-
from, cnt, 0);
826+
start = irq_find_free_area(from, cnt);
817827
ret = -EEXIST;
818828
if (irq >=0 && start != irq)
819829
goto unlock;
@@ -834,11 +844,11 @@ EXPORT_SYMBOL_GPL(__irq_alloc_descs);
834844
* irq_get_next_irq - get next allocated irq number
835845
* @offset: where to start the search
836846
*
837-
* Returns next irq number after offset or nr_irqs if none is found.
847+
* Returns next irq number at or after offset or nr_irqs if none is found.
838848
*/
839849
unsigned int irq_get_next_irq(unsigned int offset)
840850
{
841-
return find_next_bit(allocated_irqs, nr_irqs, offset);
851+
return irq_find_at_or_after(offset);
842852
}
843853

844854
struct irq_desc *

0 commit comments

Comments
 (0)