Messages in this thread | | | Subject | Re: [RFC] genirq: prevent allocated_irqs from being smaller than NR_IRQS | From | Lars-Peter Clausen <> | Date | Thu, 2 Apr 2020 17:16:44 +0200 |
| |
On 4/2/20 5:08 PM, Marcelo Schmitt wrote: > Hi, > > I was trying to understand IRQ initialization when suddenly got > intrigued about the declaration of the "allocated_irqs" bitmap at > kernel/irq/irqdesc.c. The size of allocated_irqs is defined by > IRQ_BITMAP_BITS, which in turn is passed to BITS_TO_LONGS to calculate > the actual number of IRQs the system may have. If I got it right, there > should be one entry at allocated_irqs for each possible IRQ line. At > kernel/irq/internals.h, IRQ_BITMAP_BITS is defined to be NR_IRQS (or > NR_IRQS plus a high constant in the case of sparse IRQs), which most > architectures seem to define as being the actual number of IRQs a board > has. > > #ifdef CONFIG_SPARSE_IRQ > # define IRQ_BITMAP_BITS (NR_IRQS + 8196) > #else > # define IRQ_BITMAP_BITS NR_IRQS > #endif > > The thing I'm troubled about is that BITS_TO_LONGS divides > IRQ_BITMAP_BITS by sizeof(long) * 8, which makes it possible for the > size of allocated_irqs to be smaller than NR_IRQS. > > For instance, if !CONFIG_SPARSE_IRQ, sizeof(long) == 8, and NR_IRQS is > defined as 16, then IRQ_BITMAP_BITS would be equal to > (16 + 64 - 1)/64 = 1. Even if CONFIG_SPARSE_IRQ is defined, a device > with a large number of IRQ lines would end up with a small bitmap for > allocated_irqs. > > I thought NR_IRQS would be multiplied by the number of bits it uses. > Something like: > > #ifdef CONFIG_SPARSE_IRQ > # define IRQ_BITMAP_BITS (NR_IRQS * BITS_PER_TYPE(long) + 8196) > #else > # define IRQ_BITMAP_BITS (NR_IRQS * BITS_PER_TYPE(long)) > #endif > > Anyhow, IRQ_BITMAP_BITS is also used to limit the maximum number of IRQs > at irqdesc.c. If my understanding of nr_irqs is correct, it would make > sense to change some sanity checks at early_irq_init() too. > > Does anyone mind giving me some advice on how allocated_irqs is > initialized with a suitable size to support the number of interrupt > lines a board may have?
Maybe I'm missing something, but allocated_irqs is a bitmap. This means each bit corresponds to one IRQ. if sizeof(long) is 8 and allocated_irqs is sized to be one long that means it is large enough for 64 IRQs.
- Lars
| |