• Alex Williamson's avatar
    vfio/pci: Hide broken INTx support from user · 45074405
    Alex Williamson authored
    INTx masking has two components, the first is that we need the ability
    to prevent the device from continuing to assert INTx.  This is
    provided via the DisINTx bit in the command register and is the only
    thing we can really probe for when testing if INTx masking is
    supported.  The second component is that the device needs to indicate
    if INTx is asserted via the interrupt status bit in the device status
    register.  With these two features we can generically determine if one
    of the devices we own is asserting INTx, signal the user, and mask the
    interrupt while the user services the device.
    
    Generally if one or both of these components is broken we resort to
    APIC level interrupt masking, which requires an exclusive interrupt
    since we have no way to determine the source of the interrupt in a
    shared configuration.  This often makes it difficult or impossible to
    configure the system for userspace use of the device, for an interrupt
    mode that the user may not need.
    
    One possible configuration of broken INTx masking is that the DisINTx
    support is fully functional, but the interrupt status bit never
    signals interrupt assertion.  In this case we do have the ability to
    prevent the device from asserting INTx, but lack the ability to
    identify the interrupt source.  For this case we can simply pretend
    that the device lacks INTx support entirely, keeping DisINTx set on
    the physical device, virtualizing this bit for the user, and
    virtualizing the interrupt pin register to indicate no INTx support.
    We already support virtualization of the DisINTx bit and already
    virtualize the interrupt pin for platforms without INTx support.  By
    tying these components together, setting DisINTx on open and reset,
    and identifying devices broken in this particular way, we can provide
    support for them w/o the handicap of APIC level INTx masking.
    
    Intel i40e (XL710/X710) 10/20/40GbE NICs have been identified as being
    broken in this specific way.  We leave the vfio-pci.nointxmask option
    as a mechanism to bypass this support, enabling INTx on the device
    with all the requirements of APIC level masking.
    Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    Cc: John Ronciak <john.ronciak@intel.com>
    Cc: Jesse Brandeburg <jesse.brandeburg@intel.com>
    45074405
vfio_pci.c 35.2 KB