lkml.org 
[lkml]   [2023]   [Apr]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 2/3] genirq: Encapsulate sparse bitmap handling
    Date
    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>
    ---
    kernel/irq/internals.h | 4 ++--
    kernel/irq/irqdesc.c | 28 +++++++++++++++++++---------
    2 files changed, 21 insertions(+), 11 deletions(-)

    diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
    index 51fc8c497c22..f3f2090dd2de 100644
    --- a/kernel/irq/internals.h
    +++ b/kernel/irq/internals.h
    @@ -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
    diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c
    index b401b89b226a..9a71fc6f2c5f 100644
    --- a/kernel/irq/irqdesc.c
    +++ b/kernel/irq/irqdesc.c
    @@ -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

    @@ -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;
    @@ -838,7 +848,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 *
    --
    2.25.1
    \
     
     \ /
      Last update: 2023-04-10 17:58    [W:7.656 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site