Hi all,

I'm part of Cyberus Technology and currently working on the Cloud Hypervisor 
driver backend of libvirt. We are currently implementing a feature to fix 
device bus addresses in the domain definitions for PCI devices, guaranteeing 
that devices remain available at the same address even after live migration and 
restarts, and across libvirt versions. In doing so, some questions came up 
about the intended semantics of the `--persistent` and `--live` flags in virsh 
commands and the synchronization between runtime and persistent configuration. 
So we wanted to ask you these questions.

Our first question revolves around `virsh mirgate --persistent`. The 
documentation says `leaves the domain persistent on the destination host 
physical machine`, but what domain definition is used from the source side to 
migrate the VM? Is it that the live definition is sent, then migrated, and 
persisted on the receiver side? Or is the source's persistent XML sent to the 
receiver, and the receiver’s live definition created from the persistent 
definition received?

The second question is about synchronization between live and persistent 
configuration. To achieve the goal of keeping the same device at the same PCI 
bus address across restarts and live migrations, to our understanding, we have 
to ensure that one device is written to both domain definitions with the same 
PCI bus address. Is this right, or do we miss something?

The next questions are about attaching/detaching devices (live). With respect 
to our intention to implement fixed PCI bus addresses for devices, what would 
be the right semantics for the following cases? Are they even valid? The source 
code of the qemu driver leaves those questions open:
         1) We attach a device `A` with `--persistent`and remove it with 
`--live`. If we now attach `B`, either via `--persistent` and `--live`, we 
expect that the PCI bus address formerly assigned to `A` is not reused for `B`. 
Is this correct?
         2) If we attach a device  `A` with `--live` and a second device `B` 
with `--persistent`, then `A` will not be present in the persistent domain XML. 
Still, we expect that `B` is added to both live and persistent definitions, 
using the same PCI bus address. By doing so, we would expect the attachment 
routines for the persistent definition not to assign the address handed out by 
the attachment routines of the live configuration for device `A`. In other 
words, even if `A` is not present in the persistent configuration, we would 
expect the address of `A` not be reused when attaching `B` to the persistent 
definition. Are those semantics correct?

The last question is about target names for network devices (`ifname`). libvirt 
does generate names for such devices in certain situations. Whenever a device 
definition is parsed that contains an `ifname` that matches libvirt's 
generation rules, e.g. vnet*, it is blanked out (see `virDomainNetDefParseXML`, 
in domain_conf.c). When writing code that tries to identify network devices by 
their `ifname`s, we found that this would be impossible because devices with an 
autogenerated name will have a blank `ifname` in the definition. What is the 
expected semantics around fixed PCI bus addresses for such devices? Would it be 
right to assign a custom `ifname` to them in this case?

Thanks in advance!
Pascal

Reply via email to