lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <66fabdd6-7815-1ede-9a45-45fdb2b6d5b2@metafoo.de>
Date:   Thu, 2 Apr 2020 17:16:44 +0200
From:   Lars-Peter Clausen <lars@...afoo.de>
To:     Marcelo Schmitt <marcelo.schmitt1@...il.com>,
        linux-kernel@...r.kernel.org
Cc:     tglx@...utronix.de
Subject: Re: [RFC] genirq: prevent allocated_irqs from being smaller than
 NR_IRQS

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ