Skip to content

Commit

Permalink
docs/migration: Convert virtio.txt into rST
Browse files Browse the repository at this point in the history
Convert the plain old .txt into .rst, add it into migration/index.rst.

Reviewed-by: Cédric Le Goater <clg@redhat.com>
Link: https://lore.kernel.org/r/20240109064628.595453-4-peterx@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
  • Loading branch information
xzpeter committed Jan 16, 2024
1 parent f6bbac9 commit 4d7a691
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 108 deletions.
1 change: 1 addition & 0 deletions docs/devel/migration/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ QEMU live migration works.

main
vfio
virtio
115 changes: 115 additions & 0 deletions docs/devel/migration/virtio.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
=======================
Virtio device migration
=======================

Copyright 2015 IBM Corp.

This work is licensed under the terms of the GNU GPL, version 2 or later. See
the COPYING file in the top-level directory.

Saving and restoring the state of virtio devices is a bit of a twisty maze,
for several reasons:

- state is distributed between several parts:

- virtio core, for common fields like features, number of queues, ...

- virtio transport (pci, ccw, ...), for the different proxy devices and
transport specific state (msix vectors, indicators, ...)

- virtio device (net, blk, ...), for the different device types and their
state (mac address, request queue, ...)

- most fields are saved via the stream interface; subsequently, subsections
have been added to make cross-version migration possible

This file attempts to document the current procedure and point out some
caveats.

Save state procedure
====================

::

virtio core virtio transport virtio device
----------- ---------------- -------------

save() function registered
via VMState wrapper on
device class
virtio_save() <----------
------> save_config()
- save proxy device
- save transport-specific
device fields
- save common device
fields
- save common virtqueue
fields
------> save_queue()
- save transport-specific
virtqueue fields
------> save_device()
- save device-specific
fields
- save subsections
- device endianness,
if changed from
default endianness
- 64 bit features, if
any high feature bit
is set
- virtio-1 virtqueue
fields, if VERSION_1
is set

Load state procedure
====================

::

virtio core virtio transport virtio device
----------- ---------------- -------------

load() function registered
via VMState wrapper on
device class
virtio_load() <----------
------> load_config()
- load proxy device
- load transport-specific
device fields
- load common device
fields
- load common virtqueue
fields
------> load_queue()
- load transport-specific
virtqueue fields
- notify guest
------> load_device()
- load device-specific
fields
- load subsections
- device endianness
- 64 bit features
- virtio-1 virtqueue
fields
- sanitize endianness
- sanitize features
- virtqueue index sanity
check
- feature-dependent setup

Implications of this setup
==========================

Devices need to be careful in their state processing during load: The
load_device() procedure is invoked by the core before subsections have
been loaded. Any code that depends on information transmitted in subsections
therefore has to be invoked in the device's load() function _after_
virtio_load() returned (like e.g. code depending on features).

Any extension of the state being migrated should be done in subsections
added to the core for compatibility reasons. If transport or device specific
state is added, core needs to invoke a callback from the new subsection.
108 changes: 0 additions & 108 deletions docs/devel/migration/virtio.txt

This file was deleted.

0 comments on commit 4d7a691

Please sign in to comment.