[PATCH 0/2] news: add a couple items before release
by Laine Stump
This adds a "new feature" for the VLAN tagging support on Linux host
bridges added by Leigh Brown, and an "improvement" (migration between
mdev<->SRIOV vGPUs) by me.
Feel free to push this for me so it can be included in RC2.
*** BLURB HERE ***
Laine Stump (2):
news: note addition of vlan tagging support for Linux host bridges
news: document support for mdev <-> SRIOV VF vGPU live migration
NEWS.rst | 13 +++++++++++++
1 file changed, 13 insertions(+)
--
2.47.1
3 months, 2 weeks
[PATCH] qemu_migration: Do not consider post-copy active in postcopy-recover
by Jiri Denemark
The postcopy-recover migration state in QEMU means a connection for the
migration stream was established. Depending on the schedulers on both
hosts a relative timing of the corresponding MIGRATION event on the
source host and the destination host may differ. Specifically it's
possible that the source sees postcopy-recover while the destination is
still in postcopy-paused.
Currently the Perform phase on the source host ends when we get
postcopy-recover event and the Finish phase on the destination host is
called. If this is fast enough we can still see postcopy-paused state
when the Finish phase starts waiting for migration to complete. This is
interpreted as a failure and reported back to the caller. Even though
the recovery may actually start just a few moments later.
To avoid this race we now don't consider post-copy migration active in
postcopy-recover state and keep waiting for postcopy-active event (in
the success path). Thus the Finish phase is entered only after the
migration switches to postcopy-active. In this state QEMU guarantees the
destination already switched at least to postcopy-recover and we won't
be confused be seeing an old postcopy-failed state.
https://issues.redhat.com/browse/RHEL-73085
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_migration.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 50e350b0c4..1582a738a3 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1872,11 +1872,11 @@ qemuMigrationUpdateJobType(virDomainJobData *jobData)
switch ((qemuMonitorMigrationStatus) priv->stats.mig.status) {
case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
- case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER:
jobData->status = VIR_DOMAIN_JOB_STATUS_POSTCOPY;
break;
case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP:
+ case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY_RECOVER:
jobData->status = VIR_DOMAIN_JOB_STATUS_POSTCOPY_RECOVER;
break;
--
2.47.1
3 months, 2 weeks
[PATCH] conf: Do not parse hyperv features with passthrough mode
by Martin Kletzander
The schema does not allow that anyway and we then format them all back
which leads to libvirt producing an invalid XML.
Resolves: https://issues.redhat.com/browse/RHEL-70656
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/conf/domain_conf.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e658b68c48b6..3f88a77a8fea 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16643,6 +16643,9 @@ virDomainFeaturesHyperVDefParse(virDomainDef *def,
def->features[VIR_DOMAIN_FEATURE_HYPERV] = mode;
+ if (mode == VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH)
+ return 0;
+
node = xmlFirstElementChild(node);
while (node != NULL) {
int feature;
--
2.47.1
3 months, 2 weeks
Virtual manager error
by Domenico Panella
Hi everyone,
when i try to run a VM through virt-manager application (Slackware 15),
I get the following error:
*Errore nell'avvio del dominio: internal error: unknown architecture
'loongarch64'**
**
**Traceback (most recent call last):**
** File "/usr/share/virt-manager/virtManager/asyncjob.py", line 72, in
cb_wrapper**
** callback(asyncjob, *args, **kwargs)**
** File "/usr/share/virt-manager/virtManager/asyncjob.py", line 108, in
tmpcb**
** callback(*args, **kwargs)**
** File "/usr/share/virt-manager/virtManager/object/libvirtobject.py",
line 57, in newfn**
** ret = fn(self, *args, **kwargs)**
** File "/usr/share/virt-manager/virtManager/object/domain.py", line
1402, in startup**
** self._backend.create()**
** File "/usr/lib64/python3.9/site-packages/libvirt.py", line 1373, in
create**
** raise libvirtError('virDomainCreate() failed')**
**libvirt.libvirtError: internal error: unknown architecture 'loongarch64'*
How can i fix it?
Cordially
Domenico
3 months, 2 weeks
[PATCH v4 0/4] iproute2 bridge vlan support
by Leigh Brown
I have incorporated Laine's feedback and added Reviewed-by tags. I also
noticed that I hadn't updated the patch series description, so I updated
it to reflect the change to using netlink, for posterity.
Description
-----------
The iproute2 bridge command supports the capability for VLAN filtering
that allows each interface connected to a standard linux bridge to be
configured to use one or more VLANs. For simple setups, this capability
is enough to allow virtual machines or containers to be put onto
separate VLANs without creating multiple bridges and VLANs on the host.
The first patch adds a new function virNetDevBridgeVlanFilterSet that
allows a VLAN filter to be added or removed from an interface associated
with a bridge.
The second patch adds virNetDevBridgeSetupVlans that will, given a
virNetDevVlan structure, call virNetDevBridgeVlanFilterSet to apply the
required VLAN filtering for the given interface.
The third patch adjusts the domain and network validation to permit
standard linux bridges to allow VLAN configuration and updates calls to
virNetDevBridgeAddPort to pass the VLAN configuration.
The fourth patch updates documentation to match the new capability.
Changes since v3
----------------
- Update patch series description.
- Fix coding style.
- Add G_GNUC_UNUSED annotation to virNetDevBridgeAddPort for MacOS.
Changes since v2
----------------
- Convert to use netlink rather than executing bridge vlan commands.
- Add unsupported on this platform error message on FreeBSD.
Changes since v1
----------------
- Fix bug in virNetDevSetupVlans where bridge port has no native vlan.
- Update bridge network validation to permit vlan configuration.
- Update documentation to match the functionality.
- Tweak some of the commit descriptions for clarity.
Usage example
-------------
Configure the host with systemd-networkd as follows:
/etc/systemd/network/br0.netdev (br0.network not shown)
[NetDev]
Name=br0
Kind=bridge
MACAddress=xx:xx:xx:xx:xx:xx
[Bridge]
VLANFiltering=on
/etc/systemd/network/eno1.network
[Match]
Name=eno1
[Network]
Bridge=br0
[Link]
MTUBytes=9000
[BridgeVLAN]
VLAN=40
[BridgeVLAN]
VLAN=60
Then add <vlan> tags into the lxc or qemu config:
lxc interface definition:
<interface type='bridge'>
<mac address='xx:xx:xx:xx:xx:xx'/>
<source bridge='br0'/>
<vlan>
<tag id='40'/>
</vlan>
</interface>
qemu interface definition:
<interface type='network'>
<mac address='xx:xx:xx:xx:xx:xx'/>
<source network='br0'/>
<vlan>
<tag id='60'/>
</vlan>
<model type='virtio'/>
<address type='pci' domain='0x0000'
bus='0x01' slot='0x00' function='0x0'/>
</interface>
Then, after starting them, you will see the following
$ sudo bridge vlan
port vlan-id
eno1 1 PVID Egress Untagged
40
60
br0 1 PVID Egress Untagged
vnet0 60 PVID Egress Untagged
vnet1 40 PVID Egress Untagged
Regards,
Leigh Brown (4):
util: add netlink bridge vlan filtering
util: Add vlan support to virNetDevBridgeAddPort
Enable vlan support for standard linux bridges
docs: standard linux bridges now support vlans
docs/formatdomain.rst | 37 +++++++++---------
docs/formatnetwork.rst | 45 +++++++++++-----------
src/conf/domain_validate.c | 3 +-
src/lxc/lxc_process.c | 2 +-
src/network/bridge_driver.c | 13 ++++---
src/util/virnetdevbridge.c | 75 +++++++++++++++++++++++++++++++++++--
src/util/virnetdevbridge.h | 4 +-
src/util/virnetdevtap.c | 2 +-
src/util/virnetlink.c | 66 ++++++++++++++++++++++++++++++++
src/util/virnetlink.h | 7 ++++
10 files changed, 201 insertions(+), 53 deletions(-)
--
2.39.5
3 months, 2 weeks
[libvirt PATCH] qemu: snapshot: delete disk image only if parent snapshot is external
by Pavel Hrdina
When we are deleting external snapshot that is not active we only need
to delete overlay disk image of the parent snapshot. This works
correctly even if parent snapshot is external and active as it will have
another overlay created when user reverted to that snapshot.
In case the parent snapshot is internal there are no overlay disk images
created as everything is stored internally within the disk image. In
this case we would delete the actual disk image storing internal
snapshots and most likely the original disk image as well resulting in
data loss once the VM is shutoff.
Fixes: https://gitlab.com/libvirt/libvirt/-/issues/734
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/qemu/qemu_snapshot.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
index 18b2e478f6..80cd54bf33 100644
--- a/src/qemu/qemu_snapshot.c
+++ b/src/qemu/qemu_snapshot.c
@@ -3144,6 +3144,8 @@ qemuSnapshotDeleteExternalPrepareData(virDomainObj *vm,
return -1;
}
+ data->parentSnap = qemuSnapshotFindParentSnapForDisk(snap, data->snapDisk);
+
if (data->merge) {
virStorageSource *snapDiskSrc = NULL;
@@ -3185,8 +3187,6 @@ qemuSnapshotDeleteExternalPrepareData(virDomainObj *vm,
qemuSnapshotGetDisksWithBackingStore(vm, snap, data);
}
- data->parentSnap = qemuSnapshotFindParentSnapForDisk(snap, data->snapDisk);
-
if (data->parentSnap && !virDomainSnapshotIsExternal(data->parentSnap)) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("deleting external snapshot that has internal snapshot as parent not supported"));
@@ -3642,10 +3642,12 @@ qemuSnapshotDiscardExternal(virDomainObj *vm,
if (!data->job)
goto error;
} else {
- if (virStorageSourceInit(data->parentDomDisk->src) < 0 ||
- virStorageSourceUnlink(data->parentDomDisk->src) < 0) {
- VIR_WARN("Failed to remove snapshot image '%s'",
- data->snapDisk->name);
+ if (data->parentSnap && virDomainSnapshotIsExternal(data->parentSnap)) {
+ if (virStorageSourceInit(data->parentDomDisk->src) < 0 ||
+ virStorageSourceUnlink(data->parentDomDisk->src) < 0) {
+ VIR_WARN("Failed to remove snapshot image '%s'",
+ data->snapDisk->name);
+ }
}
}
}
--
2.47.1
3 months, 2 weeks
[PATCH 0/1] RFC: Add Arm CCA support for getting capability information and running Realm VM
by Akio Kakuno
Hi, all.
- This patch adds Arm CCA support to qemu driver for aarch64 system.
CCA is an abbreviation for Arm Confidential Compute Architecture feature,
it enhances the virtualization capabilities of the platform by separating
the management of resources from access to those resources.
- We are not yet at the stage where we can merge this patch as host
linux/qemu suppor is no yet merged, but I would like to receive reviews
and comments on the overall direction.
[summary]
- At this stage, all you can do is getting the CCA capability with the virsh
domcapabilities command and start the CCA VM with the virsh create command.
- capability info uses qemu QMP to query qemu options. The option that
exists now is for selecting a hash algorithm.
[Capability example]
- Execution results of 'virsh domcapability" on qemu
<domaincapabilities>
...
<features>
...
</sgx>
<cca supported='yes'>
<enum name='measurement-algo'>
<value>sha256</value>
<value>sha512</value>
</enum>
</cca>
<hyperv supported='yes'>
...
</features>
</domaincapabilities>
[XML example]
<domain>
...
<launchsecurity type='cca'>
<measurement-algo>sha256</measurement-algo>
</launchsecurity>
...
</domain>
[limitations/tests]
- To obtain capability info, it is necessary to support the qemu QMP command,
which qemu does not yet support. Therefore, I put a hack in the code at
hand and only confirmed the communication. Also, I think we should check
whether CPUFW supports CCA or not in qemu_firmware.c, but it is not yet
implemented.
- Verified that the CCA VM can be started from virsh create command.
[software version]
- I followed the steps in Linaro's blog below.
https://linaro.atlassian.net/wiki/spaces/QEMU/pages/29051027459/Building+...
- The Qemu used was based on Linaro's qemu(9.1.91).
https://git.codelinaro.org/linaro/dcap/qemu/-/tree/cca/v3?ref_type=heads
Signed-off-by: Akio Kakuno <fj3333bs(a)fujitsu.com>
Best Regards.
Akio Kakuno (1):
RFC: Add Arm CCA support for getting capability information and
running Realm VM
docs/formatdomain.rst | 28 ++++++
docs/formatdomaincaps.rst | 26 ++++-
src/conf/domain_capabilities.c | 41 ++++++++
src/conf/domain_capabilities.h | 12 +++
src/conf/domain_conf.c | 13 +++
src/conf/domain_conf.h | 7 ++
src/conf/schemas/domaincaps.rng | 14 +++
src/conf/schemas/domaincommon.rng | 14 +++
src/conf/virconftypes.h | 2 +
src/libvirt_private.syms | 1 +
src/qemu/qemu_capabilities.c | 156 ++++++++++++++++++++++++++++++
src/qemu/qemu_capabilities.h | 4 +
src/qemu/qemu_cgroup.c | 2 +
src/qemu/qemu_command.c | 32 ++++++
src/qemu/qemu_driver.c | 2 +
src/qemu/qemu_monitor.c | 10 ++
src/qemu/qemu_monitor.h | 3 +
src/qemu/qemu_monitor_json.c | 104 ++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 4 +
src/qemu/qemu_namespace.c | 2 +
src/qemu/qemu_process.c | 4 +
src/qemu/qemu_validate.c | 7 ++
22 files changed, 487 insertions(+), 1 deletion(-)
--
2.34.1
3 months, 2 weeks
[PATCH] Passing a domain XML to a polkit rule engine
by Takuya Nakaike
This patch is a draft implementation to pass a domain
XML to a polkit access driver. With this new feature, a polkit rule can
verify the domain XML to be deployed on a host, and thus protect deploying a
malicious VM.
There is a discussion about this new feature in the following issue.
https://gitlab.com/libvirt/libvirt/-/issues/719
Any question, comment, and suggestion are welcome. Thanks,
Signed-off-by: Takuya Nakaike <nakaike(a)jp.ibm.com>
---
src/access/viraccessdriverpolkit.c | 2 ++
src/access/viraccessmanager.c | 22 ++++++++++++++++++++++
src/access/viraccessmanager.h | 3 +++
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 3 +++
5 files changed, 31 insertions(+)
diff --git a/src/access/viraccessdriverpolkit.c b/src/access/viraccessdriverpolkit.c
index 83381183a5..56457010e0 100644
--- a/src/access/viraccessdriverpolkit.c
+++ b/src/access/viraccessdriverpolkit.c
@@ -177,10 +177,12 @@ virAccessDriverPolkitCheckDomain(virAccessManager *manager,
virAccessPermDomain perm)
{
char uuidstr[VIR_UUID_STRING_BUFLEN];
+ char *xml = virAccessManagerGetXMLDesc(domain);
const char *attrs[] = {
"connect_driver", driverName,
"domain_name", domain->name,
"domain_uuid", uuidstr,
+ "xml", xml != NULL ? xml : "",
NULL,
};
virUUIDFormat(domain->uuid, uuidstr);
diff --git a/src/access/viraccessmanager.c b/src/access/viraccessmanager.c
index 6d9fdee5f1..7be31eb19a 100644
--- a/src/access/viraccessmanager.c
+++ b/src/access/viraccessmanager.c
@@ -44,11 +44,13 @@ struct _virAccessManager {
virObjectLockable parent;
virAccessDriver *drv;
+ virDomainXMLOption *xmlopt;
void *privateData;
};
static virClass *virAccessManagerClass;
static virAccessManager *virAccessManagerDefault;
+static virDomainXMLOption *virAccessManagerXMLOption = NULL;
static void virAccessManagerDispose(void *obj);
@@ -376,3 +378,23 @@ int virAccessManagerCheckStorageVol(virAccessManager *manager,
return virAccessManagerSanitizeError(ret, driverName);
}
+
+virDomainXMLOption *virAccessManagerGetXMLOption(void)
+{
+ return virAccessManagerXMLOption;
+}
+
+void virAccessManagerSetXMLOption(virDomainXMLOption *xmlopt)
+{
+ virObjectUnref(virAccessManagerXMLOption);
+
+ virAccessManagerXMLOption = virObjectRef(xmlopt);
+}
+
+char *virAccessManagerGetXMLDesc(virDomainDef *domain)
+{
+ if (virAccessManagerGetXMLOption() != NULL) {
+ return virDomainDefFormat(domain, virAccessManagerGetXMLOption(), 0);
+ }
+ return NULL;
+}
diff --git a/src/access/viraccessmanager.h b/src/access/viraccessmanager.h
index 2050ac9b85..3516f4f8e4 100644
--- a/src/access/viraccessmanager.h
+++ b/src/access/viraccessmanager.h
@@ -94,3 +94,6 @@ int virAccessManagerCheckStorageVol(virAccessManager *manager,
virStoragePoolDef *pool,
virStorageVolDef *vol,
virAccessPermStorageVol perm);
+virDomainXMLOption *virAccessManagerGetXMLOption(void);
+void virAccessManagerSetXMLOption(virDomainXMLOption *xmlopt);
+char *virAccessManagerGetXMLDesc(virDomainDef *domain);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 33b93cbd3e..8bcbc9c478 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -19,6 +19,7 @@ virAccessManagerGetDefault;
virAccessManagerNew;
virAccessManagerNewStack;
virAccessManagerSetDefault;
+virAccessManagerSetXMLOption;
# access/viraccessperm.h
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index d2eddbd9ae..f9880f8ee3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -105,6 +105,7 @@
#include "virdomaincheckpointobjlist.h"
#include "virutil.h"
#include "backup_conf.h"
+#include "viraccessmanager.h"
#define VIR_FROM_THIS VIR_FROM_QEMU
@@ -835,6 +836,8 @@ qemuStateInitialize(bool privileged,
defsecmodel)))
goto error;
+ virAccessManagerSetXMLOption(qemu_driver->xmlopt);
+
qemu_driver->nbdkitCapsCache = qemuNbdkitCapsCacheNew(cfg->cacheDir);
/* If hugetlbfs is present, then we need to create a sub-directory within
--
2.43.5
3 months, 2 weeks
[PATCH 0/2] storage_file: De-modularize the 'fs' backend
by Peter Krempa
See 1/2 for rationale.
Peter Krempa (2):
storage_file: de-modularize the local file backend
NEWS: Mention de-modularization of the 'fs' storage file backend
NEWS.rst | 9 +++++++++
libvirt.spec.in | 1 -
src/storage_file/meson.build | 16 ----------------
src/storage_file/storage_file_backend.c | 11 ++++++-----
4 files changed, 15 insertions(+), 22 deletions(-)
--
2.47.1
3 months, 2 weeks
[PATCH] docs: Clarify documentation of host-model CPU mode
by Jiri Denemark
The host-model CPU mode was described as similar to copying the host CPU
definition from capabilities, which has not been the case for ages. The
host-model definition from domain capabilities is used instead.
Only the first sentence changed, but it required reformatting
essentially the whole paragraph so I used this as an opportunity to
reformat it a little bit more and split the long paragraph into several
smaller ones for better readability.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
docs/formatdomain.rst | 68 ++++++++++++++++++++++++-------------------
1 file changed, 38 insertions(+), 30 deletions(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 02c5361905..00acf7aa91 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -1482,38 +1482,46 @@ In case no restrictions need to be put on CPU model and its features, a simpler
presented to the guest. This is the default when no ``mode`` attribute is
specified. This mode makes it so that a persistent guest will see the same
hardware no matter what host the guest is booted on.
+
``host-model``
- The ``host-model`` mode is essentially a shortcut to copying host CPU
- definition from capabilities XML into domain XML. Since the CPU definition
- is copied just before starting a domain, exactly the same XML can be used
- on different hosts while still providing the best guest CPU each host
- supports. The ``match`` attribute can't be used in this mode. Specifying
- CPU model is not supported either, but ``model``'s ``fallback`` attribute
- may still be used. Using the ``feature`` element, specific flags may be
- enabled or disabled specifically in addition to the host model. This may
- be used to fine tune features that can be emulated. :since:`(Since 1.1.1)`
- . Libvirt does not model every aspect of each CPU so the guest CPU will
- not match the host CPU exactly. On the other hand, the ABI provided to the
+ The ``host-model`` mode is essentially a shortcut to copying host-model
+ CPU definition from `domain capabilities XML
+ <formatdomaincaps.html#cpu-configuration>`__ into domain XML. Since the
+ CPU definition is copied just before starting a domain, exactly the same
+ XML can be used on different hosts while still providing the best guest
+ CPU each host supports. The ``match`` attribute can't be used in this
+ mode. Specifying CPU model is not supported either, but ``model``'s
+ ``fallback`` attribute may still be used. Using the ``feature`` element,
+ specific flags may be enabled or disabled specifically in addition to the
+ host model. This may be used to fine tune features that can be emulated.
+ :since:`(Since 1.1.1)`
+
+ Libvirt does not model every aspect of each CPU so the guest CPU will not
+ match the host CPU exactly. On the other hand, the ABI provided to the
guest is reproducible. During migration, complete CPU model definition is
- transferred to the destination host so the migrated guest will see exactly
- the same CPU model for the running instance of the guest, even if the
- destination host contains more capable CPUs or newer kernel; but shutting
- down and restarting the guest may present different hardware to the guest
- according to the capabilities of the new host. Prior to libvirt 3.2.0 and
- QEMU 2.9.0 detection of the host CPU model via QEMU is not supported. Thus
- the CPU configuration created using ``host-model`` may not work as
- expected. :since:`Since 3.2.0 and QEMU 2.9.0` this mode works the way it
- was designed and it is indicated by the ``fallback`` attribute set to
- ``forbid`` in the host-model CPU definition advertised in `domain
- capabilities XML <formatdomaincaps.html#cpu-configuration>`__. When
- ``fallback`` attribute is set to ``allow`` in the domain capabilities
- XML, it is recommended to use ``custom`` mode with just the CPU model
- from the host capabilities XML. :since:`Since 1.2.11` PowerISA allows
- processors to run VMs in binary compatibility mode supporting an older
- version of ISA. Libvirt on PowerPC architecture uses the ``host-model``
- to signify a guest mode CPU running in binary compatibility mode.
- Example: When a user needs a power7 VM to run in compatibility mode on a
- Power8 host, this can be described in XML as follows :
+ transferred to the destination host so the migrated guest will see
+ exactly the same CPU model for the running instance of the guest, even if
+ the destination host contains more capable CPUs or newer kernel; but
+ shutting down and restarting the guest may present different hardware to
+ the guest according to the capabilities of the new host.
+
+ Prior to libvirt 3.2.0 and QEMU 2.9.0 detection of the host CPU model via
+ QEMU is not supported. Thus the CPU configuration created using
+ ``host-model`` may not work as expected. :since:`Since 3.2.0 and QEMU
+ 2.9.0` this mode works the way it was designed and it is indicated by the
+ ``fallback`` attribute set to ``forbid`` in the host-model CPU definition
+ advertised in `domain capabilities XML
+ <formatdomaincaps.html#cpu-configuration>`__. When ``fallback`` attribute
+ is set to ``allow`` in the domain capabilities XML, it is recommended to
+ use ``custom`` mode with just the CPU model from the host capabilities
+ XML.
+
+ :since:`Since 1.2.11` PowerISA allows processors to run VMs in binary
+ compatibility mode supporting an older version of ISA. Libvirt on
+ PowerPC architecture uses the ``host-model`` to signify a guest mode CPU
+ running in binary compatibility mode. Example: When a user needs a power7
+ VM to run in compatibility mode on a Power8 host, this can be described
+ in XML as follows:
::
--
2.47.1
3 months, 2 weeks