svn commit: r332735 - head/sys/x86/x86

John Baldwin jhb at freebsd.org
Fri Apr 20 17:30:08 UTC 2018


I need to rework the layout of IRQ values to be more dynamic (per a thread
on current@) as I've seen at least a few systems now that have more than
256 I/O APIC pins.  Currently we kind of depend on interrupt_sources[]
being statically sized, but I could rework this to support dynamic sizing
as a result and probably provide a tunable to control the limit on MSI
interrupts (and possibly derive the default limit from the number of CPUs).

On Thursday, April 19, 2018 08:59:32 AM Eric Joyner wrote:
> Is the limit going to be increased at some point? Is there a true limit
> somewhere?
> 
> On Wed, Apr 18, 2018 at 11:45 AM, John Baldwin <jhb at freebsd.org> wrote:
> 
> > Author: jhb
> > Date: Wed Apr 18 18:45:34 2018
> > New Revision: 332735
> > URL: https://svnweb.freebsd.org/changeset/base/332735
> >
> > Log:
> >   Fix two off-by-one errors when allocating MSI and MSI-X interrupts.
> >
> >   x86 enforces an (arbitray) limit on the number of available MSI and
> >   MSI-X interrupts to simplify code (in particular, interrupt_source[]
> >   is statically sized).  This means that an attempt to allocate an MSI
> >   vector needs to fail if it would go beyond the limit, but the checks
> >   for exceeding the limit had an off-by-one error.  In the case of MSI-X
> >   which allocates interrupts one at a time this meant that IRQ 768 kept
> >   getting handed out multiple times for msix_alloc() instead of failing
> >   because all MSI IRQs were in use.
> >
> >   Tested by:    lidl
> >   MFC after:    1 week
> >
> > Modified:
> >   head/sys/x86/x86/msi.c
> >
> > Modified: head/sys/x86/x86/msi.c
> > ============================================================
> > ==================
> > --- head/sys/x86/x86/msi.c      Wed Apr 18 18:45:04 2018        (r332734)
> > +++ head/sys/x86/x86/msi.c      Wed Apr 18 18:45:34 2018        (r332735)
> > @@ -404,7 +404,7 @@ again:
> >         /* Do we need to create some new sources? */
> >         if (cnt < count) {
> >                 /* If we would exceed the max, give up. */
> > -               if (i + (count - cnt) > FIRST_MSI_INT + NUM_MSI_INTS) {
> > +               if (i + (count - cnt) >= FIRST_MSI_INT + NUM_MSI_INTS) {
> >                         mtx_unlock(&msi_lock);
> >                         free(mirqs, M_MSI);
> >                         return (ENXIO);
> > @@ -645,7 +645,7 @@ again:
> >         /* Do we need to create a new source? */
> >         if (msi == NULL) {
> >                 /* If we would exceed the max, give up. */
> > -               if (i + 1 > FIRST_MSI_INT + NUM_MSI_INTS) {
> > +               if (i + 1 >= FIRST_MSI_INT + NUM_MSI_INTS) {
> >                         mtx_unlock(&msi_lock);
> >                         return (ENXIO);
> >                 }
> >
> >


-- 
John Baldwin


More information about the svn-src-all mailing list