• A
    acpi_piix4: Fix PCI hotplug race · 7faa8075
    Alex Williamson 提交于
    As Michael Tsirkin demonstrated, current PCI hotplug is vulnerable
    to a few races.  The first is a race with other hotplug operations
    because we clear the up & down registers at each event.  If a new
    event comes before the last is processed, up/down is cleared and
    the event is lost.
    
    To fix this for the down register, we create a life cycle for
    the event request that starts with the hot unplug request in
    piix4_device_hotplug() and ends when the device is ejected.
    This allows us to mask and clear individual bits, preserving them
    against races.  For the up register, we have no clear end point
    for when the event is finished.  We could modify the BIOS to
    acknowledge the bit and clear it, but this creates BIOS compatibiliy
    issues without offering a complete solution.  Instead we note that
    gratuitous ACPI device checks are not harmful, which allows us to
    issue a device check for every slot.  We know which slots are present
    and we know which slots are hotpluggable, so we can easily reduce
    this to a more manageable set for the guest.
    
    The other race Michael noted was that an unplug request followed
    by reset may also lose the eject notification, which may also
    result in the eject request being lost which a subsequent add
    or remove.  Once we're in reset, the device is unused and we can
    flush the queue of device removals ourselves.  Previously if a
    device_del was issued to a guest without ACPI PCI hotplug support,
    it was necessary to shutdown the guest to recover the device.
    With this, a guest reboot is sufficient.
    Signed-off-by: NAlex Williamson <alex.williamson@redhat.com>
    Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
    7faa8075
acpi_piix4.c 16.5 KB