[libvirt PATCH] util: validate pcie_cap_pos != 0 in virDeviceHasPCIExpressLink()
by Laine Stump
virDeviceHasPCIExpressLink() wasn't checking that pcie_cap_pos was
valid before attempting to use it, which could lead to reading the
byte at offset 0+PCI_CAP_ID_EXP instead of [valid
offset]+PCI_CAP_ID_EXP. In particular, this could happen for
"integrated" PCI devices (those that are on the PCIe root complex). If
it happened that the byte from the wrong address had the "right" bit
set, then it would lead to us innappropriately believing that Express
Link info was available when it wasn't, and the node device driver
would log an error like this:
virPCIDeviceGetLinkCapSta:2754 :
internal error: pci device 0000:00:18.0 is not a PCI-Express device
during a libvirtd restart. (this didn't ever occur until after
virPCIDeviceIsPCIExpress() was made more intelligent in commit
c00b6b1ae, which hasn't yet been in any official release)
Signed-off-by: Laine Stump <laine(a)redhat.com>
---
src/util/virpci.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/util/virpci.c b/src/util/virpci.c
index 9bfc743fbd..50fd5ef7ea 100644
--- a/src/util/virpci.c
+++ b/src/util/virpci.c
@@ -2722,6 +2722,11 @@ virPCIDeviceHasPCIExpressLink(virPCIDevicePtr dev)
if (virPCIDeviceInit(dev, fd) < 0)
goto cleanup;
+ if (dev->pcie_cap_pos == 0) {
+ ret = 0;
+ goto cleanup;
+ }
+
cap = virPCIDeviceRead16(dev, fd, dev->pcie_cap_pos + PCI_CAP_FLAGS);
type = (cap & PCI_EXP_FLAGS_TYPE) >> 4;
--
2.29.2
4 years, 5 months
[PATCH 0/7] secret: Relax usage 'name' regex
by Peter Krempa
Patches 1-6 are mostly cleanups noticed while looking at the schema.
See patch 7/7 for explanation.
Peter Krempa (7):
virSecretDefParseUsage: Use g_autofree for type_str
secretXMLParseNode: Clean up freeing of memory
virSecretLookupParseSecret: Use g_steal_pointer
schema: domaincommon: Remove pointless 'choice' from
'inituser'/'initgroup'
schema: Remove workaround for bug in libxml2 2.7.6
schema: Add define for object names
schema: secret: Relax requirements for usage name
docs/schemas/basictypes.rng | 13 ++++++++
docs/schemas/domaincommon.rng | 33 +++++--------------
docs/schemas/secret.rng | 8 ++---
docs/schemas/storagecommon.rng | 8 -----
docs/schemas/storagepool.rng | 4 +--
src/conf/secret_conf.c | 20 ++++-------
src/util/virsecret.c | 3 +-
.../disk-network-source-auth.args | 8 ++++-
...isk-network-source-auth.x86_64-2.12.0.args | 9 +++++
...isk-network-source-auth.x86_64-latest.args | 29 +++++++++++-----
.../disk-network-source-auth.xml | 12 +++++++
tests/qemuxml2argvtest.c | 3 +-
.../disk-network-source-auth.xml | 13 ++++++++
tests/secretxml2xmlin/usage-ceph-space.xml | 7 ++++
tests/secretxml2xmltest.c | 1 +
15 files changed, 107 insertions(+), 64 deletions(-)
create mode 100644 tests/secretxml2xmlin/usage-ceph-space.xml
--
2.29.2
4 years, 5 months
[PATCH] Qemu: migration: Not bind RAM info with active migration status
by Keqian Zhu
For that Qemu supports returning incoming migration info since its commit
65ace0604551 (migration: add postcopy total blocktime into query-migrate),
which may contains active status, but without RAM info. Drop this binding
relationship check in libvirt.
Signed-off-by: Keqian Zhu <zhukeqian1(a)huawei.com>
---
src/qemu/qemu_monitor_json.c | 88 +++++++++++++++++-------------------
1 file changed, 42 insertions(+), 46 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index d808c4b55b..ba8e340742 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -3547,56 +3547,52 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValuePtr reply,
case QEMU_MONITOR_MIGRATION_STATUS_PRE_SWITCHOVER:
case QEMU_MONITOR_MIGRATION_STATUS_DEVICE:
ram = virJSONValueObjectGetObject(ret, "ram");
- if (!ram) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("migration was active, but no RAM info was set"));
- return -1;
- }
+ if (ram) {
+ if (virJSONValueObjectGetNumberUlong(ram, "transferred",
+ &stats->ram_transferred) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("migration was active, but RAM 'transferred' "
+ "data was missing"));
+ return -1;
+ }
+ if (virJSONValueObjectGetNumberUlong(ram, "remaining",
+ &stats->ram_remaining) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("migration was active, but RAM 'remaining' "
+ "data was missing"));
+ return -1;
+ }
+ if (virJSONValueObjectGetNumberUlong(ram, "total",
+ &stats->ram_total) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("migration was active, but RAM 'total' "
+ "data was missing"));
+ return -1;
+ }
- if (virJSONValueObjectGetNumberUlong(ram, "transferred",
- &stats->ram_transferred) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("migration was active, but RAM 'transferred' "
- "data was missing"));
- return -1;
- }
- if (virJSONValueObjectGetNumberUlong(ram, "remaining",
- &stats->ram_remaining) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("migration was active, but RAM 'remaining' "
- "data was missing"));
- return -1;
- }
- if (virJSONValueObjectGetNumberUlong(ram, "total",
- &stats->ram_total) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("migration was active, but RAM 'total' "
- "data was missing"));
- return -1;
- }
+ if (virJSONValueObjectGetNumberDouble(ram, "mbps", &mbps) == 0 &&
+ mbps > 0) {
+ /* mpbs from QEMU reports Mbits/s (M as in 10^6 not Mi as 2^20) */
+ stats->ram_bps = mbps * (1000 * 1000 / 8);
+ }
- if (virJSONValueObjectGetNumberDouble(ram, "mbps", &mbps) == 0 &&
- mbps > 0) {
- /* mpbs from QEMU reports Mbits/s (M as in 10^6 not Mi as 2^20) */
- stats->ram_bps = mbps * (1000 * 1000 / 8);
+ if (virJSONValueObjectGetNumberUlong(ram, "duplicate",
+ &stats->ram_duplicate) == 0)
+ stats->ram_duplicate_set = true;
+ ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal",
+ &stats->ram_normal));
+ ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal-bytes",
+ &stats->ram_normal_bytes));
+ ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-pages-rate",
+ &stats->ram_dirty_rate));
+ ignore_value(virJSONValueObjectGetNumberUlong(ram, "page-size",
+ &stats->ram_page_size));
+ ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-sync-count",
+ &stats->ram_iteration));
+ ignore_value(virJSONValueObjectGetNumberUlong(ram, "postcopy-requests",
+ &stats->ram_postcopy_reqs));
}
- if (virJSONValueObjectGetNumberUlong(ram, "duplicate",
- &stats->ram_duplicate) == 0)
- stats->ram_duplicate_set = true;
- ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal",
- &stats->ram_normal));
- ignore_value(virJSONValueObjectGetNumberUlong(ram, "normal-bytes",
- &stats->ram_normal_bytes));
- ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-pages-rate",
- &stats->ram_dirty_rate));
- ignore_value(virJSONValueObjectGetNumberUlong(ram, "page-size",
- &stats->ram_page_size));
- ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-sync-count",
- &stats->ram_iteration));
- ignore_value(virJSONValueObjectGetNumberUlong(ram, "postcopy-requests",
- &stats->ram_postcopy_reqs));
-
disk = virJSONValueObjectGetObject(ret, "disk");
if (disk) {
rc = virJSONValueObjectGetNumberUlong(disk, "transferred",
--
2.19.1
4 years, 5 months
[PATCH v2] conf: Add support for keeping TPM emulator state
by Eiichi Tsukata
Currently, swtpm TPM state file is removed when a transient domain is
powered off or undefined. When we store TPM state on a shared storage
such as NFS and use transient domain, TPM states should be kept as it is.
Add per-TPM emulator option `persistent_sate` for keeping TPM state.
This option only works for the emulator type backend and looks as follows:
<tpm model='tpm-tis'>
<backend type='emulator' persistent_state='yes'/>
</tpm>
Signed-off-by: Eiichi Tsukata <eiichi.tsukata(a)nutanix.com>
Reviewed-by: Stefan Berger <stefanb(a)linux.ibm.com>
---
docs/formatdomain.rst | 7 ++++
docs/schemas/domaincommon.rng | 12 ++++++
src/conf/domain_conf.c | 21 ++++++++++
src/conf/domain_conf.h | 1 +
src/qemu/qemu_tpm.c | 3 +-
...pm-emulator-tpm2-pstate.x86_64-latest.args | 38 +++++++++++++++++++
.../tpm-emulator-tpm2-pstate.xml | 30 +++++++++++++++
tests/qemuxml2argvtest.c | 1 +
...tpm-emulator-tpm2-pstate.x86_64-latest.xml | 37 ++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
10 files changed, 150 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.xml
create mode 100644 tests/qemuxml2xmloutdata/tpm-emulator-tpm2-pstate.x86_64-latest.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 512939679b..87bbd1a4f1 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -6986,6 +6986,13 @@ Example: usage of the TPM Emulator
- '1.2' : creates a TPM 1.2
- '2.0' : creates a TPM 2.0
+``persistent_state``
+ The ``persistent_state`` attribute indicates whether 'swtpm' TPM state is
+ kept or not when a transient domain is powered off or undefined. This
+ option can be used for preserving TPM state. By default the value is ``no``.
+ This attribute only works with the ``emulator`` backend. The accepted values
+ are ``yes`` and ``no``.
+
``encryption``
The ``encryption`` element allows the state of a TPM emulator to be
encrypted. The ``secret`` must reference a secret object that holds the
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 795b654feb..d7cedc014c 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4780,6 +4780,18 @@
</optional>
</group>
</choice>
+ <choice>
+ <group>
+ <optional>
+ <attribute name="persistent_state">
+ <choice>
+ <value>yes</value>
+ <value>no</value>
+ </choice>
+ </attribute>
+ </optional>
+ </group>
+ </choice>
</element>
</define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 23415b323c..82c3a68347 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13178,6 +13178,12 @@ virDomainSmartcardDefParseXML(virDomainXMLOptionPtr xmlopt,
* <encryption secret='32ee7e76-2178-47a1-ab7b-269e6e348015'/>
* </backend>
* </tpm>
+ *
+ * Emulator persistent_state is supported with the following:
+ *
+ * <tpm model='tpm-tis'>
+ * <backend type='emulator' version='2.0' persistent_state='yes'>
+ * </tpm>
*/
static virDomainTPMDefPtr
virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
@@ -13193,6 +13199,7 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
g_autofree char *backend = NULL;
g_autofree char *version = NULL;
g_autofree char *secretuuid = NULL;
+ g_autofree char *persistent_state = NULL;
g_autofree xmlNodePtr *backends = NULL;
def = g_new0(virDomainTPMDef, 1);
@@ -13265,6 +13272,18 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
}
def->data.emulator.hassecretuuid = true;
}
+
+ persistent_state = virXMLPropString(backends[0], "persistent_state");
+ if (persistent_state) {
+ if (virStringParseYesNo(persistent_state,
+ &def->data.emulator.persistent_state) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Invalid persistent_state value, either 'yes' or 'no'"));
+ goto error;
+ }
+ } else {
+ def->data.emulator.persistent_state = false;
+ }
break;
case VIR_DOMAIN_TPM_TYPE_LAST:
goto error;
@@ -26952,6 +26971,8 @@ virDomainTPMDefFormat(virBufferPtr buf,
case VIR_DOMAIN_TPM_TYPE_EMULATOR:
virBufferAsprintf(buf, " version='%s'",
virDomainTPMVersionTypeToString(def->version));
+ if (def->data.emulator.persistent_state)
+ virBufferAddLit(buf, " persistent_state='yes'");
if (def->data.emulator.hassecretuuid) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
virBufferAddLit(buf, ">\n");
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 72771c46b9..109625828a 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1362,6 +1362,7 @@ struct _virDomainTPMDef {
char *logfile;
unsigned char secretuuid[VIR_UUID_BUFLEN];
bool hassecretuuid;
+ bool persistent_state;
} emulator;
} data;
};
diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index 872be16570..532e0912bd 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -729,7 +729,8 @@ qemuExtTPMCleanupHost(virDomainDefPtr def)
if (def->tpms[i]->type != VIR_DOMAIN_TPM_TYPE_EMULATOR)
continue;
- qemuTPMDeleteEmulatorStorage(def->tpms[i]);
+ if (!def->tpms[i]->data.emulator.persistent_state)
+ qemuTPMDeleteEmulatorStorage(def->tpms[i]);
}
}
diff --git a/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args
new file mode 100644
index 0000000000..90505c7a76
--- /dev/null
+++ b/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.x86_64-latest.args
@@ -0,0 +1,38 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-TPM-VM \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-TPM-VM/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-TPM-VM/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-TPM-VM/.config \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name guest=TPM-VM,debug-threads=on \
+-S \
+-object secret,id=masterKey0,format=raw,\
+file=/tmp/lib/domain--1-TPM-VM/master-key.aes \
+-machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off,\
+memory-backend=pc.ram \
+-cpu qemu64 \
+-m 2048 \
+-object memory-backend-ram,id=pc.ram,size=2147483648 \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid 11d7cd22-da89-3094-6212-079a48a309a1 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-boot menu=on,strict=on \
+-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
+-tpmdev emulator,id=tpm-tpm0,chardev=chrtpm \
+-chardev socket,id=chrtpm,path=/dev/test \
+-device tpm-tis,tpmdev=tpm-tpm0,id=tpm0 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
+resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.xml b/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.xml
new file mode 100644
index 0000000000..45fc4c0e1a
--- /dev/null
+++ b/tests/qemuxml2argvdata/tpm-emulator-tpm2-pstate.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>TPM-VM</name>
+ <uuid>11d7cd22-da89-3094-6212-079a48a309a1</uuid>
+ <memory unit='KiB'>2097152</memory>
+ <currentMemory unit='KiB'>512288</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc-i440fx-2.12'>hvm</type>
+ <boot dev='hd'/>
+ <bootmenu enable='yes'/>
+ </os>
+ <features>
+ <acpi/>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <controller type='usb' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <tpm model='tpm-tis'>
+ <backend type='emulator' version='2.0' persistent_state='yes'/>
+ </tpm>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 9b853c6d59..e96a51d18b 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -2460,6 +2460,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("tpm-emulator");
DO_TEST_CAPS_LATEST("tpm-emulator-tpm2");
DO_TEST_CAPS_LATEST("tpm-emulator-tpm2-enc");
+ DO_TEST_CAPS_LATEST("tpm-emulator-tpm2-pstate");
DO_TEST_CAPS_LATEST_PPC64("tpm-emulator-spapr");
DO_TEST_PARSE_ERROR("pci-domain-invalid", NONE);
diff --git a/tests/qemuxml2xmloutdata/tpm-emulator-tpm2-pstate.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-emulator-tpm2-pstate.x86_64-latest.xml
new file mode 100644
index 0000000000..08bc8d690c
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/tpm-emulator-tpm2-pstate.x86_64-latest.xml
@@ -0,0 +1,37 @@
+<domain type='qemu'>
+ <name>TPM-VM</name>
+ <uuid>11d7cd22-da89-3094-6212-079a48a309a1</uuid>
+ <memory unit='KiB'>2097152</memory>
+ <currentMemory unit='KiB'>512288</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc-i440fx-2.12'>hvm</type>
+ <boot dev='hd'/>
+ <bootmenu enable='yes'/>
+ </os>
+ <features>
+ <acpi/>
+ </features>
+ <cpu mode='custom' match='exact' check='none'>
+ <model fallback='forbid'>qemu64</model>
+ </cpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <tpm model='tpm-tis'>
+ <backend type='emulator' version='2.0' persistent_state='yes'/>
+ </tpm>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 1968be6782..f8bca9f559 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -761,6 +761,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("tpm-emulator");
DO_TEST_CAPS_LATEST("tpm-emulator-tpm2");
DO_TEST_CAPS_LATEST("tpm-emulator-tpm2-enc");
+ DO_TEST_CAPS_LATEST("tpm-emulator-tpm2-pstate");
DO_TEST("metadata", NONE);
DO_TEST("metadata-duplicate", NONE);
--
2.28.0
4 years, 5 months
[RFC] exposing 'nodedev assigned to domain' info to users
by Daniel Henrique Barboza
Hi,
This is something I've been giving a thought after working in Gitlab issue
#72 and decided to run through the ML before hitting the code.
We don't have an easy way to retrieve the domain that is using an specific
hostdev. Let's say that I want to know which domain is using the PCI card
pci_0000_01_00_2. 'nodedev-dumpxml' will return the hardware/driver capabilities
of the device, such as IOMMU group, driver and so on, but will not inform
which domain is using the hostdev, if any. 'nodedev-list' will simply list
all nodedev names known to Libvirt, without outputting any other information.
IIUC, the only existing way I can reliably tell whether a hostdev is being
used by domain, aside from having to register the information by myself
during domain definition of course, is via 'virsh dumpxml <domain>' each
existing running domain and matching the nodedev name with the source.address
element of the XML.
When we consider SR-IOV devices that can have 28+ VFs each (and have lots of
fun caveats, like Github #72 showed us), the capability of hot plug/unplug
hostdevs freely, and lots of running domains, it is clear that we're putting a
considerable pressure in the upper layers (OVirt, or a poor human admin) to
keep track of the nodedevs each running domain is using. An info that we
already have internally and can just expose it.
I have a few ideas to make this happen:
1 - upgrade 'nodedev-list' to add an extra 'assigned to' column
This is the more straightforward way of exposing the info. A simple 'nodedev-list'
call can retrieve which domain is using which nodedev. To preserve the existing
usage we can add an "--show-assigned-domains" option to control whether we
will display this info.
2 - add an '<assigned_to>' element in nodedev XML definition
I'm not a fan of exposing this in this particular XML because we would mix
host/hw related attributes with domain info. But it would be easier to pull
this off comparing to (1), so I'm mentioning it for the record.
I would start by exposing the info for HOSTDEV_SUBSYS_TYPE_PCI hostdevs
(--cap pci in nodedev-list).
Thanks,
DHB
4 years, 5 months
[libvirt PATCH v2 00/16] docs: add manpages for all the modular daemons
by Daniel P. Berrangé
Most of the modular daemon stuff has been done from a single template,
but for the man pages that is more trouble than it is worth, so we
create a separate man page source for each daemon, which makes it easy
to extend with driver specific information.
Changed in v2:
- BHyve man page has had references to systemd removed.
Daniel P. Berrangé (16):
docs: consistently mark libvirtd as preformatted text
docs: don't hardcode an ancient version in manpage examples
docs: tweak heading for daemon manual pages
docs: add manpage for virtproxyd
docs: add manpage for virtbhyved
docs: add manpage for virtinterfaced
docs: add manpage for virtlxcd
docs: add manpage for virtnetworkd
docs: add manpage for virtnodedevd
docs: add manpage for virtnwfilterd
docs: add manpage for virtqemud
docs: add manpage for virtsecretd
docs: add manpage for virtstoraged
docs: add manpage for virtvboxd
docs: add manpage for virtvzd
docs: add manpage for virtxend
docs/manpages/index.rst | 25 ++-
docs/manpages/libvirtd.rst | 50 +++---
docs/manpages/meson.build | 14 ++
docs/manpages/virtbhyved.rst | 193 +++++++++++++++++++++++
docs/manpages/virtinterfaced.rst | 215 ++++++++++++++++++++++++++
docs/manpages/virtlockd.rst | 2 +-
docs/manpages/virtlogd.rst | 2 +-
docs/manpages/virtlxcd.rst | 215 ++++++++++++++++++++++++++
docs/manpages/virtnetworkd.rst | 215 ++++++++++++++++++++++++++
docs/manpages/virtnodedevd.rst | 214 ++++++++++++++++++++++++++
docs/manpages/virtnwfilterd.rst | 215 ++++++++++++++++++++++++++
docs/manpages/virtproxyd.rst | 256 +++++++++++++++++++++++++++++++
docs/manpages/virtqemud.rst | 215 ++++++++++++++++++++++++++
docs/manpages/virtsecretd.rst | 214 ++++++++++++++++++++++++++
docs/manpages/virtstoraged.rst | 215 ++++++++++++++++++++++++++
docs/manpages/virtvboxd.rst | 213 +++++++++++++++++++++++++
docs/manpages/virtvzd.rst | 215 ++++++++++++++++++++++++++
docs/manpages/virtxend.rst | 215 ++++++++++++++++++++++++++
18 files changed, 2874 insertions(+), 29 deletions(-)
create mode 100644 docs/manpages/virtbhyved.rst
create mode 100644 docs/manpages/virtinterfaced.rst
create mode 100644 docs/manpages/virtlxcd.rst
create mode 100644 docs/manpages/virtnetworkd.rst
create mode 100644 docs/manpages/virtnodedevd.rst
create mode 100644 docs/manpages/virtnwfilterd.rst
create mode 100644 docs/manpages/virtproxyd.rst
create mode 100644 docs/manpages/virtqemud.rst
create mode 100644 docs/manpages/virtsecretd.rst
create mode 100644 docs/manpages/virtstoraged.rst
create mode 100644 docs/manpages/virtvboxd.rst
create mode 100644 docs/manpages/virtvzd.rst
create mode 100644 docs/manpages/virtxend.rst
--
2.29.2
4 years, 5 months
[libvirt PATCH v2] qemuDomainChangeNet: Check changed virtio network driver options
by Tim Wiederhake
Changes to a virtio network device such as
<interface type="network">
<model type="virtio"/>
<driver iommu="on" ats="on"/> <!-- this line added -->
...
</interface>
were quietly dismissed by `virsh update-device ... --live`.
Signed-off-by: Tim Wiederhake <twiederh(a)redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/qemu/qemu_hotplug.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 57635cd419..6371d53871 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3600,6 +3600,16 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
goto cleanup;
}
+ if (!!olddev->virtio != !!newdev->virtio ||
+ (olddev->virtio && newdev->virtio &&
+ (olddev->virtio->iommu != newdev->virtio->iommu ||
+ olddev->virtio->ats != newdev->virtio->ats ||
+ olddev->virtio->packed != newdev->virtio->packed))) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("cannot modify virtio network device driver options"));
+ goto cleanup;
+ }
+
/* data: this union will be examined later, after allocating new actualdev */
/* virtPortProfile: will be examined later, after allocating new actualdev */
--
2.26.2
4 years, 5 months
[PATCH 0/3] schemas: Allow <filesystem/> to have interleaved children
by Michal Privoznik
Tested with the following change:
diff --git a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml
index f6bb663e97..875e2316a0 100644
--- a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml
+++ b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml
@@ -27,13 +27,13 @@
<controller type='usb' index='0' model='none'/>
<controller type='pci' index='0' model='pci-root'/>
<filesystem type='mount' accessmode='passthrough'>
- <driver type='virtiofs' queue='1024'/>
+ <target dir='mount_tag'/>
+ <source dir='/path'/>
<binary path='/usr/libexec/virtiofsd' xattr='on'>
<cache mode='always'/>
<lock posix='off' flock='off'/>
</binary>
- <source dir='/path'/>
- <target dir='mount_tag'/>
+ <driver type='virtiofs' queue='1024'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</filesystem>
<input type='mouse' bus='ps2'/>
Michal Prívozník (3):
schemas: Allow fsDriver to be interleaved
schemas: Allow interleaving of fsBinary children
schemas: Allow direct children of <filesystem/> to be interleaved
docs/schemas/domaincommon.rng | 400 +++++++++++++++++-----------------
1 file changed, 202 insertions(+), 198 deletions(-)
--
2.26.2
4 years, 5 months