From: Markus Armbruster <armbru@redhat.com>
To: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: Gerd Hoffmann <kraxel@redhat.com>,
William Dauchy <wdauchy@gmail.com>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] `qdev_free` when unplug a pci device
Date: Wed, 23 Feb 2011 09:30:23 +0100 [thread overview]
Message-ID: <m3hbbvm9uo.fsf@blackfin.pond.sub.org> (raw)
In-Reply-To: <20110223025001.GC19727@valinux.co.jp> (Isaku Yamahata's message of "Wed, 23 Feb 2011 11:50:01 +0900")
Isaku Yamahata <yamahata@valinux.co.jp> writes:
> On Tue, Feb 22, 2011 at 06:36:20PM +0100, William Dauchy wrote:
>> `qdev_free` when unplug a pci device
>> It resolves a bug when detaching/attaching a network device
>>
>> # virsh detach-interface dom0 network --mac 52:54:00:f6:84:ba
>> Interface detached successfully
>>
>> # virsh attach-interface dom0 network default --mac 52:54:00:f6:84:ba
>> error: Failed to attach interface
>> error: internal error unable to execute QEMU command 'device_add': Duplicate ID 'net0' for device
>>
>> A detached pci device was not freed of the list `qemu_device_opts`
>> ---
>> hw/pci.c | 5 ++++-
>> 1 files changed, 4 insertions(+), 1 deletions(-)
>>
>> diff --git a/hw/pci.c b/hw/pci.c
>> index 8b76cea..1e9a8f0 100644
>> --- a/hw/pci.c
>> +++ b/hw/pci.c
>> @@ -1671,13 +1671,16 @@ static int pci_unplug_device(DeviceState *qdev)
>> {
>> PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
>> PCIDeviceInfo *info = container_of(qdev->info, PCIDeviceInfo, qdev);
>> + int unplug;
>>
>> if (info->no_hotplug) {
>> qerror_report(QERR_DEVICE_NO_HOTPLUG, info->qdev.name);
>> return -1;
>> }
>> - return dev->bus->hotplug(dev->bus->hotplug_qdev, dev,
>> + unplug = dev->bus->hotplug(dev->bus->hotplug_qdev, dev,
>> PCI_HOTPLUG_DISABLED);
>> + qdev_free(qdev);
>
> Good catch.
> qdev_free() should be called only when unplug had succeeded.
> Although piix4 unplug always successes, pcie unplug may fail.
>
>> + return unplug;
>> }
>>
>> void pci_qdev_register(PCIDeviceInfo *info)
I don't think this patch is correct. Let me explain.
Device hot unplug is *not* guaranteed to succeed.
For some buses, such as USB, it always succeeds immediately, i.e. when
the device_del monitor command finishes, the device is gone. Live is
good.
But for PCI, device_del merely initiates the ACPI unplug rain dance. It
doesn't wait for the dance to complete. Why? The dance can take an
unpredictable amount of time, including forever.
Problem: Subsequent device_add can fail if it reuses the qdev ID or PCI
slot, and the unplug has not yet completed (race condition), or it
failed. Yes, Virginia, PCI hotplug *can* fail.
When unplug succeeds, the qdev is automatically destroyed.
pciej_write() does that for PIIX4. Looks like pcie_cap_slot_event()
does it for PCIE.
Your patch adds a *second* qdev_free(). No good.
next prev parent reply other threads:[~2011-02-23 8:30 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-22 17:36 [Qemu-devel] [PATCH] `qdev_free` when unplug a pci device William Dauchy
2011-02-23 2:50 ` Isaku Yamahata
2011-02-23 8:30 ` Markus Armbruster [this message]
2011-02-23 9:32 ` William Dauchy
2011-02-28 2:52 ` Wen Congyang
2011-03-01 4:11 ` Isaku Yamahata
2011-03-01 6:58 ` Wen Congyang
2011-03-01 7:13 ` Isaku Yamahata
2011-03-01 7:32 ` Wen Congyang
2011-03-01 9:49 ` Isaku Yamahata
2011-03-09 4:08 ` Ryan Harper
2011-03-09 5:04 ` Wen Congyang
2011-03-09 6:12 ` Ryan Harper
2011-03-09 7:19 ` Wen Congyang
2011-03-10 4:31 ` Ryan Harper
2011-03-10 5:28 ` Wen Congyang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m3hbbvm9uo.fsf@blackfin.pond.sub.org \
--to=armbru@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=wdauchy@gmail.com \
--cc=yamahata@valinux.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.