|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 01/17] libxl: change ao_device_remove to ao_device
Ian Jackson wrote:
> Roger Pau Monne writes ("[PATCH v9 01/17] libxl: change ao_device_remove to
> ao_device"):
>> Introduce a new structure to track state of device backends, that will
>> be used in following patches on this series.
>>
>> This structure if used for both device creation and device
>> destruction and removes libxl__ao_device_remove.
>>
>> Changes since v8:
>>
>> * Don't wait for QDISK, VKBD or VFB to disconnect, since Qemu doesn't
>> honour the disconnection protocol.
>
> Following discussion in front of a whiteboard (thanks also to Ian C
> and Stefano), we have concluded that this needs to be done
> differently. Here is the comment I promised Roger I would write
>
> Ian.
>
> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
>
>
> /*
> * Algorithm for handling device removal (including domain
> * destruction). This is somewhat subtle because we may already have
> * killed the domain and caused the death of qemu.
> *
> * In current versions of qemu there is no mechanism for ensuring that
> * the resources used by its devices (both emulated and any PV devices
> * provided by qemu) are freed (eg, fds closed) before it shuts down,
> * and no confirmation from a terminating qemu back to the toolstack.
> *
> * This will need to be fixed in Xen 4.3. In the meantime (Xen 4.2)
> * we implement a bodge.
> *
> * WE WANT TO UNPLUG WE WANT TO SHUT DOWN OR DESTROY
> * | |
> * | LIBXL SENDS SIGHUP TO QEMU
> * | .....................|........................
> * | : XEN 4.3+ PLANNED | :
> * | : QEMU TEARS DOWN ALL DEVICES :
> * | : FREES RESOURCES (closing fds) :
> * | : SETS PV BACKENDS TO STATE 5, :
> * | : waits for PV frontends to shut down :
> * | : SETS PV BACKENDS TO STATE 6 :
> * | : | :
> * | : QEMU NOTIFIES TOOLSTACK (via :
> * | : xenstore) that it is exiting :
> * | : QEMU EXITS (parent may be init) :
> * | : | :
> * | : TOOLSTACK WAITS FOR QEMU :
> * | : notices qemu has finished :
> * | :....................|.......................:
> * | .--------------------'
> * V V
> * for each device
> * we want to unplug/remove
> * ..................|...........................................
> * : V XEN 4.2 RACY BODGE :
> * : device is provided by qemu :
> * : | `-----------. :
> * : something| V :
> * : else, eg| domain (that is domain for which :
> * : blkback| this PV device is the backend, :
> * : | which might be the stub dm) :
> * : | is still alive? :
> * : | | | :
> * : | |alive |dead :
> * : |<-----------------' | :
> * : | hopefully qemu is | :
> * : | still running | :
> * :............|................. | :
> * ,----->| : we may be racing :
> * | backend state? : with qemu's death :
> * ^ | | : | :
> * xenstore| |other |6 : WAIT 2.0s :
> * conflict| | | : TIMEOUT :
> * | WRITE B.E. | : | :
> * | STATE:=5 | : hopefully qemu has :
> * `---' | | : gone by now and :
> * |ok | : freed its resources :
> * | | : | :
> * WAIT FOR | : SET B.E. :
> * STATE==6 | : STATE:=6 :
> * / | | :..........|...................:
> * timeout/ ok| | |
> * / | | |
> * | RUN HOTPLUG <-'<----------------'
> * | SCRIPT
> * | |
> * `---> NUKE
> * BACKEND
> * |
> * DONE.
> */
This is the diagram comment I'm planning to add on top of the callbacks
in libxl_device.c, it contains the flow of functions used for device
plug/unplug:
/*
* This is a general flow that describes the device plug/unplug process
* Some functions are ommited (like _cleanup) to simplify the scheme.
*
* +----------------------+
* +->initiate_device_remove+
* | +----------------------+---------+
* | |
* | +---------------+ NO +-----------v-----------+
* | |wait state == 6+----+Qemu bk && domu running|
* | +----------+---++ +-----------+-----------+
* | | | |YES
* | T/O| |OK |T/O 2s
* | | | +-------v-----------+
* | | | |device_qemu_timeout|
* | | | | set state = 6|
* | | | +-------+-----------+
* | | | |
* | | | +-----------v-----------+
+---------------+T/O
* | | +----->device_backend_callback<--------+wait state
== 2+--+
* | | +-----------+-----------+
OK+-------------^-+ |
* |OK +--v-------+ |
NO| |
* |force = 1|disconnect| +--v-----------+
+-----+-+ |
* +---------+&& !force | +-------+device_hotplug<--+-------------+Qemu
bk| |
* +---+------+ | +--------------+ |
YES+-----^-+ |
* NO| | |
| |
* | | |
| |
* +-------------+ |
|+------------------+---+|
* | +---------------------v-+ +------------+
||wait_device_connection||
* |++get_hotplug_script_info+------->exec_hotplug|
|+----------------------+|
* ||+-----------------------+OK +---+------+-+ |
|
* || T/O| | |
|
* || +--------------------+ | |
|
* ||+--------------v---+ +--------------------v-+ |
|
* |||hotplug_timeout_cb| |hotplug_child_death_cb+--+
|
* ||| kill script| | num_exec++|OK
|
* ||+------------------+ +--------------------+-+
|
* || error|
|
* || |
|
* || +-----------------v-+
|
*
+>------------------------->device_hotplug_done<---------------------------+
* error || no script left +--------+----------+
* |
* +-----------v--------+ +-----------------+
* |action == disconnect+---->rm back/front end|
* +-------------------++YES ++----------------+
* NO| |
* +v------v+
* |callback|
* +--------+
*/
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |