[3/5] genirq: Introduce two helper functions
Commit Message
Introduce helper functions irq_find_free_area() and irq_find_next_irq().
The first function is used to locate available free space for a new IRQ,
and the second one is used to find the next valid IRQ.
These helper functions will be later modified to utilize the Maple data
structure in a later patch. Additionally, in order to align the moving
to the new data structure, the IRQ_BITMAP_BITS is renamed to
MAX_SPARSE_IRQS.
Signed-off-by: Shanker Donthineni <sdonthineni@nvidia.com>
---
kernel/irq/internals.h | 4 ++--
kernel/irq/irqdesc.c | 28 +++++++++++++++++++---------
2 files changed, 21 insertions(+), 11 deletions(-)
Comments
On Sun, Jan 29 2023 at 18:57, Shanker Donthineni wrote:
> Introduce helper functions irq_find_free_area() and irq_find_next_irq().
> The first function is used to locate available free space for a new IRQ,
> and the second one is used to find the next valid IRQ.
>
> These helper functions will be later modified to utilize the Maple data
So you first introduce helpers just to modify them in the next patch?
What you want to say here in this changelog is:
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.
Hmm?
Thanks,
tglx
On 1/31/23 03:20, Thomas Gleixner wrote:
> External email: Use caution opening links or attachments
>
>
> On Sun, Jan 29 2023 at 18:57, Shanker Donthineni wrote:
>> Introduce helper functions irq_find_free_area() and irq_find_next_irq().
>> The first function is used to locate available free space for a new IRQ,
>> and the second one is used to find the next valid IRQ.
>>
>> These helper functions will be later modified to utilize the Maple data
>
> So you first introduce helpers just to modify them in the next patch?
>
> What you want to say here in this changelog is:
>
> 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.
>
Thanks, I'll update in v2 patch.
@@ -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_next_irq(unsigned int offset)
+{
+ return find_next_bit(allocated_irqs, nr_irqs, offset);
+}
#ifdef CONFIG_SPARSE_IRQ
@@ -519,7 +530,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;
@@ -537,11 +548,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;
@@ -813,8 +824,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;
@@ -839,7 +849,7 @@ EXPORT_SYMBOL_GPL(__irq_alloc_descs);
*/
unsigned int irq_get_next_irq(unsigned int offset)
{
- return find_next_bit(allocated_irqs, nr_irqs, offset);
+ return irq_find_next_irq(offset);
}
struct irq_desc *