From 3337a98a5ee41ee1d5de796abcb378eacb9bded0 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Tue, 24 Dec 2013 18:10:53 +0200 Subject: [PATCH] domain: don't try to interpret as virtio config for hostdev interfaces This resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1046337 The name attribute of an interface is interpreted in two different ways depending on the type - if the interface is type='hostdev', then the driver name describes which backend to use for the hostdev device assignment (vfio or kvm), but if the interface is any emulated type *and* the model type is "virtio", then the driver name can be "vhost" or "qemu", telling which backend qemu should use to communicate with the emulated device. The problem comes when someone has defined a an interface like this (which is accepted by the parser as long as no is specified): ... ... As libvirt storing this definition in the domain's status, the driver name is automatically filled in with the backend that was automatically decided by libvirt, so it stores this in the status: ... ... ... This isn't noticed until the next time libvirtd is restarted - as it is reading the status of all domains, it encounters the above interface definition, logs an error: internal error: Unknown interface has been specified and fails to reload the domain status, so the domain is marked as inactive. The solution is to stop the parser from interpreting attributes as if the device was an emulated virtio device, when it is actually a hostdev. (Although the bug has existed since vfio support was added, it has just recently become more apparent because libvirt previously didn't automatically set the driver name for hostdev interfaces in the domain status to vfio/kvm as it does since commit f094aa, first appearing in v1.1.4.) --- src/conf/domain_conf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 80bc85fad8..e65f3e3fcd 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6752,7 +6752,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, model = NULL; } - if (def->model && STREQ(def->model, "virtio")) { + if (def->type != VIR_DOMAIN_NET_TYPE_HOSTDEV && + STREQ_NULLABLE(def->model, "virtio")) { if (backend != NULL) { int name; if ((name = virDomainNetBackendTypeFromString(backend)) < 0 ||