mirror of
https://github.com/torvalds/linux
synced 2024-10-14 23:39:09 +00:00
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
This commit is contained in:
parent
bc06a9e087
commit
5e630aa8d9
|
@ -12,9 +12,9 @@
|
|||
#include <linux/sched/clock.h>
|
||||
|
||||
#ifdef CONFIG_SPARSE_IRQ
|
||||
# define IRQ_BITMAP_BITS (NR_IRQS + 8196)
|
||||
# define MAX_SPARSE_IRQS (NR_IRQS + 8196)
|
||||
#else
|
||||
# define IRQ_BITMAP_BITS NR_IRQS
|
||||
# define MAX_SPARSE_IRQS NR_IRQS
|
||||
#endif
|
||||
|
||||
#define istate core_internal_state__do_not_mess_with_it
|
||||
|
|
|
@ -131,7 +131,18 @@ int nr_irqs = NR_IRQS;
|
|||
EXPORT_SYMBOL_GPL(nr_irqs);
|
||||
|
||||
static DEFINE_MUTEX(sparse_irq_lock);
|
||||
static DECLARE_BITMAP(allocated_irqs, IRQ_BITMAP_BITS);
|
||||
static DECLARE_BITMAP(allocated_irqs, MAX_SPARSE_IRQS);
|
||||
|
||||
static int irq_find_free_area(unsigned int from, unsigned int cnt)
|
||||
{
|
||||
return bitmap_find_next_zero_area(allocated_irqs, MAX_SPARSE_IRQS,
|
||||
from, cnt, 0);
|
||||
}
|
||||
|
||||
static unsigned int irq_find_at_or_after(unsigned int offset)
|
||||
{
|
||||
return find_next_bit(allocated_irqs, nr_irqs, offset);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARSE_IRQ
|
||||
|
||||
|
@ -517,7 +528,7 @@ static int alloc_descs(unsigned int start, unsigned int cnt, int node,
|
|||
|
||||
static int irq_expand_nr_irqs(unsigned int nr)
|
||||
{
|
||||
if (nr > IRQ_BITMAP_BITS)
|
||||
if (nr > MAX_SPARSE_IRQS)
|
||||
return -ENOMEM;
|
||||
nr_irqs = nr;
|
||||
return 0;
|
||||
|
@ -535,11 +546,11 @@ int __init early_irq_init(void)
|
|||
printk(KERN_INFO "NR_IRQS: %d, nr_irqs: %d, preallocated irqs: %d\n",
|
||||
NR_IRQS, nr_irqs, initcnt);
|
||||
|
||||
if (WARN_ON(nr_irqs > IRQ_BITMAP_BITS))
|
||||
nr_irqs = IRQ_BITMAP_BITS;
|
||||
if (WARN_ON(nr_irqs > MAX_SPARSE_IRQS))
|
||||
nr_irqs = MAX_SPARSE_IRQS;
|
||||
|
||||
if (WARN_ON(initcnt > IRQ_BITMAP_BITS))
|
||||
initcnt = IRQ_BITMAP_BITS;
|
||||
if (WARN_ON(initcnt > MAX_SPARSE_IRQS))
|
||||
initcnt = MAX_SPARSE_IRQS;
|
||||
|
||||
if (initcnt > nr_irqs)
|
||||
nr_irqs = initcnt;
|
||||
|
@ -812,8 +823,7 @@ __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
|
|||
|
||||
mutex_lock(&sparse_irq_lock);
|
||||
|
||||
start = bitmap_find_next_zero_area(allocated_irqs, IRQ_BITMAP_BITS,
|
||||
from, cnt, 0);
|
||||
start = irq_find_free_area(from, cnt);
|
||||
ret = -EEXIST;
|
||||
if (irq >=0 && start != irq)
|
||||
goto unlock;
|
||||
|
@ -834,11 +844,11 @@ EXPORT_SYMBOL_GPL(__irq_alloc_descs);
|
|||
* irq_get_next_irq - get next allocated irq number
|
||||
* @offset: where to start the search
|
||||
*
|
||||
* Returns next irq number after offset or nr_irqs if none is found.
|
||||
* Returns next irq number at or after offset or nr_irqs if none is found.
|
||||
*/
|
||||
unsigned int irq_get_next_irq(unsigned int offset)
|
||||
{
|
||||
return find_next_bit(allocated_irqs, nr_irqs, offset);
|
||||
return irq_find_at_or_after(offset);
|
||||
}
|
||||
|
||||
struct irq_desc *
|
||||
|
|
Loading…
Reference in a new issue