• Alexander Gordeev's avatar
    PCI: Allocate only as many MSI vectors as requested by driver · 65f6ae66
    Alexander Gordeev authored
    Because of the encoding of the "Multiple Message Capable" and "Multiple
    Message Enable" fields, a device can only advertise that it's capable of a
    power-of-two number of vectors, and the OS can only enable a power-of-two
    number.
    
    For example, a device that's limited internally to using 18 vectors would
    have to advertise that it's capable of 32.  The 14 extra vectors consume
    vector numbers and IRQ descriptors even though the device can't actually
    use them.
    
    This fix introduces a 'msi_desc::nvec_used' field to address this issue.
    When non-zero, it is the actual number of MSIs the device will send, as
    requested by the device driver.  This value should be used by architectures
    to set up and tear down only as many interrupt resources as the device will
    actually use.
    
    Note, although the existing 'msi_desc::multiple' field might seem
    redundant, in fact it is not.  The number of MSIs advertised need not be
    the smallest power-of-two larger than the number of MSIs the device will
    send.  Thus, it is not always possible to derive the former from the
    latter, so we need to keep them both to handle this case.
    
    [bhelgaas: changelog, rename to "nvec_used"]
    Signed-off-by: default avatarAlexander Gordeev <agordeev@redhat.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    65f6ae66
msi.c 26.2 KB