Keir Fraser wrote:
On 21/2/08 13:25, "Yosuke Iwamatsu" <y-iwamatsu@xxxxxxxxxxxxx> wrote:
dev-#, vdev-# and state-# are all backend nodes.
Xend writes physical names on dev-# to let pciback know which device
should be exported (This is the original behaviour).
Then pciback publishes the corresponding virtul name on vdev-#.
At the time of detachment, pcifront scans backend nodes and finds
which device should be removed by seeing vdev-#.
pcifront doesn't need to know the physical name indeed.
This seems a bit different from how initial probe happens (by reading the
root-%d xenstore nodes). Could we not just watch those in pcifront and
re-parse them for changes?
Your state machine was also quite complicated, perhaps primarily so that
pcifront could handshake when devices are removed. Is this handshake
necessary? (e.g., in particular, is there any equivalent notion for real PCI
hot-unplug?). If not, we can get equivalent hotplug functionality between
HVM and PV without needing a complicated xend->frontend->backend->xend
* xend updates dev-% nodes
* pciback sees this and updates root-%d nodes
* pcifront sees this and re-parses root-%d nodes
When hot add, this method (xend->pciback->pcifront) works.
And I did that way in my patch.
When hot remove, however, I'm afraid it's not safe.
xend->pciback->pcifront means that we first disable io/mmio port access,
destroy backend config space emulation and then notify the guest OS of
the removal. The guest OS would see something like a virtual
surprise-style removal, that is, a device suddenly disappears
while it is in use.
I confess that I have never done a real PCI hot-unplug myself, but
several specs (acpi spec 3.0b 6.3, pcihp spec 1.1) say that a
recommended hot removal sequence is like:
1. the user notifys the OS of the desire to remove a slot
2. the OS logicaly removes the device (unload driver, poweroff, etc)
and report the user it's ready
3. the user removes the slot
So the reason I added vdev-# and I chose xend->frontend->backend->xend
cicle is the same; let the guest OS cleanly shutdown the device first
and then actually remove it. I think it's quite essential.
Xen-devel mailing list