Devel
Threads by month
- ----- 2026 -----
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
June 2023
- 40 participants
- 90 discussions
Adds the following to Network Object:
- <metadata>, <title> and <description> to the Network Schema.
- Get and Set APIs to access or modify the above.
- An async callback that notifies of metadata changes.
Resolves (GSoC 2023): https://wiki.libvirt.org/Google_Summer_of_Code_Ideas.html
Signed-off-by: K Shiva <shiva_kr(a)riseup.net>
---
This is a v2 of:
https://listman.redhat.com/archives/libvir-list/2023-June/240299.html
Changes from v1:
- Corrected names in comments
include/libvirt/libvirt-domain.h | 2 +-
include/libvirt/libvirt-network.h | 51 ++++
include/libvirt/virterror.h | 2 +
po/POTFILES | 1 +
src/conf/network_conf.c | 3 +
src/conf/network_conf.h | 2 +
src/conf/network_event.c | 115 +++++++++
src/conf/network_event.h | 11 +
src/conf/virnetworkobj.c | 347 ++++++++++++++++++++++++++--
src/conf/virnetworkobj.h | 56 +++++
src/driver-network.h | 16 ++
src/libvirt-network.c | 167 +++++++++++++
src/libvirt_public.syms | 6 +
src/remote/remote_daemon_dispatch.c | 39 ++++
src/remote/remote_driver.c | 32 +++
src/remote/remote_protocol.x | 15 +-
src/remote_protocol-structs | 6 +
src/test/test_driver.c | 74 ++++++
src/util/virerror.c | 3 +
tests/meson.build | 1 +
tests/networkmetadatatest.c | 297 ++++++++++++++++++++++++
tools/virsh-network.c | 78 ++++++-
22 files changed, 1299 insertions(+), 25 deletions(-)
create mode 100644 tests/networkmetadatatest.c
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index a1902546bb..ea36805aa3 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -5184,7 +5184,7 @@ typedef void (*virConnectDomainEventDeviceRemovalFailedCallback)(virConnectPtr c
* virConnectDomainEventMetadataChangeCallback:
* @conn: connection object
* @dom: domain on which the event occurred
- * @type: a value from virDomainMetadataTypea
+ * @type: a value from virDomainMetadataType
* @nsuri: XML namespace URI
* @opaque: application specified data
*
diff --git a/include/libvirt/libvirt-network.h b/include/libvirt/libvirt-network.h
index 90cde0cf24..e5d25d699b 100644
--- a/include/libvirt/libvirt-network.h
+++ b/include/libvirt/libvirt-network.h
@@ -330,6 +330,7 @@ typedef void (*virConnectNetworkEventLifecycleCallback)(virConnectPtr conn,
*/
typedef enum {
VIR_NETWORK_EVENT_ID_LIFECYCLE = 0, /* virConnectNetworkEventLifecycleCallback (Since: 1.2.1) */
+ VIR_NETWORK_EVENT_ID_METADATA_CHANGE = 1, /* virConnectNetworkEventMetadataChangeCallback (Since: 9.5.0) */
# ifdef VIR_ENUM_SENTINELS
VIR_NETWORK_EVENT_ID_LAST
@@ -547,4 +548,54 @@ virNetworkPortFree(virNetworkPortPtr port);
int
virNetworkPortRef(virNetworkPortPtr port);
+/**
+ * virNetworkMetadataType:
+ *
+ * Since: 9.5.0
+ */
+typedef enum {
+ VIR_NETWORK_METADATA_DESCRIPTION = 0, /* Operate on <description> (Since: 9.5.0) */
+ VIR_NETWORK_METADATA_TITLE = 1, /* Operate on <title> (Since: 9.5.0) */
+ VIR_NETWORK_METADATA_ELEMENT = 2, /* Operate on <metadata> (Since: 9.5.0) */
+
+# ifdef VIR_ENUM_SENTINELS
+ VIR_NETWORK_METADATA_LAST /* (Since: 9.5.0) */
+# endif
+} virNetworkMetadataType;
+
+int
+virNetworkSetMetadata(virNetworkPtr network,
+ int type,
+ const char *metadata,
+ const char *key,
+ const char *uri,
+ unsigned int flags);
+
+char *
+virNetworkGetMetadata(virNetworkPtr network,
+ int type,
+ const char *uri,
+ unsigned int flags);
+
+/**
+ * virConnectNetworkEventMetadataChangeCallback:
+ * @conn: connection object
+ * @net: network on which the event occurred
+ * @type: a value from virNetworkMetadataType
+ * @nsuri: XML namespace URI
+ * @opaque: application specified data
+ *
+ * This callback is triggered when the network XML metadata is changed
+ *
+ * The callback signature to use when registering for an event of type
+ * VIR_NETWORK_EVENT_ID_METADATA_CHANGE with virConnectNetworkEventRegisterAny().
+ *
+ * Since: 9.5.0
+ */
+typedef void (*virConnectNetworkEventMetadataChangeCallback)(virConnectPtr conn,
+ virNetworkPtr net,
+ int type,
+ const char *nsuri,
+ void *opaque);
+
#endif /* LIBVIRT_NETWORK_H */
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h
index df13e4f11e..2910ff03da 100644
--- a/include/libvirt/virterror.h
+++ b/include/libvirt/virterror.h
@@ -348,6 +348,8 @@ typedef enum {
VIR_ERR_NO_HOSTNAME = 108, /* no domain's hostname found (Since: 6.1.0) */
VIR_ERR_CHECKPOINT_INCONSISTENT = 109, /* checkpoint can't be used (Since: 6.10.0) */
VIR_ERR_MULTIPLE_DOMAINS = 110, /* more than one matching domain found (Since: 7.1.0) */
+ VIR_ERR_NO_NETWORK_METADATA = 111, /* Network metadata is not present (Since: 9.5.0) */
+
# ifdef VIR_ENUM_SENTINELS
VIR_ERR_NUMBER_LAST /* (Since: 5.0.0) */
diff --git a/po/POTFILES b/po/POTFILES
index 5d6ec195b4..933a2e07a4 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -39,6 +39,7 @@ src/conf/netdev_bandwidth_conf.c
src/conf/netdev_vlan_conf.c
src/conf/netdev_vport_profile_conf.c
src/conf/network_conf.c
+src/conf/network_event.c
src/conf/networkcommon_conf.c
src/conf/node_device_conf.c
src/conf/node_device_util.c
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 73788b6d87..84952db041 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -2546,6 +2546,9 @@ virNetworkSaveXML(const char *configDir,
char uuidstr[VIR_UUID_STRING_BUFLEN];
g_autofree char *configFile = NULL;
+ if (!configDir)
+ return 0;
+
if ((configFile = virNetworkConfigFile(configDir, def->name)) == NULL)
return -1;
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index 2b2e9d15f0..5a1bdb1284 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -249,6 +249,8 @@ struct _virNetworkDef {
unsigned char uuid[VIR_UUID_BUFLEN];
bool uuid_specified;
char *name;
+ char *title;
+ char *description;
int connections; /* # of guest interfaces connected to this network */
char *bridge; /* Name of bridge device */
diff --git a/src/conf/network_event.c b/src/conf/network_event.c
index 6f25e43711..0e12cc2687 100644
--- a/src/conf/network_event.c
+++ b/src/conf/network_event.c
@@ -26,6 +26,9 @@
#include "object_event_private.h"
#include "datatypes.h"
#include "virlog.h"
+#include "virerror.h"
+
+#define VIR_FROM_THIS VIR_FROM_NETWORK
VIR_LOG_INIT("conf.network_event");
@@ -45,10 +48,21 @@ struct _virNetworkEventLifecycle {
};
typedef struct _virNetworkEventLifecycle virNetworkEventLifecycle;
+struct _virNetworkEventMetadataChange {
+ virNetworkEvent parent;
+
+ int type;
+ char *nsuri;
+};
+typedef struct _virNetworkEventMetadataChange virNetworkEventMetadataChange;
+
static virClass *virNetworkEventClass;
static virClass *virNetworkEventLifecycleClass;
+static virClass *virNetworkEventMetadataChangeClass;
+
static void virNetworkEventDispose(void *obj);
static void virNetworkEventLifecycleDispose(void *obj);
+static void virNetworkEventMetadataChangeDispose(void *obj);
static int
virNetworkEventsOnceInit(void)
@@ -59,6 +73,9 @@ virNetworkEventsOnceInit(void)
if (!VIR_CLASS_NEW(virNetworkEventLifecycle, virNetworkEventClass))
return -1;
+ if (!VIR_CLASS_NEW(virNetworkEventMetadataChange, virNetworkEventClass))
+ return -1;
+
return 0;
}
@@ -104,9 +121,22 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
return;
}
+ case VIR_NETWORK_EVENT_ID_METADATA_CHANGE:
+ {
+ virNetworkEventMetadataChange *metadataChangeEvent;
+
+ metadataChangeEvent = (virNetworkEventMetadataChange *)event;
+ ((virConnectNetworkEventMetadataChangeCallback)cb)(conn, net,
+ metadataChangeEvent->type,
+ metadataChangeEvent->nsuri,
+ cbopaque);
+ return;
+ }
+
case VIR_NETWORK_EVENT_ID_LAST:
break;
}
+
VIR_WARN("Unexpected event ID %d", event->eventID);
}
@@ -231,3 +261,88 @@ virNetworkEventLifecycleNew(const char *name,
return (virObjectEvent *)event;
}
+
+
+static void *
+virNetworkEventNew(virClass *klass,
+ int eventID,
+ const char *name,
+ const unsigned char *uuid)
+{
+ virNetworkEvent *event;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ if (virNetworkEventsInitialize() < 0)
+ return NULL;
+
+ if (!virClassIsDerivedFrom(klass, virNetworkEventClass)) {
+ virReportInvalidArg(klass,
+ _("Class %1$s must derive from virNetworkEvent"),
+ virClassName(klass));
+ return NULL;
+ }
+
+ /* We use uuid for matching key. We ignore 'name' because
+ * Xen sometimes renames guests during migration, thus
+ * 'uuid' is the only truly reliable key we can use. */
+ virUUIDFormat(uuid, uuidstr);
+ if (!(event = virObjectEventNew(klass,
+ virNetworkEventDispatchDefaultFunc,
+ eventID,
+ 0, name, uuid, uuidstr)))
+ return NULL;
+
+ return (virObjectEvent *)event;
+}
+
+
+static void
+virNetworkEventMetadataChangeDispose(void *obj)
+{
+ virNetworkEventMetadataChange *event = obj;
+ VIR_DEBUG("obj=%p", event);
+
+ g_free(event->nsuri);
+}
+
+
+static virObjectEvent *
+virNetworkEventMetadataChangeNew(const char *name,
+ unsigned char *uuid,
+ int type,
+ const char *nsuri)
+{
+ virNetworkEventMetadataChange *ev;
+
+ if (virNetworkEventsInitialize() < 0)
+ return NULL;
+
+ if (!(ev = virNetworkEventNew(virNetworkEventMetadataChangeClass,
+ VIR_NETWORK_EVENT_ID_METADATA_CHANGE,
+ name, uuid)))
+ return NULL;
+
+ ev->type = type;
+ if (nsuri)
+ ev->nsuri = g_strdup(nsuri);
+
+ return (virObjectEvent *)ev;
+}
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromObj(virNetworkObj *obj,
+ int type,
+ const char *nsuri)
+{
+ return virNetworkEventMetadataChangeNew(obj->def->name,
+ obj->def->uuid, type, nsuri);
+}
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromNet(virNetworkPtr net,
+ int type,
+ const char *nsuri)
+{
+ return virNetworkEventMetadataChangeNew(net->name, net->uuid,
+ type, nsuri);
+}
diff --git a/src/conf/network_event.h b/src/conf/network_event.h
index 4502bfcaef..7c98a6ac92 100644
--- a/src/conf/network_event.h
+++ b/src/conf/network_event.h
@@ -23,6 +23,7 @@
#include "internal.h"
#include "object_event.h"
+#include "virnetworkobj.h"
int
virNetworkEventStateRegisterID(virConnectPtr conn,
@@ -53,3 +54,13 @@ virNetworkEventLifecycleNew(const char *name,
const unsigned char *uuid,
int type,
int detail);
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromObj(virNetworkObj *obj,
+ int type,
+ const char *nsuri);
+
+virObjectEvent *
+virNetworkEventMetadataChangeNewFromNet(virNetworkPtr net,
+ int type,
+ const char *nsuri);
diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c
index b8b86da06f..82f90937bc 100644
--- a/src/conf/virnetworkobj.c
+++ b/src/conf/virnetworkobj.c
@@ -39,28 +39,6 @@ VIR_LOG_INIT("conf.virnetworkobj");
* that big. */
#define INIT_CLASS_ID_BITMAP_SIZE (1<<4)
-struct _virNetworkObj {
- virObjectLockable parent;
-
- pid_t dnsmasqPid;
- bool active;
- bool autostart;
- bool persistent;
-
- virNetworkDef *def; /* The current definition */
- virNetworkDef *newDef; /* New definition to activate at shutdown */
-
- virBitmap *classIdMap; /* bitmap of class IDs for QoS */
- unsigned long long floor_sum; /* sum of all 'floor'-s of attached NICs */
-
- unsigned int taint;
-
- /* Immutable pointer, self locking APIs */
- virMacMap *macmap;
-
- GHashTable *ports; /* uuid -> virNetworkPortDef **/
-};
-
struct _virNetworkObjList {
virObjectRWLockable parent;
@@ -1822,3 +1800,328 @@ virNetworkObjLoadAllPorts(virNetworkObj *net,
return 0;
}
+
+
+/**
+ * virNetworkObjUpdateModificationImpact:
+ *
+ * @net: network object
+ * @flags: flags to update the modification impact on
+ *
+ * Resolves virNetworkUpdateFlags in @flags so that they correctly
+ * apply to the actual state of @net. @flags may be modified after call to this
+ * function.
+ *
+ * Returns 0 on success if @flags point to a valid combination for @net or -1 on
+ * error.
+ */
+int
+virNetworkObjUpdateModificationImpact(virNetworkObj *net,
+ unsigned int *flags)
+{
+ bool isActive = virNetworkObjIsActive(net);
+
+ if ((*flags & (VIR_NETWORK_UPDATE_AFFECT_LIVE | VIR_NETWORK_UPDATE_AFFECT_CONFIG)) ==
+ VIR_NETWORK_UPDATE_AFFECT_CURRENT) {
+ if (isActive)
+ *flags |= VIR_NETWORK_UPDATE_AFFECT_LIVE;
+ else
+ *flags |= VIR_NETWORK_UPDATE_AFFECT_CONFIG;
+ }
+
+ if (!isActive && (*flags & VIR_NETWORK_UPDATE_AFFECT_LIVE)) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("network is not running"));
+ return -1;
+ }
+
+ if (!net->persistent && (*flags & VIR_NETWORK_UPDATE_AFFECT_CONFIG)) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("transient networks do not have any "
+ "persistent config"));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/**
+ * virNetworkObjGetDefs:
+ *
+ * @net: network object
+ * @flags: for virNetworkUpdateFlags
+ * @liveDef: Set the pointer to the live definition of @net.
+ * @persDef: Set the pointer to the config definition of @net.
+ *
+ * Helper function to resolve @flags and retrieve correct network pointer
+ * objects. This function should be used only when the network driver
+ * creates net->newDef once the network has started.
+ *
+ * If @liveDef or @persDef are set it implies that @flags request modification
+ * thereof.
+ *
+ * Returns 0 on success and sets @liveDef and @persDef; -1 if @flags are
+ * inappropriate.
+ */
+int
+virNetworkObjGetDefs(virNetworkObj *net,
+ unsigned int flags,
+ virNetworkDef **liveDef,
+ virNetworkDef **persDef)
+{
+ if (liveDef)
+ *liveDef = NULL;
+
+ if (persDef)
+ *persDef = NULL;
+
+ if (virNetworkObjUpdateModificationImpact(net, &flags) < 0)
+ return -1;
+
+ if (virNetworkObjIsActive(net)) {
+ if (liveDef && (flags & VIR_NETWORK_UPDATE_AFFECT_LIVE))
+ *liveDef = net->def;
+
+ if (persDef && (flags & VIR_NETWORK_UPDATE_AFFECT_CONFIG))
+ *persDef = net->newDef;
+ } else {
+ if (persDef)
+ *persDef = net->def;
+ }
+
+ return 0;
+}
+
+
+/**
+ * virNetworkObjGetOneDefState:
+ *
+ * @net: Network object
+ * @flags: for virNetworkUpdateFlags
+ * @live: set to true if live config was returned (may be omitted)
+ *
+ * Helper function to resolve @flags and return the correct network pointer
+ * object. This function returns one of @net->def or @net->persistentDef
+ * according to @flags. @live is set to true if the live net config will be
+ * returned. This helper should be used only in APIs that guarantee
+ * that @flags contains exactly one of VIR_NETWORK_UPDATE_AFFECT_LIVE or
+ * VIR_NETWORK_UPDATE_AFFECT_CONFIG and not both.
+ *
+ * Returns the correct definition pointer or NULL on error.
+ */
+virNetworkDef *
+virNetworkObjGetOneDefState(virNetworkObj *net,
+ unsigned int flags,
+ bool *live)
+{
+ if (flags & VIR_NETWORK_UPDATE_AFFECT_LIVE &&
+ flags & VIR_NETWORK_UPDATE_AFFECT_CONFIG) {
+ virReportInvalidArg(flags, "%s",
+ _("Flags 'VIR_NETWORK_UPDATE_AFFECT_LIVE' and "
+ "'VIR_NETWORK_UPDATE_AFFECT_CONFIG' are mutually "
+ "exclusive"));
+ return NULL;
+ }
+
+ if (virNetworkObjUpdateModificationImpact(net, &flags) < 0)
+ return NULL;
+
+ if (live)
+ *live = flags & VIR_NETWORK_UPDATE_AFFECT_LIVE;
+
+ if (virNetworkObjIsActive(net) && flags & VIR_NETWORK_UPDATE_AFFECT_CONFIG)
+ return net->newDef;
+
+ return net->def;
+}
+
+
+/**
+ * virNetworkObjGetOneDef:
+ *
+ * @net: Network object
+ * @flags: for virNetworkUpdateFlags
+ *
+ * Helper function to resolve @flags and return the correct network pointer
+ * object. This function returns one of @net->def or @net->persistentDef
+ * according to @flags. This helper should be used only in APIs that guarantee
+ * that @flags contains exactly one of VIR_NETWORK_UPDATE_AFFECT_LIVE or
+ * VIR_NETWORK_UPDATE_AFFECT_CONFIG and not both.
+ *
+ * Returns the correct definition pointer or NULL on error.
+ */
+virNetworkDef *
+virNetworkObjGetOneDef(virNetworkObj *net,
+ unsigned int flags)
+{
+ return virNetworkObjGetOneDefState(net, flags, NULL);
+}
+
+
+char *
+virNetworkObjGetMetadata(virNetworkObj *net,
+ int type,
+ const char *uri,
+ unsigned int flags)
+{
+ virNetworkDef *def;
+ char *ret = NULL;
+
+ virCheckFlags(VIR_NETWORK_UPDATE_AFFECT_LIVE |
+ VIR_NETWORK_UPDATE_AFFECT_CONFIG, NULL);
+
+ if (type >= VIR_NETWORK_METADATA_LAST) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("unknown metadata type '%1$d'"), type);
+ return NULL;
+ }
+
+ if (!(def = virNetworkObjGetOneDef(net, flags)))
+ return NULL;
+
+ switch ((virNetworkMetadataType) type) {
+ case VIR_NETWORK_METADATA_DESCRIPTION:
+ ret = g_strdup(def->description);
+ break;
+
+ case VIR_NETWORK_METADATA_TITLE:
+ ret = g_strdup(def->title);
+ break;
+
+ case VIR_NETWORK_METADATA_ELEMENT:
+ if (!def->metadata)
+ break;
+
+ if (virXMLExtractNamespaceXML(def->metadata, uri, &ret) < 0)
+ return NULL;
+ break;
+
+ case VIR_NETWORK_METADATA_LAST:
+ break;
+ }
+
+ if (!ret)
+ virReportError(VIR_ERR_NO_NETWORK_METADATA, "%s",
+ _("Requested metadata element is not present"));
+
+ return ret;
+}
+
+
+static int
+virNetworkDefSetMetadata(virNetworkDef *def,
+ int type,
+ const char *metadata,
+ const char *key,
+ const char *uri)
+{
+ g_autoptr(xmlDoc) doc = NULL;
+ xmlNodePtr old;
+ g_autoptr(xmlNode) new = NULL;
+
+ if (type >= VIR_NETWORK_METADATA_LAST) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("unknown metadata type '%1$d'"), type);
+ return -1;
+ }
+
+ switch ((virNetworkMetadataType) type) {
+ case VIR_NETWORK_METADATA_DESCRIPTION:
+ g_clear_pointer(&def->description, g_free);
+
+ if (STRNEQ_NULLABLE(metadata, ""))
+ def->description = g_strdup(metadata);
+ break;
+
+ case VIR_NETWORK_METADATA_TITLE:
+ g_clear_pointer(&def->title, g_free);
+
+ if (STRNEQ_NULLABLE(metadata, ""))
+ def->title = g_strdup(metadata);
+ break;
+
+ case VIR_NETWORK_METADATA_ELEMENT:
+ if (metadata) {
+
+ /* parse and modify the xml from the user */
+ if (!(doc = virXMLParseStringCtxt(metadata, _("(metadata_xml)"), NULL)))
+ return -1;
+
+ if (virXMLInjectNamespace(doc->children, uri, key) < 0)
+ return -1;
+
+ /* create the root node if needed */
+ if (!def->metadata)
+ def->metadata = virXMLNewNode(NULL, "metadata");
+
+ if (!(new = xmlCopyNode(doc->children, 1))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Failed to copy XML node"));
+ return -1;
+ }
+ }
+
+ /* remove possible other nodes sharing the namespace */
+ while ((old = virXMLFindChildNodeByNs(def->metadata, uri))) {
+ xmlUnlinkNode(old);
+ xmlFreeNode(old);
+ }
+
+ if (new) {
+ if (!(xmlAddChild(def->metadata, new))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to add metadata to XML document"));
+ return -1;
+ }
+ new = NULL;
+ }
+ break;
+
+ case VIR_NETWORK_METADATA_LAST:
+ break;
+ }
+
+ return 0;
+}
+
+
+int
+virNetworkObjSetMetadata(virNetworkObj *net,
+ int type,
+ const char *metadata,
+ const char *key,
+ const char *uri,
+ virNetworkXMLOption *xmlopt,
+ const char *stateDir,
+ const char *configDir,
+ unsigned int flags)
+{
+ virNetworkDef *def;
+ virNetworkDef *persistentDef;
+
+ virCheckFlags(VIR_NETWORK_UPDATE_AFFECT_LIVE |
+ VIR_NETWORK_UPDATE_AFFECT_CONFIG, -1);
+
+ if (virNetworkObjGetDefs(net, flags, &def, &persistentDef) < 0)
+ return -1;
+
+ if (def) {
+ if (virNetworkDefSetMetadata(def, type, metadata, key, uri) < 0)
+ return -1;
+
+ if (virNetworkObjSaveStatus(stateDir, net, xmlopt) < 0)
+ return -1;
+ }
+
+ if (persistentDef) {
+ if (virNetworkDefSetMetadata(persistentDef, type, metadata, key,
+ uri) < 0)
+ return -1;
+
+ if (virNetworkSaveConfig(configDir, persistentDef, xmlopt) < 0)
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/conf/virnetworkobj.h b/src/conf/virnetworkobj.h
index 7d34fa3204..d17a43d7bb 100644
--- a/src/conf/virnetworkobj.h
+++ b/src/conf/virnetworkobj.h
@@ -26,6 +26,28 @@
typedef struct _virNetworkObj virNetworkObj;
+struct _virNetworkObj {
+ virObjectLockable parent;
+
+ pid_t dnsmasqPid;
+ bool active;
+ bool autostart;
+ bool persistent;
+
+ virNetworkDef *def; /* The current definition */
+ virNetworkDef *newDef; /* New definition to activate at shutdown */
+
+ virBitmap *classIdMap; /* bitmap of class IDs for QoS */
+ unsigned long long floor_sum; /* sum of all 'floor'-s of attached NICs */
+
+ unsigned int taint;
+
+ /* Immutable pointer, self locking APIs */
+ virMacMap *macmap;
+
+ GHashTable *ports; /* uuid -> virNetworkPortDef **/
+};
+
virNetworkObj *
virNetworkObjNew(void);
@@ -258,3 +280,37 @@ virNetworkObjListNumOfNetworks(virNetworkObjList *nets,
void
virNetworkObjListPrune(virNetworkObjList *nets,
unsigned int flags);
+
+int virNetworkObjUpdateModificationImpact(virNetworkObj *net,
+ unsigned int *flags);
+
+int
+virNetworkObjGetDefs(virNetworkObj *net,
+ unsigned int flags,
+ virNetworkDef **liveDef,
+ virNetworkDef **persDef);
+
+virNetworkDef *
+virNetworkObjGetOneDefState(virNetworkObj *net,
+ unsigned int flags,
+ bool *state);
+virNetworkDef *
+virNetworkObjGetOneDef(virNetworkObj *net,
+ unsigned int flags);
+
+char *
+virNetworkObjGetMetadata(virNetworkObj *network,
+ int type,
+ const char *uri,
+ unsigned int flags);
+
+int
+virNetworkObjSetMetadata(virNetworkObj *network,
+ int type,
+ const char *metadata,
+ const char *key,
+ const char *uri,
+ virNetworkXMLOption *xmlopt,
+ const char *stateDir,
+ const char *configDir,
+ unsigned int flags);
diff --git a/src/driver-network.h b/src/driver-network.h
index 99efd4c8aa..1d19b013c9 100644
--- a/src/driver-network.h
+++ b/src/driver-network.h
@@ -161,6 +161,20 @@ typedef int
virNetworkPortPtr **ports,
unsigned int flags);
+typedef int
+(*virDrvNetworkSetMetadata)(virNetworkPtr network,
+ int type,
+ const char *metadata,
+ const char *key,
+ const char *uri,
+ unsigned int flags);
+
+typedef char *
+(*virDrvNetworkGetMetadata)(virNetworkPtr network,
+ int type,
+ const char *uri,
+ unsigned int flags);
+
typedef struct _virNetworkDriver virNetworkDriver;
/**
@@ -202,4 +216,6 @@ struct _virNetworkDriver {
virDrvNetworkPortGetParameters networkPortGetParameters;
virDrvNetworkPortDelete networkPortDelete;
virDrvNetworkListAllPorts networkListAllPorts;
+ virDrvNetworkSetMetadata networkSetMetadata;
+ virDrvNetworkGetMetadata networkGetMetadata;
};
diff --git a/src/libvirt-network.c b/src/libvirt-network.c
index 236dfe2f5d..c0c66bb2fa 100644
--- a/src/libvirt-network.c
+++ b/src/libvirt-network.c
@@ -1915,3 +1915,170 @@ virNetworkPortRef(virNetworkPortPtr port)
virObjectRef(port);
return 0;
}
+
+
+/**
+ * virNetworkSetMetadata:
+ * @network: a network object
+ * @type: type of metadata, from virNetworkMetadataType
+ * @metadata: new metadata text
+ * @key: XML namespace key, or NULL
+ * @uri: XML namespace URI, or NULL
+ * @flags: bitwise-OR of virNetworkUpdateFlags
+ *
+ * Sets the appropriate network element given by @type to the
+ * value of @metadata. A @type of VIR_NETWORK_METADATA_DESCRIPTION
+ * is free-form text; VIR_NETWORK_METADATA_TITLE is free-form, but no
+ * newlines are permitted, and should be short (although the length is
+ * not enforced). For these two options @key and @uri are irrelevant and
+ * must be set to NULL.
+ *
+ * For type VIR_NETWORK_METADATA_ELEMENT @metadata must be well-formed
+ * XML belonging to namespace defined by @uri with local name @key.
+ *
+ * Passing NULL for @metadata says to remove that element from the
+ * network XML (passing the empty string leaves the element present).
+ *
+ * The resulting metadata will be present in virNetworkGetXMLDesc(),
+ * as well as quick access through virNetworkGetMetadata().
+ *
+ * @flags controls whether the live network state, persistent configuration,
+ * or both will be modified.
+ *
+ * Returns 0 on success, -1 in case of failure.
+ *
+ * Since: 9.5.0
+ */
+int
+virNetworkSetMetadata(virNetworkPtr network,
+ int type,
+ const char *metadata,
+ const char *key,
+ const char *uri,
+ unsigned int flags)
+{
+ virConnectPtr conn;
+
+ VIR_DEBUG("network=%p, type=%d, metadata='%s', key='%s', uri='%s', flags=0x%x",
+ network, type, NULLSTR(metadata), NULLSTR(key), NULLSTR(uri),
+ flags);
+
+ virResetLastError();
+
+ virCheckNetworkReturn(network, -1);
+ conn = network->conn;
+
+ virCheckReadOnlyGoto(conn->flags, error);
+
+ switch (type) {
+ case VIR_NETWORK_METADATA_TITLE:
+ if (metadata && strchr(metadata, '\n')) {
+ virReportInvalidArg(metadata, "%s",
+ _("metadata title can't contain "
+ "newlines"));
+ goto error;
+ }
+ G_GNUC_FALLTHROUGH;
+ case VIR_NETWORK_METADATA_DESCRIPTION:
+ virCheckNullArgGoto(uri, error);
+ virCheckNullArgGoto(key, error);
+ break;
+ case VIR_NETWORK_METADATA_ELEMENT:
+ virCheckNonNullArgGoto(uri, error);
+ if (metadata)
+ virCheckNonNullArgGoto(key, error);
+ break;
+ default:
+ /* For future expansion */
+ break;
+ }
+
+ if (conn->networkDriver->networkSetMetadata) {
+ int ret;
+ ret = conn->networkDriver->networkSetMetadata(network, type, metadata, key, uri,
+ flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(network->conn);
+ return -1;
+}
+
+
+/**
+ * virNetworkGetMetadata:
+ * @network: a network object
+ * @type: type of metadata, from virNetworkMetadataType
+ * @uri: XML namespace identifier
+ * @flags: bitwise-OR of virNetworkUpdateFlags
+ *
+ * Retrieves the appropriate network element given by @type.
+ * If VIR_NETWORK_METADATA_ELEMENT is requested parameter @uri
+ * must be set to the name of the namespace the requested elements
+ * belong to, otherwise must be NULL.
+ *
+ * If an element of the network XML is not present, the resulting
+ * error will be VIR_ERR_NO_NETWORK_METADATA. This method forms
+ * a shortcut for seeing information from virNetworkSetMetadata()
+ * without having to go through virNetworkGetXMLDesc().
+ *
+ * @flags controls whether the live network state or persistent
+ * configuration will be queried.
+ *
+ * Returns the metadata string on success (caller must free),
+ * or NULL in case of failure.
+ *
+ * Since: 9.5.0
+ */
+char *
+virNetworkGetMetadata(virNetworkPtr network,
+ int type,
+ const char *uri,
+ unsigned int flags)
+{
+ virConnectPtr conn;
+
+ VIR_DEBUG("network=%p, type=%d, uri='%s', flags=0x%x",
+ network, type, NULLSTR(uri), flags);
+
+ virResetLastError();
+
+ virCheckNetworkReturn(network, NULL);
+
+ VIR_EXCLUSIVE_FLAGS_GOTO(VIR_NETWORK_UPDATE_AFFECT_LIVE,
+ VIR_NETWORK_UPDATE_AFFECT_CONFIG,
+ error);
+
+ switch (type) {
+ case VIR_NETWORK_METADATA_TITLE:
+ case VIR_NETWORK_METADATA_DESCRIPTION:
+ virCheckNullArgGoto(uri, error);
+ break;
+ case VIR_NETWORK_METADATA_ELEMENT:
+ virCheckNonNullArgGoto(uri, error);
+ break;
+ default:
+ /* For future expansion */
+ break;
+ }
+
+ conn = network->conn;
+
+ if (conn->networkDriver->networkGetMetadata) {
+ char *ret;
+ if (!(ret = conn->networkDriver->networkGetMetadata(network, type, uri, flags)))
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(network->conn);
+ return NULL;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 80742f268e..d21fe49caa 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -932,4 +932,10 @@ LIBVIRT_9.0.0 {
virDomainFDAssociate;
} LIBVIRT_8.5.0;
+LIBVIRT_9.5.0 {
+ global:
+ virNetworkGetMetadata;
+ virNetworkSetMetadata;
+} LIBVIRT_9.0.0;
+
# .... define new API here using predicted next version number ....
diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c
index 7144e9e7ca..3e5eaec9e6 100644
--- a/src/remote/remote_daemon_dispatch.c
+++ b/src/remote/remote_daemon_dispatch.c
@@ -1420,8 +1420,47 @@ remoteRelayNetworkEventLifecycle(virConnectPtr conn,
return 0;
}
+static int
+remoteRelayNetworkEventMetadataChange(virConnectPtr conn,
+ virNetworkPtr net,
+ int type,
+ const char *nsuri,
+ void *opaque)
+{
+ daemonClientEventCallback *callback = opaque;
+ remote_network_event_callback_metadata_change_msg data;
+
+ if (callback->callbackID < 0 ||
+ !remoteRelayNetworkEventCheckACL(callback->client, conn, net))
+ return -1;
+
+ VIR_DEBUG("Relaying network metadata change %s %d %s, callback %d",
+ net->name, type, NULLSTR(nsuri), callback->callbackID);
+
+ /* build return data */
+ memset(&data, 0, sizeof(data));
+
+ data.type = type;
+ if (nsuri) {
+ data.nsuri = g_new0(remote_nonnull_string, 1);
+ *(data.nsuri) = g_strdup(nsuri);
+ }
+
+ make_nonnull_network(&data.net, net);
+ data.callbackID = callback->callbackID;
+
+ remoteDispatchObjectEventSend(callback->client, callback->program,
+ REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE,
+ (xdrproc_t)xdr_remote_network_event_callback_metadata_change_msg,
+ &data);
+
+ return 0;
+}
+
+
static virConnectNetworkEventGenericCallback networkEventCallbacks[] = {
VIR_NETWORK_EVENT_CALLBACK(remoteRelayNetworkEventLifecycle),
+ VIR_NETWORK_EVENT_CALLBACK(remoteRelayNetworkEventMetadataChange),
};
G_STATIC_ASSERT(G_N_ELEMENTS(networkEventCallbacks) == VIR_NETWORK_EVENT_ID_LAST);
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 65ec239fb7..310f53fe5e 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -378,6 +378,12 @@ remoteNetworkBuildEventLifecycle(virNetClientProgram *prog G_GNUC_UNUSED,
virNetClient *client G_GNUC_UNUSED,
void *evdata, void *opaque);
+static void
+remoteNetworkBuildEventCallbackMetadataChange(virNetClientProgram *prog,
+ virNetClient *client,
+ void *evdata, void *opaque);
+
+
static void
remoteStoragePoolBuildEventLifecycle(virNetClientProgram *prog G_GNUC_UNUSED,
virNetClient *client G_GNUC_UNUSED,
@@ -505,6 +511,10 @@ static virNetClientProgramEvent remoteEvents[] = {
remoteNetworkBuildEventLifecycle,
sizeof(remote_network_event_lifecycle_msg),
(xdrproc_t)xdr_remote_network_event_lifecycle_msg },
+ { REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE,
+ remoteNetworkBuildEventCallbackMetadataChange,
+ sizeof(remote_network_event_callback_metadata_change_msg),
+ (xdrproc_t)xdr_remote_network_event_callback_metadata_change_msg },
{ REMOTE_PROC_DOMAIN_EVENT_CALLBACK_LIFECYCLE,
remoteDomainBuildEventCallbackLifecycle,
sizeof(remote_domain_event_callback_lifecycle_msg),
@@ -4951,6 +4961,28 @@ remoteNetworkBuildEventLifecycle(virNetClientProgram *prog G_GNUC_UNUSED,
virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID);
}
+static void
+remoteNetworkBuildEventCallbackMetadataChange(virNetClientProgram *prog G_GNUC_UNUSED,
+ virNetClient *client G_GNUC_UNUSED,
+ void *evdata, void *opaque)
+{
+ virConnectPtr conn = opaque;
+ remote_network_event_callback_metadata_change_msg *msg = evdata;
+ struct private_data *priv = conn->privateData;
+ virNetworkPtr net;
+ virObjectEvent *event = NULL;
+
+ if (!(net = get_nonnull_network(conn, msg->net)))
+ return;
+
+ event = virNetworkEventMetadataChangeNewFromNet(net, msg->type, msg->nsuri ? *msg->nsuri : NULL);
+
+ virObjectUnref(net);
+
+ virObjectEventStateQueueRemote(priv->eventState, event, msg->callbackID);
+}
+
+
static void
remoteStoragePoolBuildEventLifecycle(virNetClientProgram *prog G_GNUC_UNUSED,
virNetClient *client G_GNUC_UNUSED,
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 5d86a51116..72aa69e580 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3323,6 +3323,13 @@ struct remote_network_event_lifecycle_msg {
int detail;
};
+struct remote_network_event_callback_metadata_change_msg {
+ int callbackID;
+ remote_nonnull_network net;
+ int type;
+ remote_string nsuri;
+};
+
struct remote_connect_storage_pool_event_register_any_args {
int eventID;
remote_storage_pool pool;
@@ -6974,5 +6981,11 @@ enum remote_procedure {
* @generate: none
* @acl: domain:write
*/
- REMOTE_PROC_DOMAIN_FD_ASSOCIATE = 443
+ REMOTE_PROC_DOMAIN_FD_ASSOCIATE = 443,
+
+ /**
+ * @generate: both
+ * @acl: none
+ */
+ REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE = 444
};
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 3c6c230a16..3f7256051e 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -2687,6 +2687,12 @@ struct remote_network_event_lifecycle_msg {
int event;
int detail;
};
+struct remote_network_event_callback_metadata_change_msg {
+ int callbackID;
+ remote_nonnull_network net;
+ int type;
+ remote_string nsuri;
+};
struct remote_connect_storage_pool_event_register_any_args {
int eventID;
remote_storage_pool pool;
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index e7fce053b4..7294766d6e 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -633,6 +633,25 @@ static int testStoragePoolObjSetDefaults(virStoragePoolObj *obj);
static int testNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
static virNetworkObj *testNetworkObjFindByName(testDriver *privconn, const char *name);
+static virNetworkObj *
+testNetworkObjFromNetwork(virNetworkPtr network)
+{
+ virNetworkObj *net;
+ testDriver *driver = network->conn->privateData;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ net = virNetworkObjFindByUUID(driver->networks, network->uuid);
+ if (!net) {
+ virUUIDFormat(network->uuid, uuidstr);
+ virReportError(VIR_ERR_NO_NETWORK,
+ _("no network with matching uuid '%1$s' (%2$s)"),
+ uuidstr, network->name);
+ }
+
+ return net;
+}
+
+
static virDomainObj *
testDomObjFromDomain(virDomainPtr domain)
{
@@ -9948,6 +9967,59 @@ testConnectGetAllDomainStats(virConnectPtr conn,
return ret;
}
+static char *
+testNetworkGetMetadata(virNetworkPtr net,
+ int type,
+ const char *uri,
+ unsigned int flags)
+{
+ virNetworkObj *privnet;
+ char *ret;
+
+ virCheckFlags(VIR_NETWORK_UPDATE_AFFECT_LIVE |
+ VIR_NETWORK_UPDATE_AFFECT_CONFIG, NULL);
+
+ if (!(privnet = testNetworkObjFromNetwork(net)))
+ return NULL;
+
+ ret = virNetworkObjGetMetadata(privnet, type, uri, flags);
+
+ virNetworkObjEndAPI(&privnet);
+ return ret;
+}
+
+static int
+testNetworkSetMetadata(virNetworkPtr net,
+ int type,
+ const char *metadata,
+ const char *key,
+ const char *uri,
+ unsigned int flags)
+{
+ testDriver *privconn = net->conn->privateData;
+ virNetworkObj *privnet;
+ int ret;
+
+ virCheckFlags(VIR_NETWORK_UPDATE_AFFECT_LIVE |
+ VIR_NETWORK_UPDATE_AFFECT_CONFIG, -1);
+
+ if (!(privnet = testNetworkObjFromNetwork(net)))
+ return -1;
+
+ ret = virNetworkObjSetMetadata(privnet, type, metadata,
+ key, uri, NULL,
+ NULL, NULL, flags);
+
+ if (ret == 0) {
+ virObjectEvent *ev = NULL;
+ ev = virNetworkEventMetadataChangeNewFromObj(privnet, type, uri);
+ virObjectEventStateQueue(privconn->eventState, ev);
+ }
+
+ virNetworkObjEndAPI(&privnet);
+ return ret;
+}
+
/*
* Test driver
*/
@@ -10141,6 +10213,8 @@ static virNetworkDriver testNetworkDriver = {
.networkSetAutostart = testNetworkSetAutostart, /* 0.3.2 */
.networkIsActive = testNetworkIsActive, /* 0.7.3 */
.networkIsPersistent = testNetworkIsPersistent, /* 0.7.3 */
+ .networkSetMetadata = testNetworkSetMetadata, /* 9.5.0 */
+ .networkGetMetadata = testNetworkGetMetadata, /* 9.5.0 */
};
static virInterfaceDriver testInterfaceDriver = {
diff --git a/src/util/virerror.c b/src/util/virerror.c
index 453f19514e..227a182417 100644
--- a/src/util/virerror.c
+++ b/src/util/virerror.c
@@ -1287,6 +1287,9 @@ static const virErrorMsgTuple virErrorMsgStrings[] = {
[VIR_ERR_MULTIPLE_DOMAINS] = {
N_("multiple matching domains found"),
N_("multiple matching domains found: %1$s") },
+ [VIR_ERR_NO_NETWORK_METADATA] = {
+ N_("metadata not found"),
+ N_("metadata not found: %1$s") },
};
G_STATIC_ASSERT(G_N_ELEMENTS(virErrorMsgStrings) == VIR_ERR_NUMBER_LAST);
diff --git a/tests/meson.build b/tests/meson.build
index 0082446029..d083548c0a 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -258,6 +258,7 @@ tests += [
{ 'name': 'genericxml2xmltest' },
{ 'name': 'interfacexml2xmltest' },
{ 'name': 'metadatatest' },
+ { 'name': 'networkmetadatatest' },
{ 'name': 'networkxml2xmlupdatetest' },
{ 'name': 'nodedevxml2xmltest' },
{ 'name': 'nwfilterxml2xmltest' },
diff --git a/tests/networkmetadatatest.c b/tests/networkmetadatatest.c
new file mode 100644
index 0000000000..4448472776
--- /dev/null
+++ b/tests/networkmetadatatest.c
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2013 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "testutils.h"
+
+#include "virerror.h"
+#include "virxml.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+static const char metadata1[] =
+"<derp xmlns:foobar='http://foo.bar/'>\n"
+" <bar>foobar</bar>\n"
+" <foo fooish='blurb'>foofoo</foo>\n"
+" <foobar:baz>zomg</foobar:baz>\n"
+"</derp>";
+
+
+static const char metadata1_ns[] =
+"<herp:derp xmlns:foobar='http://foo.bar/' xmlns:herp='http://herp.derp/'>\n"
+" <herp:bar>foobar</herp:bar>\n"
+" <herp:foo fooish='blurb'>foofoo</herp:foo>\n"
+" <foobar:baz>zomg</foobar:baz>\n"
+"</herp:derp>";
+
+
+static const char metadata2[] =
+"<foo>\n"
+" <bar>baz</bar>\n"
+"</foo>";
+
+
+static const char metadata2_ns[] =
+"<blurb:foo xmlns:blurb='http://herp.derp/'>\n"
+" <blurb:bar>baz</blurb:bar>\n"
+"</blurb:foo>";
+
+
+static char *
+getMetadataFromXML(virNetworkPtr net)
+{
+ g_autoptr(xmlDoc) doc = NULL;
+ g_autoptr(xmlXPathContext) ctxt = NULL;
+ xmlNodePtr node;
+
+ g_autofree char *xml = NULL;
+
+ if (!(xml = virNetworkGetXMLDesc(net, 0)))
+ return NULL;
+
+ if (!(doc = virXMLParseStringCtxt(xml, "(network_definition)", &ctxt)))
+ return NULL;
+
+ if (!(node = virXPathNode("//metadata/*", ctxt)))
+ return NULL;
+
+ return virXMLNodeToString(node->doc, node);
+}
+
+
+static void
+metadataXMLConvertApostrophe(char *str)
+{
+ do {
+ if (*str == '\"')
+ *str = '\'';
+ } while ((*++str) != '\0');
+}
+
+
+static bool
+verifyMetadata(virNetworkPtr net,
+ const char *expectXML,
+ const char *expectAPI,
+ const char *uri)
+{
+ g_autofree char *metadataXML = NULL;
+ g_autofree char *metadataAPI = NULL;
+
+ if (!expectAPI) {
+ if ((metadataAPI = virNetworkGetMetadata(net,
+ VIR_NETWORK_METADATA_ELEMENT,
+ uri, 0))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "expected no metadata in API, but got:\n[%s]",
+ metadataAPI);
+ return false;
+ }
+ } else {
+ if (!(metadataAPI = virNetworkGetMetadata(net,
+ VIR_NETWORK_METADATA_ELEMENT,
+ uri, 0)))
+ return false;
+
+ metadataXMLConvertApostrophe(metadataAPI);
+
+ if (STRNEQ(metadataAPI, expectAPI)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "XML metadata in API doesn't match expected metadata: "
+ "expected:\n[%s]\ngot:\n[%s]",
+ expectAPI, metadataAPI);
+ return false;
+ }
+
+ }
+
+ if (!expectXML) {
+ if ((metadataXML = getMetadataFromXML(net))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "expected no metadata in XML, but got:\n[%s]",
+ metadataXML);
+ return false;
+ }
+ } else {
+ if (!(metadataXML = getMetadataFromXML(net)))
+ return false;
+
+ metadataXMLConvertApostrophe(metadataXML);
+
+ if (STRNEQ(metadataXML, expectXML)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "XML in dump doesn't match expected metadata: "
+ "expected:\n[%s]\ngot:\n[%s]",
+ expectXML, metadataXML);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+struct metadataTest {
+ virConnectPtr conn;
+ virNetworkPtr net;
+
+ const char *data;
+ const char *expect;
+ int type;
+ bool fail;
+};
+
+
+static int
+testAssignMetadata(const void *data)
+{
+ const struct metadataTest *test = data;
+
+ if (virNetworkSetMetadata(test->net, VIR_NETWORK_METADATA_ELEMENT,
+ metadata1, "herp", "http://herp.derp/", 0) < 0)
+ return -1;
+
+ if (!verifyMetadata(test->net, metadata1_ns, metadata1, "http://herp.derp/"))
+ return -1;
+
+ return 0;
+}
+
+static int
+testRewriteMetadata(const void *data)
+{
+ const struct metadataTest *test = data;
+
+ if (virNetworkSetMetadata(test->net, VIR_NETWORK_METADATA_ELEMENT,
+ metadata2, "blurb", "http://herp.derp/", 0) < 0)
+ return -1;
+
+ if (!verifyMetadata(test->net, metadata2_ns, metadata2, "http://herp.derp/"))
+ return -1;
+
+ return 0;
+}
+
+static int
+testEraseMetadata(const void *data)
+{
+ const struct metadataTest *test = data;
+
+ if (virNetworkSetMetadata(test->net, VIR_NETWORK_METADATA_ELEMENT,
+ NULL, NULL, "http://herp.derp/", 0) < 0)
+ return -1;
+
+ if (!verifyMetadata(test->net, NULL, NULL, "http://herp.derp/"))
+ return -1;
+
+ return 0;
+}
+
+static int
+testTextMetadata(const void *data)
+{
+ const struct metadataTest *test = data;
+ g_autofree char *actual = NULL;
+
+ if (virNetworkSetMetadata(test->net, test->type, test->data, NULL, NULL, 0) < 0) {
+ if (test->fail)
+ return 0;
+ return -1;
+ }
+
+ actual = virNetworkGetMetadata(test->net, test->type, NULL, 0);
+
+ if (STRNEQ_NULLABLE(test->expect, actual)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "expected metadata doesn't match actual: "
+ "expected:'%s'\ngot: '%s'",
+ NULLSTR(test->data), NULLSTR(actual));
+ return -1;
+ }
+
+ return 0;
+}
+
+#define TEST_TEXT_METADATA(INDEX, TYPE, DATA, EXPECT, FAIL) \
+ do { \
+ test.type = VIR_NETWORK_METADATA_ ## TYPE; \
+ test.data = DATA; \
+ test.expect = EXPECT; \
+ test.fail = FAIL; \
+ \
+ if (virTestRun("text metadata: " #TYPE " " INDEX " ", \
+ testTextMetadata, &test) < 0) \
+ ret = EXIT_FAILURE; \
+ } while (0)
+
+#define TEST_TITLE(INDEX, DATA) \
+ TEST_TEXT_METADATA(INDEX, TITLE, DATA, DATA, false)
+#define TEST_TITLE_EXPECT(INDEX, DATA, EXPECT) \
+ TEST_TEXT_METADATA(INDEX, TITLE, DATA, EXPECT, false)
+#define TEST_TITLE_FAIL(INDEX, DATA) \
+ TEST_TEXT_METADATA(INDEX, TITLE, DATA, DATA, true)
+#define TEST_DESCR(INDEX, DATA) \
+ TEST_TEXT_METADATA(INDEX, DESCRIPTION, DATA, DATA, false)
+#define TEST_DESCR_EXPECT(INDEX, DATA, EXPECT) \
+ TEST_TEXT_METADATA(INDEX, DESCRIPTION, DATA, EXPECT, false)
+
+static int
+mymain(void)
+{
+ struct metadataTest test = { 0 };
+ int ret = EXIT_SUCCESS;
+
+ if (!(test.conn = virConnectOpen("test:///default")))
+ return EXIT_FAILURE;
+
+ if (!(test.net = virNetworkLookupByName(test.conn, "default"))) {
+ virConnectClose(test.conn);
+ return EXIT_FAILURE;
+ }
+
+ virTestQuiesceLibvirtErrors(false);
+
+ if (virTestRun("Assign metadata ", testAssignMetadata, &test) < 0)
+ ret = EXIT_FAILURE;
+ if (virTestRun("Rewrite Metadata ", testRewriteMetadata, &test) < 0)
+ ret = EXIT_FAILURE;
+ if (virTestRun("Erase metadata ", testEraseMetadata, &test) < 0)
+ ret = EXIT_FAILURE;
+
+ TEST_TITLE("1", "qwert");
+ TEST_TITLE("2", NULL);
+ TEST_TITLE("3", "blah");
+ TEST_TITLE_FAIL("4", "qwe\nrt");
+ TEST_TITLE_EXPECT("5", "", NULL);
+ TEST_TITLE_FAIL("6", "qwert\n");
+ TEST_TITLE_FAIL("7", "\n");
+
+ TEST_DESCR("1", "qwert\nqwert");
+ TEST_DESCR("2", NULL);
+ TEST_DESCR("3", "qwert");
+ TEST_DESCR("4", "\n");
+ TEST_DESCR_EXPECT("5", "", NULL);
+
+ virNetworkFree(test.net);
+ virConnectClose(test.conn);
+
+ return ret;
+}
+
+VIR_TEST_MAIN(mymain)
diff --git a/tools/virsh-network.c b/tools/virsh-network.c
index 42b7dba761..74712e29be 100644
--- a/tools/virsh-network.c
+++ b/tools/virsh-network.c
@@ -1206,7 +1206,8 @@ typedef struct virshNetEventData virshNetEventData;
VIR_ENUM_DECL(virshNetworkEventId);
VIR_ENUM_IMPL(virshNetworkEventId,
VIR_NETWORK_EVENT_ID_LAST,
- "lifecycle");
+ "lifecycle",
+ "metadata-change");
static void
vshEventLifecyclePrint(virConnectPtr conn G_GNUC_UNUSED,
@@ -1239,9 +1240,84 @@ vshEventLifecyclePrint(virConnectPtr conn G_GNUC_UNUSED,
vshEventDone(data->ctl);
}
+static void G_GNUC_PRINTF(2, 3)
+virshEventPrintf(virshNetEventData *data,
+ const char *fmt,
+ ...)
+{
+ va_list ap;
+
+ if (!data->loop && data->count)
+ return;
+
+ if (data->timestamp) {
+ char timestamp[VIR_TIME_STRING_BUFLEN] = "";
+
+ ignore_value(virTimeStringNowRaw(timestamp));
+ vshPrint(data->ctl, "%s: ", timestamp);
+ }
+
+ va_start(ap, fmt);
+ vshPrintVa(data->ctl, fmt, ap);
+ va_end(ap);
+
+ (data->count)++;
+ if (!data->loop)
+ vshEventDone(data->ctl);
+}
+
+/**
+ * virshEventPrint:
+ *
+ * @data: opaque data passed to all event callbacks
+ * @buf: string buffer describing the event
+ *
+ * Print the event description found in @buf and update virshNetEventData.
+ *
+ * This function resets @buf and frees all memory consumed by its content.
+ */
+static void
+virshEventPrint(virshNetEventData *data,
+ virBuffer *buf)
+{
+ g_autofree char *msg = NULL;
+
+ if (!(msg = virBufferContentAndReset(buf)))
+ return;
+
+ virshEventPrintf(data, "%s", msg);
+}
+
+#define UNKNOWNSTR(str) (str ? str : N_("unsupported value"))
+
+VIR_ENUM_DECL(virshNetworkEventMetadataChangeType);
+VIR_ENUM_IMPL(virshNetworkEventMetadataChangeType,
+ VIR_NETWORK_METADATA_LAST,
+ N_("description"),
+ N_("title"),
+ N_("element"));
+
+static void
+vshEventMetadataChangePrint(virConnectPtr conn G_GNUC_UNUSED,
+ virNetworkPtr net,
+ int type,
+ const char *nsuri,
+ void *opaque)
+{
+ g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+
+ virBufferAsprintf(&buf, _("event 'metadata-change' for network '%1$s': type %2$s, uri %3$s\n"),
+ virNetworkGetName(net),
+ UNKNOWNSTR(virshNetworkEventMetadataChangeTypeTypeToString(type)),
+ NULLSTR(nsuri));
+ virshEventPrint(opaque, &buf);
+}
+
virshNetworkEventCallback virshNetworkEventCallbacks[] = {
{ "lifecycle",
VIR_NETWORK_EVENT_CALLBACK(vshEventLifecyclePrint), },
+ { "metadata-change",
+ VIR_NETWORK_EVENT_CALLBACK(vshEventMetadataChangePrint), },
};
G_STATIC_ASSERT(VIR_NETWORK_EVENT_ID_LAST == G_N_ELEMENTS(virshNetworkEventCallbacks));
--
2.41.0
2
1
[PATCH v2] qemuDomainWaitForDeviceRemoval: recheck the value of priv->unplug.alias when timeout
by Peter Krempa 26 Jun '23
by Peter Krempa 26 Jun '23
26 Jun '23
From: zuoboqun <zuoboqun(a)baidu.com>
When detaching a device, the following race condition may happen:
Once qemuDomainSignalDeviceRemoval() marks the device for
removal, it returns true, which means it is the caller
that marked the device for removal is going to remove the
device from domain definition.
But qemuDomainWaitForDeviceRemoval() may still receive
timeout from virDomainObjWaitUntil() which is implemented
by pthread_cond_timedwait() due to an unavoidable race
between the expiration of the timeout and the predicate
state(priv->unplug.alias) change.
And then qemuDomainWaitForDeviceRemoval() will return 0,
thus the caller will not remove the device from domain
definition.
In this situation, the device is still present in the domain
definition but doesn't exist in qemu anymore. Worse, there is
no way to remove it from the domain definition.
Solution is to recheck the value of priv->unplug.alias to
determine who is going to remove the device from domain
definition.
Signed-off-by: zuo boqun <zuoboqun(a)baidu.com>
Reviewed-by: Peter Krempa <pkrempa(a)redhat.com>
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
v2:
- rewrote waiting loop so that we always check the unplug status if the
thread was notified
- added comments explaining the logic
src/qemu/qemu_hotplug.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index ba9e44945b..2e3c99760d 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -5391,21 +5391,27 @@ qemuDomainWaitForDeviceRemoval(virDomainObj *vm)
{
qemuDomainObjPrivate *priv = vm->privateData;
unsigned long long until;
- int rc;
if (virTimeMillisNow(&until) < 0)
return 1;
until += qemuDomainGetUnplugTimeout(vm);
- while (priv->unplug.alias) {
- if ((rc = virDomainObjWaitUntil(vm, until)) == 1)
- return 0;
+ while (true) {
+ int rc;
- if (rc < 0) {
- VIR_WARN("Failed to wait on unplug condition for domain '%s' "
- "device '%s'", vm->def->name, priv->unplug.alias);
+ if ((rc = virDomainObjWaitUntil(vm, until)) < 0) {
+ VIR_WARN("Failed to wait on unplug condition for domain '%s' device '%s'",
+ vm->def->name, priv->unplug.alias);
return 1;
}
+
+ /* unplug event for this device was received, check the status */
+ if (!priv->unplug.alias)
+ break;
+
+ /* timeout */
+ if (rc == 1)
+ return 0;
}
if (priv->unplug.status == QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_GUEST_REJECTED) {
--
2.40.1
2
1
Update capabilities for QEMU 8.1 on s390x, add a new capability
async-teardown and make use of it when running on s390x hosts to improve
memory reclaiming.
Boris Fiuczynski (2):
qemu: add run-with async-teardown capability
qemu: enable asynchronous teardown on s390x hosts
Shalini Chellathurai Saroja (1):
tests: add capabilities for QEMU 8.1.0 on s390x
src/qemu/qemu_capabilities.c | 2 +
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 15 +
tests/domaincapsdata/qemu_8.1.0.s390x.xml | 284 +
.../caps_8.1.0_s390x.replies | 34594 ++++++++++++++++
.../qemucapabilitiesdata/caps_8.1.0_s390x.xml | 3719 ++
.../caps_8.1.0_x86_64.xml | 1 +
.../qemuhotplug-base-ccw-live+ccw-virtio.xml | 1 -
...ith-2-ccw-virtio+ccw-virtio-1-explicit.xml | 1 -
...with-2-ccw-virtio+ccw-virtio-1-reverse.xml | 1 -
...otplug-base-ccw-live-with-2-ccw-virtio.xml | 1 -
...-with-ccw-virtio+ccw-virtio-2-explicit.xml | 1 -
...-ccw-live-with-ccw-virtio+ccw-virtio-2.xml | 1 -
...uhotplug-base-ccw-live-with-ccw-virtio.xml | 1 -
.../qemuhotplug-base-ccw-live.xml | 1 -
.../balloon-ccw-deflate.s390x-latest.args | 3 +-
.../console-sclp.s390x-latest.args | 7 +-
.../console-virtio-ccw.s390x-latest.args | 9 +-
.../cpu-s390-features.s390x-latest.args | 1 +
.../cpu-s390-zEC12.s390x-latest.args | 1 +
...default-video-type-s390x.s390x-latest.args | 5 +-
.../disk-error-policy-s390x.s390x-latest.args | 7 +-
.../disk-virtio-ccw-many.s390x-latest.args | 11 +-
.../disk-virtio-ccw.s390x-latest.args | 7 +-
.../disk-virtio-s390-zpci.s390x-latest.args | 7 +-
.../fs9p-ccw.s390x-latest.args | 11 +-
...tdev-scsi-vhost-scsi-ccw.s390x-latest.args | 9 +-
...tdev-subsys-mdev-vfio-ap.s390x-latest.args | 5 +-
...ubsys-mdev-vfio-ccw-boot.s390x-latest.args | 5 +-
...dev-subsys-mdev-vfio-ccw.s390x-latest.args | 5 +-
...o-zpci-autogenerate-fids.s390x-latest.args | 11 +-
...o-zpci-autogenerate-uids.s390x-latest.args | 11 +-
...v-vfio-zpci-autogenerate.s390x-latest.args | 7 +-
...dev-vfio-zpci-boundaries.s390x-latest.args | 15 +-
...vfio-zpci-ccw-memballoon.s390x-latest.args | 9 +-
...io-zpci-multidomain-many.s390x-latest.args | 35 +-
.../hostdev-vfio-zpci.s390x-latest.args | 7 +-
.../input-virtio-ccw.s390x-latest.args | 11 +-
...othreads-virtio-scsi-ccw.s390x-latest.args | 9 +-
.../launch-security-s390-pv.s390x-latest.args | 7 +-
...chine-aeskeywrap-off-cap.s390x-latest.args | 3 +-
...hine-aeskeywrap-off-caps.s390x-latest.args | 3 +-
...achine-aeskeywrap-on-cap.s390x-latest.args | 3 +-
...chine-aeskeywrap-on-caps.s390x-latest.args | 3 +-
...chine-deakeywrap-off-cap.s390x-latest.args | 3 +-
...hine-deakeywrap-off-caps.s390x-latest.args | 3 +-
...achine-deakeywrap-on-cap.s390x-latest.args | 3 +-
...chine-deakeywrap-on-caps.s390x-latest.args | 3 +-
...achine-keywrap-none-caps.s390x-latest.args | 3 +-
.../machine-keywrap-none.s390x-latest.args | 3 +-
...machine-loadparm-hostdev.s390x-latest.args | 5 +-
...multiple-disks-nets-s390.s390x-latest.args | 15 +-
...achine-loadparm-net-s390.s390x-latest.args | 7 +-
.../machine-loadparm-s390.s390x-latest.args | 5 +-
.../net-virtio-ccw.s390x-latest.args | 11 +-
.../no-async-teardown-s390x.s390x-6.0.0.args | 32 +
.../no-async-teardown-s390x.xml | 18 +
...low-bogus-usb-controller.s390x-latest.args | 11 +-
...390-allow-bogus-usb-none.s390x-latest.args | 11 +-
...t-cpu-kvm-ccw-virtio-2.7.s390x-latest.args | 3 +-
...t-cpu-kvm-ccw-virtio-4.2.s390x-latest.args | 5 +-
...t-cpu-tcg-ccw-virtio-2.7.s390x-latest.args | 3 +-
...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 3 +-
.../s390-panic-missing.s390x-latest.args | 7 +-
.../s390-panic-no-address.s390x-latest.args | 7 +-
.../s390-serial-2.s390x-latest.args | 5 +-
.../s390-serial-console.s390x-latest.args | 3 +-
.../s390-serial.s390x-latest.args | 3 +-
.../s390x-ccw-graphics.s390x-latest.args | 23 +-
.../s390x-ccw-headless.s390x-latest.args | 17 +-
.../vhost-vsock-ccw-auto.s390x-latest.args | 7 +-
.../vhost-vsock-ccw-iommu.s390x-latest.args | 7 +-
.../vhost-vsock-ccw.s390x-latest.args | 7 +-
.../video-virtio-gpu-ccw.s390x-latest.args | 9 +-
.../virtio-rng-ccw.s390x-latest.args | 11 +-
.../watchdog-diag288.s390x-latest.args | 7 +-
tests/qemuxml2argvtest.c | 2 +
77 files changed, 38916 insertions(+), 197 deletions(-)
create mode 100644 tests/domaincapsdata/qemu_8.1.0.s390x.xml
create mode 100644 tests/qemucapabilitiesdata/caps_8.1.0_s390x.replies
create mode 100644 tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml
create mode 100644 tests/qemuxml2argvdata/no-async-teardown-s390x.s390x-6.0.0.args
create mode 100644 tests/qemuxml2argvdata/no-async-teardown-s390x.xml
--
2.39.0
4
9
v3:
- new PATCH 1 adds a qemu capability
- PATCH 2:
- tweaked a few error messages
- added qemu capability validation
- removed invocation of test from qemusecuritytest which is not
needed
- PATCH 3:
- added some explanation for the news entry
Jean-Louis Dupond (2):
Add discard_no_unref option for qcow2 images
NEWS: Update NEWS with new discard_no_unref option
Peter Krempa (1):
qemu: capabilities: Introduce QEMU_CAPS_QCOW2_DISCARD_NO_UNREF
NEWS.rst | 7 ++++
docs/formatdomain.rst | 7 ++++
src/conf/domain_conf.c | 8 ++++
src/conf/domain_conf.h | 1 +
src/conf/domain_validate.c | 14 +++++++
src/conf/schemas/domaincommon.rng | 5 +++
src/conf/storage_source_conf.c | 1 +
src/conf/storage_source_conf.h | 1 +
src/qemu/qemu_block.c | 11 +++--
src/qemu/qemu_capabilities.c | 2 +
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_domain.c | 1 +
src/qemu/qemu_driver.c | 4 +-
src/qemu/qemu_validate.c | 7 ++++
src/vz/vz_utils.c | 6 +++
.../caps_8.1.0_x86_64.xml | 1 +
.../disk-discard_no_unref.x86_64-latest.args | 36 ++++++++++++++++
.../disk-discard_no_unref.xml | 32 ++++++++++++++
tests/qemuxml2argvtest.c | 1 +
.../disk-discard_no_unref.x86_64-latest.xml | 42 +++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
21 files changed, 182 insertions(+), 7 deletions(-)
create mode 100644 tests/qemuxml2argvdata/disk-discard_no_unref.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/disk-discard_no_unref.xml
create mode 100644 tests/qemuxml2xmloutdata/disk-discard_no_unref.x86_64-latest.xml
--
2.40.1
2
4
Awaiting review before proceeding attempts for metadata support on other objects.
- Shiva
1
0
Hello
I'd like to revive the thread started by Eric Garver at the end of last year that aims to bring native Firewalld support to libvirtd [1].
Currently the Firewalld configuration set up by libvirtd is based on a quirk [2] that makes it a bit puzzling for users. The aforementioned patches implements the same configuration from a Firewalld policy which is much more cleaner and understandable.
I'm supportive to move forward on this patch series.
Regards
Hervé
[1] https://listman.redhat.com/archives/libvir-list/2022-November/235725.html
[2] https://gitlab.com/libvirt/libvirt/-/commit/3b71f2e42dc6c5453d09136578bfb86…
3
3
Hi this series describe the migration parts that have to be deprecated.
- It is an rfc because I doubt that I did the deprecation process right. Hello Markus O:-)
- skipped field: It is older than me, I have never know what it stands
for. As far as I know it has always been zero.
- inc/blk migrate command options. They are only used by block
migration (that I deprecate on the following patch). And they are really bad.
grep must_remove_block_options.
- block migration. block jobs, whatever they are called this week are
way more flexible. Current code works, but we broke it here and
there, and really nobody has stand up to maintain it. It is quite
contained and can be left there. Is anyone really using it?
- old compression method. It don't work. See last try from Lukas to
make a test that works reliabely. I failed with the same task years
ago. It is really slow, and if compression is good for you, multifd
+ zlib is going to perform/compress way more.
I don't know what to do with this code, really.
* Remove it for this release? It don't work, and haven't work
reliabely in quite a few time.
* Deprecate it and remove in another couple of releases, i.e. normal
deprecation.
* Ideas?
- -incoming <uri>
if you need to set parameters (multifd cames to mind, and preempt has
the same problem), you really needs to use defer. So what should we do here?
This part is not urget, because management apps have a working
option that are already using "defer", and the code simplifacation
if we remove it is not so big. So we can leave it until 9.0 or
whatever we think fit.
What do you think?
Later, Juan.
Juan Quintela (6):
migration: skipped field is really obsolete.
migration: migrate 'inc' command option is deprecated.
migration: migrate 'blk' command option is deprecated.
migration: Deprecate -incoming <uri>
migration: Deprecate block migration
migration: Deprecated old compression method
docs/about/deprecated.rst | 45 ++++++++++++
qapi/migration.json | 141 +++++++++++++++++++++++++++-----------
migration/block.c | 2 +
migration/migration.c | 10 +++
migration/options.c | 20 ++++++
softmmu/vl.c | 2 +
6 files changed, 181 insertions(+), 39 deletions(-)
base-commit: 5f9dd6a8ce3961db4ce47411ed2097ad88bdf5fc
prerequisite-patch-id: 99c8bffa9428838925e330eb2881bab476122579
prerequisite-patch-id: 77ba427fd916aeb395e95aa0e7190f84e98e96ab
prerequisite-patch-id: 9983d46fa438d7075a37be883529e37ae41e4228
prerequisite-patch-id: 207f7529924b12dcb57f6557d6db6f79ceb2d682
prerequisite-patch-id: 5ad1799a13845dbf893a28a202b51a6b50d95d90
prerequisite-patch-id: c51959aacd6d65ee84fcd4f1b2aed3dd6f6af879
prerequisite-patch-id: da9dbb6799b2da002c0896574334920097e4c50a
prerequisite-patch-id: c1110ffafbaf5465fb277a20db809372291f7846
prerequisite-patch-id: 8307c92bedd07446214b35b40206eb6793a7384d
prerequisite-patch-id: 0a6106cd4a508d5e700a7ff6c25edfdd03c8ca3d
prerequisite-patch-id: 83205051de22382e75bf4acdf69e59315801fa0d
prerequisite-patch-id: 8c9b3cba89d555c071a410041e6da41806106a7e
prerequisite-patch-id: 0ff62a33b9a242226ccc1f5424a516de803c9fe5
prerequisite-patch-id: 25b8ae1ebe09ace14457c454cfcb23077c37346c
prerequisite-patch-id: 466ea91d5be41fe345dacd4d17bbbe5ce13118c2
prerequisite-patch-id: d1045858f9729ac62eccf2e83ebf95cfebae2cb5
prerequisite-patch-id: 0276ec02073bda5426de39e2f2e81eef080b4f54
prerequisite-patch-id: 7afb4450a163cc1a63ea23831c50214966969131
prerequisite-patch-id: 06c053ce4f41db9675bd1778ae8f6a483641fcef
prerequisite-patch-id: 13ea05d54d741ed08b3bfefa1fc8bedb9c81c782
prerequisite-patch-id: 99c4e2b7101bc8c4b9515129a1bbe6f068053dbf
prerequisite-patch-id: 1e393a196dc7a1ee75f3cc3cebbb591c5422102f
prerequisite-patch-id: 2cf497b41f5024ede0a224b1f5b172226067a534
prerequisite-patch-id: 2a70276ed61d33fc4f3b52560753c05d1cd413be
prerequisite-patch-id: 17ec40f4388b62ba8bf3ac1546c6913f5d1f6079
prerequisite-patch-id: dba969ce9d6cf69c1319661a7d81b1c1c719804d
prerequisite-patch-id: 8d800cda87167314f07320bdb3df936c323e4a40
prerequisite-patch-id: 25d4aaf54ea66f30e426fa38bdd4e0f47303c513
prerequisite-patch-id: 082c9d8584c1daff1e827e44ee3047178e7004a7
prerequisite-patch-id: 0ef73900899425ae2f00751347afdce3739aa954
prerequisite-patch-id: e7db4730b791b71aaf417ee0f65fb6304566aaf8
prerequisite-patch-id: 62d7f28f8196039507ffe362f97723395d7bb704
prerequisite-patch-id: ea8de47bcb54e33bcc67e59e9ed752a4d1fad703
prerequisite-patch-id: 497893ef92e1ea56bd8605e6990a05cb4c7f9293
prerequisite-patch-id: 3dc869c80ee568449bbfa2a9bc427524d0e8970b
prerequisite-patch-id: 52c14b6fb14ed4ccd685385a9fbc6297b762c0ef
prerequisite-patch-id: 23de8371e9e3277c374a47f9bd10de209a22fdd5
prerequisite-patch-id: d21f036dd106af3375fb920bf0a557fe2b86d98e
prerequisite-patch-id: ca717076e9de83d6ce370f7374c4729a9f586fae
prerequisite-patch-id: a235b6ab3237155f2b39e8e10d47ddd250f6b6cc
prerequisite-patch-id: 6db2aa3d8a5804c85dd171864f5140fadf5f72da
prerequisite-patch-id: a799b883f4cb41c34ad074220293f372c6e0a9c7
prerequisite-patch-id: 5e012c426aef7b2f07513cec68e7efa1cf85fe52
prerequisite-patch-id: 4e614e7e3395dda7bae5f9fa21257c57cce45a39
prerequisite-patch-id: 67f8e68622c9698280ff5c5dc7469f36daf9a012
prerequisite-patch-id: d86078331449a21499e3f955e27bc87294969346
prerequisite-patch-id: 3f30d10e0ac7f53307f6b462eaf5b47151b73631
prerequisite-patch-id: 0c7fb969e83ed1b01f15b54abb106026fadb7707
--
2.40.1
7
48
[PATCH] qemuDomainWaitForDeviceRemoval: recheck the value of priv->unplug.alias when timeout
by zuoboqun 23 Jun '23
by zuoboqun 23 Jun '23
23 Jun '23
When detaching a device, the following race condition may happen:
Once qemuDomainSignalDeviceRemoval() marks the device for
removal, it returns true, which means it is the caller
that marked the device for removal is going to remove the
device from domain definition.
But qemuDomainWaitForDeviceRemoval() may still receive
timeout from virDomainObjWaitUntil() which is implemented
by pthread_cond_timedwait() due to an unavoidable race
between the expiration of the timeout and the predicate
state(priv->unplug.alias) change.
And then qemuDomainWaitForDeviceRemoval() will return 0,
thus the caller will not remove the device from domain
definition.
In this situation, the device is still present in the domain
definition but doesn't exist in qemu anymore. Worse, there is
no way to remove it from the domain definition.
Solution is to recheck the value of priv->unplug.alias to
determine who is going to remove the device from domain
definition.
Signed-off-by: zuo boqun <zuoboqun(a)baidu.com>
---
src/qemu/qemu_hotplug.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 972df572a7..c8028df93a 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -5399,8 +5399,12 @@ qemuDomainWaitForDeviceRemoval(virDomainObj *vm)
until += qemuDomainGetUnplugTimeout(vm);
while (priv->unplug.alias) {
- if ((rc = virDomainObjWaitUntil(vm, until)) == 1)
- return 0;
+ if ((rc = virDomainObjWaitUntil(vm, until)) == 1) {
+ if (priv->unplug.alias)
+ return 0;
+ else
+ return 1;
+ }
if (rc < 0) {
VIR_WARN("Failed to wait on unplug condition for domain '%s' "
--
2.34.0.windows.1
3
2
[PATCH 0/4] qemu: Allow 'maxMemory' without 'slots' and fix slot validation for virtio-mem
by Peter Krempa 23 Jun '23
by Peter Krempa 23 Jun '23
23 Jun '23
First patch reworks memory specification to use the explicit 'size'
parameter (since qemu v2.0.0-179-g6e1d3c1c85), the reset modifies memory
hotplug related checks to properly handle non-DIMM devices which don't
require DIMM slots.
Peter Krempa (4):
qemu_command: Always use modern syntax of '-m'
qemu_domain: Properly validate count of memory slots
conf: Allow omitting 'slots' attribute of <maxMemory>
qemuxml2(argv|xml)test: Add case for validating proper DIMM slot
validation
src/conf/domain_conf.c | 13 ++-
src/conf/domain_postparse.c | 5 +-
src/conf/schemas/domaincommon.rng | 8 +-
src/qemu/qemu_command.c | 24 +++--
src/qemu/qemu_domain.c | 31 +++++--
...ch64-aavmf-virtio-mmio.aarch64-latest.args | 2 +-
...arch64-cpu-passthrough.aarch64-latest.args | 2 +-
...fault-cpu-kvm-virt-4.2.aarch64-latest.args | 2 +-
...fault-cpu-tcg-virt-4.2.aarch64-latest.args | 2 +-
.../aarch64-features-sve.aarch64-latest.args | 2 +-
.../aarch64-gic-default-both.args | 2 +-
.../aarch64-gic-default-v2.args | 2 +-
.../aarch64-gic-default-v3.args | 2 +-
.../aarch64-gic-default.aarch64-4.2.0.args | 2 +-
.../aarch64-gic-default.aarch64-latest.args | 2 +-
tests/qemuxml2argvdata/aarch64-gic-host.args | 2 +-
.../aarch64-gic-none-both.args | 2 +-
.../aarch64-gic-none-tcg.args | 2 +-
.../qemuxml2argvdata/aarch64-gic-none-v2.args | 2 +-
.../qemuxml2argvdata/aarch64-gic-none-v3.args | 2 +-
.../aarch64-gic-none.aarch64-4.2.0.args | 2 +-
.../aarch64-gic-none.aarch64-latest.args | 2 +-
tests/qemuxml2argvdata/aarch64-gic-v2.args | 2 +-
tests/qemuxml2argvdata/aarch64-gic-v3.args | 2 +-
.../aarch64-kvm-32-on-64.aarch64-latest.args | 2 +-
.../aarch64-pci-serial.aarch64-latest.args | 2 +-
.../aarch64-tpm.aarch64-latest.args | 2 +-
...arch64-traditional-pci.aarch64-latest.args | 2 +-
...aarch64-usb-controller.aarch64-latest.args | 2 +-
.../aarch64-video-default.aarch64-latest.args | 2 +-
...4-video-virtio-gpu-pci.aarch64-latest.args | 2 +-
...rch64-virt-default-nic.aarch64-latest.args | 2 +-
.../aarch64-virt-graphics.aarch64-latest.args | 2 +-
.../aarch64-virt-headless.aarch64-latest.args | 2 +-
...rch64-virt-virtio-MMIO.aarch64.latest.args | 2 +-
.../aarch64-virt-virtio.aarch64-4.2.0.args | 2 +-
.../aarch64-virt-virtio.aarch64-latest.args | 2 +-
...ch64-virtio-pci-default.aarch64-4.2.0.args | 2 +-
...h64-virtio-pci-default.aarch64-latest.args | 2 +-
...o-pci-manual-addresses.aarch64-latest.args | 2 +-
tests/qemuxml2argvdata/acpi-table.args | 2 +-
.../arm-vexpressa9-basic.aarch64-latest.args | 2 +-
.../arm-vexpressa9-nodevs.aarch64-latest.args | 2 +-
.../arm-vexpressa9-virtio.aarch64-latest.args | 2 +-
.../arm-virt-virtio.aarch64-latest.args | 2 +-
.../audio-alsa-best.x86_64-latest.args | 2 +-
.../audio-alsa-full.x86_64-latest.args | 2 +-
.../audio-alsa-minimal.x86_64-latest.args | 2 +-
.../audio-coreaudio-best.x86_64-latest.args | 2 +-
.../audio-coreaudio-full.x86_64-latest.args | 2 +-
...audio-coreaudio-minimal.x86_64-latest.args | 2 +-
...udio-default-nographics.x86_64-latest.args | 2 +-
.../audio-default-sdl.x86_64-4.2.0.args | 2 +-
.../audio-default-sdl.x86_64-latest.args | 2 +-
.../audio-default-spice.x86_64-4.2.0.args | 2 +-
.../audio-default-spice.x86_64-latest.args | 2 +-
.../audio-default-vnc.x86_64-4.2.0.args | 2 +-
.../audio-default-vnc.x86_64-latest.args | 2 +-
.../audio-file-best.x86_64-latest.args | 2 +-
.../audio-file-full.x86_64-latest.args | 2 +-
.../audio-file-minimal.x86_64-latest.args | 2 +-
.../audio-jack-full.x86_64-latest.args | 2 +-
.../audio-jack-minimal.x86_64-latest.args | 2 +-
.../audio-many-backends.x86_64-latest.args | 2 +-
.../audio-none-best.x86_64-latest.args | 2 +-
.../audio-none-full.x86_64-latest.args | 2 +-
.../audio-none-minimal.x86_64-latest.args | 2 +-
.../audio-oss-best.x86_64-latest.args | 2 +-
.../audio-oss-full.x86_64-latest.args | 2 +-
.../audio-oss-minimal.x86_64-latest.args | 2 +-
.../audio-pulseaudio-best.x86_64-latest.args | 2 +-
.../audio-pulseaudio-full.x86_64-latest.args | 2 +-
...udio-pulseaudio-minimal.x86_64-latest.args | 2 +-
.../audio-sdl-best.x86_64-latest.args | 2 +-
.../audio-sdl-full.x86_64-latest.args | 2 +-
.../audio-sdl-minimal.x86_64-latest.args | 2 +-
.../audio-spice-best.x86_64-latest.args | 2 +-
.../audio-spice-full.x86_64-latest.args | 2 +-
.../audio-spice-minimal.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/autoindex.args | 2 +-
.../balloon-ccw-deflate.s390x-latest.args | 2 +-
.../qemuxml2argvdata/balloon-device-auto.args | 2 +-
.../balloon-device-deflate-off.args | 2 +-
.../balloon-device-deflate.args | 2 +-
.../balloon-device-period.args | 2 +-
tests/qemuxml2argvdata/balloon-device.args | 2 +-
.../balloon-mmio-deflate.aarch64-latest.args | 2 +-
.../blkdeviotune-group-num.x86_64-latest.args | 2 +-
...blkdeviotune-max-length.x86_64-latest.args | 2 +-
.../blkdeviotune-max.x86_64-latest.args | 2 +-
.../blkdeviotune.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/blkiotune-device.args | 2 +-
tests/qemuxml2argvdata/blkiotune.args | 2 +-
.../boot-cdrom.x86_64-latest.args | 2 +-
.../boot-complex.x86_64-latest.args | 2 +-
.../boot-floppy-q35.x86_64-latest.args | 2 +-
.../boot-floppy.x86_64-latest.args | 2 +-
...boot-menu-disable-drive.x86_64-latest.args | 2 +-
.../boot-menu-disable.x86_64-latest.args | 2 +-
...enu-enable-with-timeout.x86_64-latest.args | 2 +-
.../boot-menu-enable.x86_64-latest.args | 2 +-
.../boot-multi.x86_64-latest.args | 2 +-
.../boot-network.x86_64-latest.args | 2 +-
.../boot-order.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/channel-guestfwd.args | 2 +-
...l-qemu-vdagent-features.x86_64-latest.args | 2 +-
.../channel-qemu-vdagent.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/channel-spicevmc.args | 2 +-
.../channel-unix-guestfwd.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/channel-virtio-auto.args | 2 +-
.../channel-virtio-autoadd.args | 2 +-
.../channel-virtio-autoassign.args | 2 +-
.../channel-virtio-default.args | 2 +-
.../channel-virtio-state.args | 2 +-
.../qemuxml2argvdata/channel-virtio-unix.args | 2 +-
tests/qemuxml2argvdata/channel-virtio.args | 2 +-
tests/qemuxml2argvdata/chardev-reconnect.args | 2 +-
.../clock-absolute.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/clock-catchup.args | 2 +-
tests/qemuxml2argvdata/clock-france.args | 2 +-
tests/qemuxml2argvdata/clock-hpet-off.args | 2 +-
.../clock-localtime-basis-localtime.args | 2 +-
tests/qemuxml2argvdata/clock-localtime.args | 2 +-
tests/qemuxml2argvdata/clock-realtime.args | 2 +-
.../clock-timer-armvtimer.aarch64-latest.args | 2 +-
.../clock-timer-hyperv-rtc.args | 2 +-
tests/qemuxml2argvdata/clock-utc.args | 2 +-
tests/qemuxml2argvdata/clock-variable.args | 2 +-
.../qemuxml2argvdata/console-compat-auto.args | 2 +-
.../console-compat-auto.x86_64-latest.args | 2 +-
.../console-compat-chardev.args | 2 +-
.../console-compat-chardev.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/console-compat.args | 2 +-
.../console-compat.x86_64-latest.args | 2 +-
.../console-sclp.s390x-latest.args | 2 +-
.../console-virtio-ccw.s390x-latest.args | 2 +-
.../qemuxml2argvdata/console-virtio-many.args | 2 +-
.../console-virtio-unix.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/console-virtio.args | 2 +-
tests/qemuxml2argvdata/controller-order.args | 2 +-
.../controller-usb-order.x86_64-latest.args | 2 +-
.../controller-virtio-scsi.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/cpu-Haswell-noTSX.args | 2 +-
tests/qemuxml2argvdata/cpu-Haswell.args | 2 +-
tests/qemuxml2argvdata/cpu-Haswell2.args | 2 +-
tests/qemuxml2argvdata/cpu-Haswell3.args | 2 +-
...-Icelake-Server-pconfig.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/cpu-cache-disable.args | 2 +-
.../qemuxml2argvdata/cpu-cache-disable2.args | 2 +-
.../qemuxml2argvdata/cpu-cache-disable3.args | 2 +-
.../cpu-cache-emulate-l3.args | 2 +-
.../cpu-cache-passthrough.args | 2 +-
.../cpu-cache-passthrough2.args | 2 +-
.../cpu-check-default-none.args | 2 +-
.../cpu-check-default-none2.args | 2 +-
.../cpu-check-default-partial.args | 2 +-
.../cpu-check-default-partial2.args | 2 +-
tests/qemuxml2argvdata/cpu-check-none.args | 2 +-
.../cpu-eoi-disabled.x86_64-latest.args | 2 +-
.../cpu-eoi-enabled.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/cpu-exact1.args | 2 +-
.../cpu-exact2-nofallback.args | 2 +-
tests/qemuxml2argvdata/cpu-exact2.args | 2 +-
tests/qemuxml2argvdata/cpu-fallback.args | 2 +-
tests/qemuxml2argvdata/cpu-host-kvmclock.args | 2 +-
.../qemuxml2argvdata/cpu-host-model-cmt.args | 2 +-
.../cpu-host-model-fallback.args | 2 +-
.../cpu-host-model-vendor.args | 2 +-
tests/qemuxml2argvdata/cpu-host-model.args | 2 +-
.../cpu-host-model.x86_64-4.2.0.args | 2 +-
.../cpu-host-model.x86_64-5.0.0.args | 2 +-
.../cpu-host-model.x86_64-5.1.0.args | 2 +-
.../cpu-host-model.x86_64-5.2.0.args | 2 +-
.../cpu-host-model.x86_64-6.0.0.args | 2 +-
.../cpu-host-model.x86_64-6.1.0.args | 2 +-
.../cpu-host-model.x86_64-latest.args | 2 +-
.../cpu-host-passthrough-features.args | 2 +-
.../cpu-host-passthrough.args | 2 +-
.../qemuxml2argvdata/cpu-hotplug-startup.args | 2 +-
tests/qemuxml2argvdata/cpu-kvmclock.args | 2 +-
tests/qemuxml2argvdata/cpu-minimum1.args | 2 +-
tests/qemuxml2argvdata/cpu-minimum2.args | 2 +-
.../cpu-no-removed-features.args | 2 +-
tests/qemuxml2argvdata/cpu-numa-disjoint.args | 2 +-
.../qemuxml2argvdata/cpu-numa-memshared.args | 2 +-
.../cpu-numa-no-memory-element.args | 2 +-
tests/qemuxml2argvdata/cpu-numa1.args | 2 +-
tests/qemuxml2argvdata/cpu-numa2.args | 2 +-
...-phys-bits-emulate-bare.x86_64-latest.args | 2 +-
.../cpu-phys-bits-emulate.args | 2 +-
.../cpu-phys-bits-emulate2.args | 2 +-
.../cpu-phys-bits-limit.x86_64-latest.args | 2 +-
.../cpu-phys-bits-passthrough.args | 2 +-
.../cpu-s390-features.s390x-latest.args | 2 +-
.../cpu-s390-zEC12.s390x-latest.args | 2 +-
tests/qemuxml2argvdata/cpu-strict1.args | 2 +-
tests/qemuxml2argvdata/cpu-topology1.args | 2 +-
tests/qemuxml2argvdata/cpu-topology2.args | 2 +-
tests/qemuxml2argvdata/cpu-topology3.args | 2 +-
.../cpu-translation.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/cpu-tsc-frequency.args | 2 +-
.../cputune-cpuset-big-id.x86_64-latest.args | 2 +-
.../cputune-numatune.x86_64-latest.args | 2 +-
.../cputune-zero-shares.x86_64-latest.args | 2 +-
.../cputune.x86_64-latest.args | 2 +-
.../default-kvm-host-arch.args | 2 +-
.../default-qemu-host-arch.args | 2 +-
...ult-video-type-aarch64.aarch64-latest.args | 2 +-
...default-video-type-ppc64.ppc64-latest.args | 2 +-
...ult-video-type-riscv64.riscv64-latest.args | 2 +-
...default-video-type-s390x.s390x-latest.args | 2 +-
.../devices-acpi-index.x86_64-latest.args | 2 +-
.../disk-aio-io_uring.x86_64-latest.args | 2 +-
.../disk-aio.x86_64-latest.args | 2 +-
.../disk-arm-virtio-sd.aarch64-latest.args | 2 +-
...-backing-chains-noindex.x86_64-latest.args | 2 +-
.../disk-blockio.x86_64-latest.args | 2 +-
.../disk-boot-cdrom.x86_64-latest.args | 2 +-
.../disk-boot-disk.x86_64-latest.args | 2 +-
.../disk-cache.x86_64-latest.args | 2 +-
.../disk-cdrom-bus-other.x86_64-latest.args | 2 +-
...m-empty-network-invalid.x86_64-latest.args | 2 +-
.../disk-cdrom-network.x86_64-latest.args | 2 +-
.../disk-cdrom-tray.x86_64-latest.args | 2 +-
.../disk-cdrom.x86_64-latest.args | 2 +-
.../disk-copy_on_read.x86_64-latest.args | 2 +-
.../disk-detect-zeroes.x86_64-latest.args | 2 +-
.../disk-discard.x86_64-latest.args | 2 +-
.../disk-error-policy-s390x.s390x-latest.args | 2 +-
.../disk-error-policy.x86_64-latest.args | 2 +-
.../disk-floppy-q35.x86_64-latest.args | 2 +-
.../disk-floppy-tray.x86_64-latest.args | 2 +-
.../disk-floppy.x86_64-latest.args | 2 +-
.../disk-fmt-qcow.x86_64-latest.args | 2 +-
.../disk-geometry.x86_64-latest.args | 2 +-
.../disk-ide-split.x86_64-latest.args | 2 +-
.../disk-ide-wwn.x86_64-latest.args | 2 +-
.../disk-ioeventfd.x86_64-latest.args | 2 +-
.../disk-metadata-cache.x86_64-latest.args | 2 +-
.../disk-network-gluster.x86_64-latest.args | 2 +-
.../disk-network-http.x86_64-latest.args | 2 +-
.../disk-network-iscsi.x86_64-latest.args | 2 +-
.../disk-network-nbd.x86_64-latest.args | 2 +-
.../disk-network-nfs.x86_64-latest.args | 2 +-
...rbd-encryption-layering.x86_64-latest.args | 2 +-
...rbd-encryption-luks-any.x86_64-latest.args | 2 +-
...-network-rbd-encryption.x86_64-latest.args | 2 +-
...sk-network-rbd-no-colon.x86_64-latest.args | 2 +-
.../disk-network-rbd.x86_64-latest.args | 2 +-
.../disk-network-sheepdog.x86_64-6.0.0.args | 2 +-
...isk-network-source-auth.x86_64-latest.args | 2 +-
...rk-tlsx509-nbd-hostname.x86_64-latest.args | 2 +-
...disk-network-tlsx509-nbd.x86_64-5.2.0.args | 2 +-
...isk-network-tlsx509-nbd.x86_64-latest.args | 2 +-
...isk-network-tlsx509-vxhs.x86_64-5.0.0.args | 2 +-
.../disk-no-boot.x86_64-latest.args | 2 +-
.../disk-nvme.x86_64-latest.args | 2 +-
.../disk-order.x86_64-latest.args | 2 +-
.../disk-readonly-disk.x86_64-latest.args | 2 +-
.../disk-rotation.x86_64-latest.args | 2 +-
.../disk-sata-device.x86_64-latest.args | 2 +-
.../disk-scsi-device-auto.x86_64-latest.args | 2 +-
.../disk-scsi-disk-split.x86_64-latest.args | 2 +-
.../disk-scsi-disk-vpd.x86_64-latest.args | 2 +-
.../disk-scsi-disk-wwn.x86_64-latest.args | 2 +-
...sk-scsi-lun-passthrough.x86_64-latest.args | 2 +-
.../disk-scsi.x86_64-latest.args | 2 +-
.../disk-serial.x86_64-latest.args | 2 +-
.../disk-shared.x86_64-latest.args | 2 +-
.../disk-slices.x86_64-latest.args | 2 +-
.../disk-snapshot.x86_64-latest.args | 2 +-
.../disk-source-fd.x86_64-latest.args | 2 +-
.../disk-source-pool-mode.x86_64-latest.args | 2 +-
.../disk-source-pool.x86_64-latest.args | 2 +-
.../disk-transient.x86_64-latest.args | 2 +-
...sk-usb-device-removable.x86_64-latest.args | 2 +-
.../disk-usb-device.x86_64-latest.args | 2 +-
.../disk-vhostuser-numa.x86_64-4.2.0.args | 2 +-
.../disk-vhostuser-numa.x86_64-latest.args | 2 +-
.../disk-vhostuser.x86_64-latest.args | 2 +-
.../disk-virtio-ccw-many.s390x-latest.args | 2 +-
.../disk-virtio-ccw.s390x-latest.args | 2 +-
.../disk-virtio-queues.x86_64-latest.args | 2 +-
.../disk-virtio-s390-zpci.s390x-latest.args | 2 +-
...virtio-scsi-reservations.x86_64-5.2.0.args | 2 +-
...irtio-scsi-reservations.x86_64-latest.args | 2 +-
.../disk-virtio.x86_64-latest.args | 2 +-
.../encrypted-disk-usage.x86_64-latest.args | 2 +-
.../encrypted-disk.x86_64-latest.args | 2 +-
.../eoi-disabled.x86_64-latest.args | 2 +-
.../eoi-enabled.x86_64-latest.args | 2 +-
.../event_idx.x86_64-latest.args | 2 +-
.../fd-memory-no-numa-topology.args | 2 +-
.../fd-memory-numa-topology.args | 2 +-
.../fd-memory-numa-topology2.args | 2 +-
.../fd-memory-numa-topology3.args | 2 +-
...d-memory-numa-topology4.x86_64-latest.args | 2 +-
.../fips-enabled.x86_64-5.1.0.args | 2 +-
.../fips-enabled.x86_64-latest.args | 2 +-
...are-auto-bios-stateless.x86_64-latest.args | 2 +-
.../firmware-auto-bios.x86_64-latest.args | 2 +-
...mware-auto-efi-aarch64.aarch64-latest.args | 2 +-
...efi-abi-update-aarch64.aarch64-latest.args | 2 +-
...-auto-efi-enrolled-keys.x86_64-latest.args | 2 +-
...efi-format-loader-qcow2.x86_64-latest.args | 2 +-
...-efi-format-loader-raw.aarch64-latest.args | 2 +-
...nvram-qcow2-network-nbd.x86_64-latest.args | 2 +-
...format-nvram-qcow2-path.x86_64-latest.args | 2 +-
...-efi-format-nvram-qcow2.x86_64-latest.args | 2 +-
...uto-efi-loader-insecure.x86_64-latest.args | 2 +-
...re-auto-efi-loader-path.x86_64-latest.args | 2 +-
...-auto-efi-loader-secure.x86_64-latest.args | 2 +-
...to-efi-no-enrolled-keys.x86_64-latest.args | 2 +-
...are-auto-efi-no-secboot.x86_64-latest.args | 2 +-
...are-auto-efi-nvram-file.x86_64-latest.args | 2 +-
...efi-nvram-network-iscsi.x86_64-latest.args | 2 +-
...o-efi-nvram-network-nbd.x86_64-latest.args | 2 +-
...firmware-auto-efi-nvram.x86_64-latest.args | 2 +-
...rmware-auto-efi-secboot.x86_64-latest.args | 2 +-
...rmware-auto-efi-smm-off.x86_64-latest.args | 2 +-
...ware-auto-efi-stateless.x86_64-latest.args | 2 +-
.../firmware-auto-efi.x86_64-latest.args | 2 +-
...e-manual-bios-stateless.x86_64-latest.args | 2 +-
.../firmware-manual-bios.x86_64-latest.args | 2 +-
...anual-efi-acpi-aarch64.aarch64-latest.args | 2 +-
...are-manual-efi-acpi-q35.x86_64-latest.args | 2 +-
...are-manual-efi-features.x86_64-latest.args | 2 +-
...anual-efi-loader-secure.x86_64-latest.args | 2 +-
...al-efi-no-enrolled-keys.x86_64-latest.args | 2 +-
...e-manual-efi-no-secboot.x86_64-latest.args | 2 +-
...ual-efi-noacpi-aarch64.aarch64-latest.args | 2 +-
...e-manual-efi-nvram-file.x86_64-latest.args | 2 +-
...efi-nvram-network-iscsi.x86_64-latest.args | 2 +-
...l-efi-nvram-network-nbd.x86_64-latest.args | 2 +-
...nual-efi-nvram-template.x86_64-latest.args | 2 +-
...-manual-efi-rw-implicit.x86_64-latest.args | 2 +-
.../firmware-manual-efi-rw.x86_64-latest.args | 2 +-
...ware-manual-efi-secboot.x86_64-latest.args | 2 +-
...re-manual-efi-stateless.x86_64-latest.args | 2 +-
.../firmware-manual-efi.x86_64-latest.args | 2 +-
...e-manual-noefi-acpi-q35.x86_64-latest.args | 2 +-
...l-noefi-noacpi-aarch64.aarch64-latest.args | 2 +-
...manual-noefi-noacpi-q35.x86_64-latest.args | 2 +-
.../floppy-drive-fat.x86_64-latest.args | 2 +-
.../fs9p-ccw.s390x-latest.args | 2 +-
.../qemuxml2argvdata/fs9p.x86_64-latest.args | 2 +-
.../genid-auto.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/genid.x86_64-latest.args | 2 +-
.../graphics-dbus-address.args | 2 +-
.../qemuxml2argvdata/graphics-dbus-audio.args | 2 +-
.../graphics-dbus-chardev.args | 2 +-
tests/qemuxml2argvdata/graphics-dbus-p2p.args | 2 +-
.../graphics-dbus-usbredir.args | 2 +-
tests/qemuxml2argvdata/graphics-dbus.args | 2 +-
...egl-headless-rendernode.x86_64-latest.args | 2 +-
.../graphics-egl-headless.args | 2 +-
.../graphics-egl-headless.x86_64-latest.args | 2 +-
.../graphics-sdl-fullscreen.args | 2 +-
tests/qemuxml2argvdata/graphics-sdl.args | 2 +-
...s-spice-agent-file-xfer.x86_64-latest.args | 2 +-
...aphics-spice-agentmouse.x86_64-latest.args | 2 +-
...s-spice-auto-socket-cfg.x86_64-latest.args | 2 +-
...phics-spice-auto-socket.x86_64-latest.args | 2 +-
...phics-spice-compression.x86_64-latest.args | 2 +-
...hics-spice-egl-headless.x86_64-latest.args | 2 +-
...pice-gl-auto-rendernode.x86_64-latest.args | 2 +-
.../graphics-spice-no-args.x86_64-latest.args | 2 +-
.../graphics-spice-qxl-vga.x86_64-latest.args | 2 +-
.../graphics-spice-sasl.x86_64-latest.args | 2 +-
.../graphics-spice-socket.x86_64-latest.args | 2 +-
.../graphics-spice-timeout.x86_64-latest.args | 2 +-
...raphics-spice-usb-redir.x86_64-latest.args | 2 +-
.../graphics-spice.x86_64-latest.args | 2 +-
...ics-vnc-auto-socket-cfg.x86_64-latest.args | 2 +-
...raphics-vnc-auto-socket.x86_64-latest.args | 2 +-
...aphics-vnc-egl-headless.x86_64-latest.args | 2 +-
...hics-vnc-no-listen-attr.x86_64-latest.args | 2 +-
.../graphics-vnc-none.x86_64-latest.args | 2 +-
.../graphics-vnc-policy.x86_64-latest.args | 2 +-
.../graphics-vnc-power.x86_64-latest.args | 2 +-
...remove-generated-socket.x86_64-latest.args | 2 +-
.../graphics-vnc-sasl.x86_64-latest.args | 2 +-
...-vnc-socket-new-cmdline.x86_64-latest.args | 2 +-
.../graphics-vnc-socket.x86_64-latest.args | 2 +-
.../graphics-vnc-tls-secret.x86_64-5.2.0.args | 2 +-
...graphics-vnc-tls-secret.x86_64-latest.args | 2 +-
.../graphics-vnc-tls.x86_64-latest.args | 2 +-
.../graphics-vnc-websocket.x86_64-latest.args | 2 +-
.../graphics-vnc.x86_64-latest.args | 2 +-
...tdev-mdev-display-ramfb.x86_64-latest.args | 2 +-
...play-spice-egl-headless.x86_64-latest.args | 2 +-
...ev-display-spice-opengl.x86_64-latest.args | 2 +-
...isplay-vnc-egl-headless.x86_64-latest.args | 2 +-
...ostdev-mdev-display-vnc.x86_64-latest.args | 2 +-
.../hostdev-mdev-precreated.args | 2 +-
...tdev-pci-address-device.x86_64-latest.args | 2 +-
.../hostdev-pci-address-unassigned.args | 2 +-
.../hostdev-pci-address.x86_64-latest.args | 2 +-
.../hostdev-pci-multifunction.args | 2 +-
.../hostdev-scsi-lsi.x86_64-latest.args | 2 +-
...tdev-scsi-vhost-scsi-ccw.s390x-latest.args | 2 +-
.../hostdev-scsi-vhost-scsi-pci.args | 2 +-
...dev-scsi-vhost-scsi-pcie.x86_64-4.2.0.args | 2 +-
...ev-scsi-vhost-scsi-pcie.x86_64-latest.args | 2 +-
...ostdev-scsi-virtio-scsi.x86_64-latest.args | 2 +-
...tdev-subsys-mdev-vfio-ap.s390x-latest.args | 2 +-
...ubsys-mdev-vfio-ccw-boot.s390x-latest.args | 2 +-
...dev-subsys-mdev-vfio-ccw.s390x-latest.args | 2 +-
...usb-address-device-boot.x86_64-latest.args | 2 +-
...tdev-usb-address-device.x86_64-latest.args | 2 +-
.../hostdev-usb-address.x86_64-latest.args | 2 +-
.../hostdev-vfio-multidomain.args | 2 +-
...o-zpci-autogenerate-fids.s390x-latest.args | 2 +-
...o-zpci-autogenerate-uids.s390x-latest.args | 2 +-
...v-vfio-zpci-autogenerate.s390x-latest.args | 2 +-
...dev-vfio-zpci-boundaries.s390x-latest.args | 2 +-
...vfio-zpci-ccw-memballoon.s390x-latest.args | 2 +-
...io-zpci-multidomain-many.s390x-latest.args | 2 +-
.../hostdev-vfio-zpci.s390x-latest.args | 2 +-
tests/qemuxml2argvdata/hostdev-vfio.args | 2 +-
tests/qemuxml2argvdata/hotplug-base.args | 2 +-
.../hugepages-default-2M.x86_64-latest.args | 2 +-
...ges-default-system-size.x86_64-latest.args | 2 +-
.../hugepages-default.x86_64-latest.args | 2 +-
.../hugepages-memaccess3.x86_64-latest.args | 2 +-
.../hugepages-nodeset.x86_64-latest.args | 2 +-
...gepages-numa-default-2M.x86_64-latest.args | 2 +-
.../hugepages-numa-default.x86_64-latest.args | 2 +-
...pages-numa-nodeset-part.x86_64-latest.args | 2 +-
.../hugepages-numa-nodeset.x86_64-latest.args | 2 +-
.../hugepages-shared.x86_64-latest.args | 2 +-
...-aarch64-virt-headless.aarch64-latest.args | 2 +-
...hvf-x86_64-q35-headless.x86_64-latest.args | 2 +-
.../hyperv-off.x86_64-latest.args | 2 +-
.../hyperv-panic.x86_64-latest.args | 2 +-
.../hyperv-passthrough.x86_64-6.1.0.args | 2 +-
.../hyperv-passthrough.x86_64-latest.args | 2 +-
.../hyperv-stimer-direct.x86_64-latest.args | 2 +-
.../hyperv.x86_64-latest.args | 2 +-
.../input-linux.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/input-usbmouse-addr.args | 2 +-
tests/qemuxml2argvdata/input-usbmouse.args | 2 +-
tests/qemuxml2argvdata/input-usbtablet.args | 2 +-
.../input-virtio-ccw.s390x-latest.args | 2 +-
.../intel-iommu-aw-bits.x86_64-latest.args | 2 +-
...ntel-iommu-caching-mode.x86_64-latest.args | 2 +-
...ntel-iommu-device-iotlb.x86_64-latest.args | 2 +-
.../intel-iommu-eim.x86_64-latest.args | 2 +-
.../intel-iommu.x86_64-latest.args | 2 +-
.../iommu-smmuv3.aarch64-latest.args | 2 +-
...iothreads-disk-virtio-ccw.s390x-4.2.0.args | 2 +-
.../iothreads-disk.x86_64-latest.args | 2 +-
.../iothreads-ids-partial.x86_64-latest.args | 2 +-
...othreads-ids-pool-sizes.x86_64-latest.args | 2 +-
.../iothreads-ids.x86_64-latest.args | 2 +-
...othreads-virtio-scsi-ccw.s390x-latest.args | 2 +-
...othreads-virtio-scsi-pci.x86_64-5.2.0.args | 2 +-
...threads-virtio-scsi-pci.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/kvm-features-off.args | 2 +-
tests/qemuxml2argvdata/kvm-features.args | 2 +-
tests/qemuxml2argvdata/kvm-pit-delay.args | 2 +-
tests/qemuxml2argvdata/kvm-pit-discard.args | 2 +-
.../kvmclock+eoi-disabled.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/kvmclock.args | 2 +-
.../launch-security-s390-pv.s390x-latest.args | 2 +-
...nch-security-sev-direct.x86_64-latest.args | 2 +-
...ev-missing-platform-info.x86_64-6.0.0.args | 2 +-
.../launch-security-sev.x86_64-6.0.0.args | 2 +-
.../luks-disks-source-qcow2.x86_64-5.2.0.args | 2 +-
...luks-disks-source-qcow2.x86_64-latest.args | 2 +-
.../luks-disks-source.x86_64-latest.args | 2 +-
.../luks-disks.x86_64-latest.args | 2 +-
...ch-virt-console-native.aarch64-latest.args | 2 +-
...ch-virt-console-virtio.aarch64-latest.args | 2 +-
...-serial+console-native.aarch64-latest.args | 2 +-
...ach-virt-serial-compat.aarch64-latest.args | 2 +-
...ach-virt-serial-native.aarch64-latest.args | 2 +-
.../mach-virt-serial-pci.aarch64-latest.args | 2 +-
.../mach-virt-serial-usb.aarch64-latest.args | 2 +-
...chine-aeskeywrap-off-cap.s390x-latest.args | 2 +-
...hine-aeskeywrap-off-caps.s390x-latest.args | 2 +-
...achine-aeskeywrap-on-cap.s390x-latest.args | 2 +-
...chine-aeskeywrap-on-caps.s390x-latest.args | 2 +-
tests/qemuxml2argvdata/machine-aliases1.args | 2 +-
tests/qemuxml2argvdata/machine-aliases2.args | 2 +-
tests/qemuxml2argvdata/machine-core-off.args | 2 +-
tests/qemuxml2argvdata/machine-core-on.args | 2 +-
...chine-deakeywrap-off-cap.s390x-latest.args | 2 +-
...hine-deakeywrap-off-caps.s390x-latest.args | 2 +-
...achine-deakeywrap-on-cap.s390x-latest.args | 2 +-
...chine-deakeywrap-on-caps.s390x-latest.args | 2 +-
...achine-keywrap-none-caps.s390x-latest.args | 2 +-
.../machine-keywrap-none.s390x-latest.args | 2 +-
...machine-loadparm-hostdev.s390x-latest.args | 2 +-
...multiple-disks-nets-s390.s390x-latest.args | 2 +-
...achine-loadparm-net-s390.s390x-latest.args | 2 +-
.../machine-loadparm-s390.s390x-latest.args | 2 +-
.../machine-smm-off.x86_64-latest.args | 2 +-
.../machine-smm-on.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/machine-vmport-opt.args | 2 +-
tests/qemuxml2argvdata/master-key.args | 2 +-
...memory-default-hugepage.x86_64-latest.args | 2 +-
...memory-hotplug-multiple.x86_64-latest.args | 46 ++++++++++
.../memory-hotplug-multiple.xml | 89 ++++++++++++++++++
...mory-hotplug-virtio-mem.x86_64-latest.args | 2 +-
.../memory-hotplug-virtio-mem.xml | 2 +-
...mory-hotplug-virtio-pmem.x86_64-5.2.0.args | 2 +-
...ory-hotplug-virtio-pmem.x86_64-latest.args | 2 +-
.../memory-hotplug-virtio-pmem.xml | 2 +-
tests/qemuxml2argvdata/memtune-unlimited.args | 2 +-
tests/qemuxml2argvdata/memtune.args | 2 +-
.../migrate-numa-unaligned.args | 2 +-
tests/qemuxml2argvdata/migrate.args | 2 +-
tests/qemuxml2argvdata/minimal.args | 2 +-
tests/qemuxml2argvdata/misc-acpi.args | 2 +-
tests/qemuxml2argvdata/misc-disable-s3.args | 2 +-
.../misc-disable-suspends.args | 2 +-
tests/qemuxml2argvdata/misc-enable-s4.args | 2 +-
.../misc-no-reboot.x86_64-5.2.0.args | 2 +-
.../misc-no-reboot.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/misc-uuid.args | 2 +-
.../mlock-off.x86_64-latest.args | 2 +-
.../mlock-on.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/monitor-json.args | 2 +-
.../multifunction-pci-device.args | 2 +-
.../name-escape.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/net-client.args | 2 +-
tests/qemuxml2argvdata/net-eth-hostip.args | 2 +-
tests/qemuxml2argvdata/net-eth-ifname.args | 2 +-
tests/qemuxml2argvdata/net-eth-names.args | 2 +-
.../net-eth-unmanaged-tap.args | 2 +-
tests/qemuxml2argvdata/net-eth.args | 2 +-
.../net-hostdev-bootorder.args | 2 +-
.../net-hostdev-multidomain.args | 2 +-
.../net-hostdev-vfio-multidomain.args | 2 +-
tests/qemuxml2argvdata/net-hostdev-vfio.args | 2 +-
tests/qemuxml2argvdata/net-hostdev.args | 2 +-
tests/qemuxml2argvdata/net-many-models.args | 2 +-
tests/qemuxml2argvdata/net-mcast.args | 2 +-
tests/qemuxml2argvdata/net-server.args | 2 +-
tests/qemuxml2argvdata/net-udp.args | 2 +-
tests/qemuxml2argvdata/net-user-addr.args | 2 +-
.../net-user-passt.x86_64-7.2.0.args | 2 +-
.../net-user-passt.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/net-user.args | 2 +-
.../net-user.x86_64-latest.args | 2 +-
.../net-vdpa-multiqueue.x86_64-latest.args | 2 +-
.../net-vdpa.x86_64-latest.args | 2 +-
.../net-vhostuser-multiq.args | 2 +-
tests/qemuxml2argvdata/net-vhostuser.args | 2 +-
.../net-vhostuser.x86_64-latest.args | 2 +-
.../net-virtio-ccw.s390x-latest.args | 2 +-
tests/qemuxml2argvdata/net-virtio-device.args | 2 +-
.../net-virtio-disable-offloads.args | 2 +-
tests/qemuxml2argvdata/net-virtio-netdev.args | 2 +-
.../net-virtio-rss.x86_64-latest.args | 2 +-
.../net-virtio-rxtxqueuesize.args | 2 +-
.../net-virtio-teaming-hostdev.args | 2 +-
.../qemuxml2argvdata/net-virtio-teaming.args | 2 +-
tests/qemuxml2argvdata/net-virtio.args | 2 +-
tests/qemuxml2argvdata/nosharepages.args | 2 +-
.../numad-auto-memory-vcpu-cpuset.args | 2 +-
...o-memory-vcpu-no-cpuset-and-placement.args | 2 +-
.../numad-auto-vcpu-static-numatune.args | 2 +-
.../numad-static-memory-auto-vcpu.args | 2 +-
tests/qemuxml2argvdata/numad.args | 2 +-
.../numatune-auto-nodeset-invalid.args | 2 +-
.../numatune-auto-prefer.args | 2 +-
.../qemuxml2argvdata/numatune-distances.args | 2 +-
.../numatune-hmat-none.x86_64-latest.args | 2 +-
.../numatune-hmat.x86_64-latest.args | 2 +-
.../numatune-memnode-no-memory.args | 2 +-
...emnode-restrictive-mode.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/numatune-memnode.args | 2 +-
.../numatune-memnode.x86_64-5.2.0.args | 2 +-
.../numatune-memnode.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/numatune-memory.args | 2 +-
tests/qemuxml2argvdata/numatune-no-vcpu.args | 2 +-
.../numatune-system-memory.x86_64-latest.args | 2 +-
...pages-discard-hugepages.x86_64-latest.args | 2 +-
.../pages-discard.x86_64-latest.args | 2 +-
.../panic-double.x86_64-latest.args | 2 +-
.../panic-no-address.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/panic.x86_64-latest.args | 2 +-
.../parallel-parport-chardev.args | 2 +-
...arallel-parport-chardev.x86_64-latest.args | 2 +-
.../parallel-tcp-chardev.args | 2 +-
.../parallel-tcp-chardev.x86_64-latest.args | 2 +-
.../parallel-unix-chardev.x86_64-latest.args | 2 +-
...pi-root-hotplug-disable.x86_64-latest.args | 2 +-
...cpi-root-hotplug-enable.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/pci-autoadd-addr.args | 2 +-
tests/qemuxml2argvdata/pci-autoadd-idx.args | 2 +-
tests/qemuxml2argvdata/pci-autofill-addr.args | 2 +-
.../pci-bridge-many-disks.args | 2 +-
tests/qemuxml2argvdata/pci-bridge.args | 2 +-
tests/qemuxml2argvdata/pci-expander-bus.args | 2 +-
tests/qemuxml2argvdata/pci-many.args | 2 +-
tests/qemuxml2argvdata/pci-rom-disabled.args | 2 +-
tests/qemuxml2argvdata/pci-rom.args | 2 +-
.../pci-serial-dev-chardev.args | 2 +-
.../pci-serial-dev-chardev.x86_64-latest.args | 2 +-
...e-expander-bus-aarch64.aarch64-latest.args | 2 +-
tests/qemuxml2argvdata/pcie-expander-bus.args | 2 +-
.../pcie-root-port-model-generic.args | 2 +-
.../pcie-root-port-model-ioh3420.args | 2 +-
...cie-root-port-nohotplug.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/pcie-root-port.args | 2 +-
tests/qemuxml2argvdata/pcie-root.args | 2 +-
.../pcie-switch-downstream-port.args | 2 +-
.../pcie-switch-upstream-port.args | 2 +-
tests/qemuxml2argvdata/pcihole64-q35.args | 2 +-
tests/qemuxml2argvdata/pcihole64.args | 2 +-
tests/qemuxml2argvdata/pmu-feature-off.args | 2 +-
tests/qemuxml2argvdata/pmu-feature.args | 2 +-
.../qemuxml2argvdata/ppc-dtb.ppc-latest.args | 2 +-
...ault-cpu-kvm-pseries-2.7.ppc64-latest.args | 2 +-
...ault-cpu-kvm-pseries-3.1.ppc64-latest.args | 2 +-
...ault-cpu-kvm-pseries-4.2.ppc64-latest.args | 2 +-
...ault-cpu-tcg-pseries-2.7.ppc64-latest.args | 2 +-
...ault-cpu-tcg-pseries-3.1.ppc64-latest.args | 2 +-
...ault-cpu-tcg-pseries-4.2.ppc64-latest.args | 2 +-
.../ppc64-pseries-graphics.ppc64-latest.args | 2 +-
.../ppc64-pseries-headless.ppc64-latest.args | 2 +-
.../ppc64-tpmproxy-single.ppc64-latest.args | 2 +-
.../ppc64-tpmproxy-with-tpm.ppc64-latest.args | 2 +-
...64-usb-controller-legacy.ppc64-latest.args | 2 +-
.../ppc64-usb-controller-qemu-xhci.args | 2 +-
.../ppc64-usb-controller.ppc64-latest.args | 2 +-
.../ppce500-serial.ppc-latest.args | 2 +-
.../pseries-basic.ppc64-latest.args | 2 +-
.../pseries-console-virtio.ppc64-latest.args | 2 +-
...eries-cpu-compat-power10.ppc64-latest.args | 2 +-
...series-cpu-compat-power9.ppc64-latest.args | 2 +-
.../pseries-cpu-compat.ppc64-latest.args | 2 +-
.../pseries-cpu-exact.ppc64-latest.args | 2 +-
.../pseries-cpu-le.ppc64-latest.args | 2 +-
.../pseries-features.ppc64-4.2.0.args | 2 +-
.../pseries-features.ppc64-latest.args | 2 +-
.../pseries-hostdevs-1.ppc64-latest.args | 2 +-
.../pseries-hostdevs-2.ppc64-latest.args | 2 +-
.../pseries-hostdevs-3.ppc64-latest.args | 2 +-
.../pseries-many-buses-1.ppc64-latest.args | 2 +-
.../pseries-many-buses-2.ppc64-latest.args | 2 +-
.../pseries-many-devices.ppc64-latest.args | 2 +-
.../pseries-nvram.ppc64-latest.args | 2 +-
.../pseries-panic-missing.ppc64-latest.args | 2 +-
...pseries-panic-no-address.ppc64-latest.args | 2 +-
...ries-phb-default-missing.ppc64-latest.args | 2 +-
.../pseries-phb-numa-node.ppc64-latest.args | 2 +-
.../pseries-phb-simple.ppc64-latest.args | 2 +-
.../pseries-serial-native.ppc64-latest.args | 2 +-
.../pseries-serial-pci.ppc64-latest.args | 2 +-
.../pseries-serial-usb.ppc64-latest.args | 2 +-
.../pseries-usb-default.ppc64-latest.args | 2 +-
.../pseries-usb-kbd.ppc64-latest.args | 2 +-
.../pseries-usb-multi.ppc64-latest.args | 2 +-
...series-vio-user-assigned.ppc64-latest.args | 2 +-
.../pseries-vio.ppc64-latest.args | 2 +-
.../pv-spinlock-disabled.x86_64-latest.args | 2 +-
.../pv-spinlock-enabled.x86_64-latest.args | 2 +-
.../pvpanic-pci-aarch64.aarch64-latest.args | 2 +-
...pci-no-address-aarch64.aarch64-latest.args | 2 +-
.../pvpanic-pci-x86_64.x86_64-latest.args | 2 +-
...q35-default-devices-only.x86_64-4.2.0.args | 2 +-
...35-default-devices-only.x86_64-latest.args | 2 +-
.../q35-multifunction.x86_64-4.2.0.args | 2 +-
.../q35-multifunction.x86_64-latest.args | 2 +-
.../q35-pci-force-address.args | 2 +-
.../q35-pcie-autoadd.x86_64-4.2.0.args | 2 +-
.../q35-pcie-autoadd.x86_64-latest.args | 2 +-
.../q35-pcie.x86_64-4.2.0.args | 2 +-
.../q35-pcie.x86_64-latest.args | 2 +-
.../q35-pm-disable-fallback.args | 2 +-
tests/qemuxml2argvdata/q35-pm-disable.args | 2 +-
tests/qemuxml2argvdata/q35-usb2-multi.args | 2 +-
tests/qemuxml2argvdata/q35-usb2-reorder.args | 2 +-
tests/qemuxml2argvdata/q35-usb2.args | 2 +-
.../q35-virt-manager-basic.x86_64-4.2.0.args | 2 +-
.../q35-virt-manager-basic.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/q35.args | 2 +-
tests/qemuxml2argvdata/qemu-ns-alt.args | 2 +-
.../qemu-ns-commandline-ns0.args | 2 +-
.../qemu-ns-commandline-ns1.args | 2 +-
.../qemuxml2argvdata/qemu-ns-commandline.args | 2 +-
.../qemu-ns-domain-commandline-ns0.args | 2 +-
.../qemu-ns-domain-commandline.args | 2 +-
.../qemuxml2argvdata/qemu-ns-domain-ns0.args | 2 +-
tests/qemuxml2argvdata/qemu-ns-no-env.args | 2 +-
.../qemu-ns.x86_64-latest.args | 2 +-
.../reboot-timeout-disabled.args | 2 +-
.../reboot-timeout-enabled.args | 2 +-
tests/qemuxml2argvdata/restore-v2-fd.args | 2 +-
tests/qemuxml2argvdata/restore-v2.args | 2 +-
.../riscv64-virt-graphics.riscv64-latest.args | 2 +-
.../riscv64-virt-headless.riscv64-latest.args | 2 +-
.../riscv64-virt-pci.riscv64-latest.args | 2 +-
.../riscv64-virt.riscv64-latest.args | 2 +-
...low-bogus-usb-controller.s390x-latest.args | 2 +-
...390-allow-bogus-usb-none.s390x-latest.args | 2 +-
...t-cpu-kvm-ccw-virtio-2.7.s390x-latest.args | 2 +-
...t-cpu-kvm-ccw-virtio-4.2.s390x-latest.args | 2 +-
...t-cpu-tcg-ccw-virtio-2.7.s390x-latest.args | 2 +-
...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 2 +-
.../s390-panic-missing.s390x-latest.args | 2 +-
.../s390-panic-no-address.s390x-latest.args | 2 +-
.../s390-serial-2.s390x-latest.args | 2 +-
.../s390-serial-console.s390x-latest.args | 2 +-
.../s390-serial.s390x-latest.args | 2 +-
.../s390x-ccw-graphics.s390x-latest.args | 2 +-
.../s390x-ccw-headless.s390x-latest.args | 2 +-
tests/qemuxml2argvdata/seclabel-dac-none.args | 2 +-
.../seclabel-dynamic-baselabel.args | 2 +-
.../seclabel-dynamic-labelskip.args | 2 +-
.../seclabel-dynamic-override.args | 2 +-
.../seclabel-dynamic-relabel.args | 2 +-
tests/qemuxml2argvdata/seclabel-dynamic.args | 2 +-
tests/qemuxml2argvdata/seclabel-none.args | 2 +-
.../seclabel-static-labelskip.args | 2 +-
.../seclabel-static-relabel.args | 2 +-
tests/qemuxml2argvdata/seclabel-static.args | 2 +-
.../serial-debugcon.x86_64-latest.args | 2 +-
.../serial-dev-chardev-iobase.args | 2 +-
...rial-dev-chardev-iobase.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/serial-dev-chardev.args | 2 +-
.../serial-dev-chardev.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/serial-file-chardev.args | 2 +-
.../serial-file-chardev.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/serial-file-log.args | 2 +-
.../serial-file-log.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/serial-many-chardev.args | 2 +-
.../serial-many-chardev.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/serial-pty-chardev.args | 2 +-
.../serial-pty-chardev.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/serial-spiceport.args | 2 +-
.../serial-spiceport.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/serial-tcp-chardev.args | 2 +-
.../serial-tcp-chardev.x86_64-latest.args | 2 +-
.../serial-tcp-telnet-chardev.args | 2 +-
...rial-tcp-telnet-chardev.x86_64-latest.args | 2 +-
.../serial-tcp-tlsx509-chardev-notls.args | 2 +-
...p-tlsx509-chardev-notls.x86_64-latest.args | 2 +-
.../serial-tcp-tlsx509-chardev-verify.args | 2 +-
...-tlsx509-chardev-verify.x86_64-latest.args | 2 +-
.../serial-tcp-tlsx509-chardev.args | 2 +-
...ial-tcp-tlsx509-chardev.x86_64-latest.args | 2 +-
.../serial-tcp-tlsx509-secret-chardev.args | 2 +-
...-tlsx509-secret-chardev.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/serial-udp-chardev.args | 2 +-
.../serial-udp-chardev.x86_64-latest.args | 2 +-
.../qemuxml2argvdata/serial-unix-chardev.args | 2 +-
.../serial-unix-chardev.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/serial-vc-chardev.args | 2 +-
.../serial-vc-chardev.x86_64-latest.args | 2 +-
.../shmem-plain-doorbell.args | 2 +-
tests/qemuxml2argvdata/shmem.args | 2 +-
.../smartcard-controller.args | 2 +-
.../smartcard-host-certificates-database.args | 2 +-
.../smartcard-host-certificates.args | 2 +-
tests/qemuxml2argvdata/smartcard-host.args | 2 +-
.../smartcard-passthrough-spicevmc.args | 2 +-
.../smartcard-passthrough-tcp.args | 2 +-
...rtcard-passthrough-unix.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/smbios-type-fwcfg.args | 2 +-
tests/qemuxml2argvdata/smbios.args | 2 +-
tests/qemuxml2argvdata/smp-dies.args | 2 +-
tests/qemuxml2argvdata/smp.args | 2 +-
.../sound-device.x86_64-4.2.0.args | 2 +-
.../sound-device.x86_64-latest.args | 2 +-
.../sparc-minimal.sparc-latest.args | 2 +-
.../tpm-emulator-spapr.ppc64-latest.args | 2 +-
.../tpm-emulator-tpm2-enc.x86_64-latest.args | 2 +-
...pm-emulator-tpm2-pstate.x86_64-latest.args | 2 +-
.../tpm-emulator-tpm2.x86_64-latest.args | 2 +-
.../tpm-emulator.x86_64-latest.args | 2 +-
.../tpm-external.x86_64-latest.args | 2 +-
.../tpm-passthrough-crb.x86_64-latest.args | 2 +-
.../tpm-passthrough.x86_64-latest.args | 2 +-
.../tseg-explicit-size.x86_64-latest.args | 2 +-
.../usb-controller-default-q35.args | 2 +-
.../usb-controller-explicit-q35.args | 2 +-
.../usb-controller-qemu-xhci.args | 2 +-
.../qemuxml2argvdata/usb-controller-xhci.args | 2 +-
tests/qemuxml2argvdata/usb-controller.args | 2 +-
.../usb-hub-autoadd-deluxe.args | 2 +-
tests/qemuxml2argvdata/usb-hub-autoadd.args | 2 +-
tests/qemuxml2argvdata/usb-hub.args | 2 +-
.../qemuxml2argvdata/usb-ich9-autoassign.args | 2 +-
.../qemuxml2argvdata/usb-ich9-companion.args | 2 +-
.../qemuxml2argvdata/usb-ich9-ehci-addr.args | 2 +-
.../qemuxml2argvdata/usb-long-port-path.args | 2 +-
tests/qemuxml2argvdata/usb-none.args | 2 +-
.../usb-piix3-controller.args | 2 +-
.../qemuxml2argvdata/usb-port-autoassign.args | 2 +-
tests/qemuxml2argvdata/usb-port-missing.args | 2 +-
tests/qemuxml2argvdata/usb-ports.args | 2 +-
tests/qemuxml2argvdata/usb-redir-boot.args | 2 +-
.../usb-redir-filter-version.args | 2 +-
tests/qemuxml2argvdata/usb-redir-filter.args | 2 +-
.../usb-redir-unix.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/usb-redir.args | 2 +-
.../qemuxml2argvdata/usb-xhci-autoassign.args | 2 +-
tests/qemuxml2argvdata/usb1-usb2.args | 2 +-
.../user-aliases-usb.x86_64-latest.args | 2 +-
.../user-aliases.x86_64-latest.args | 2 +-
.../user-aliases2.x86_64-latest.args | 2 +-
.../vcpu-placement-static.x86_64-latest.args | 2 +-
...vhost-user-fs-fd-memory.x86_64-latest.args | 2 +-
...vhost-user-fs-hugepages.x86_64-latest.args | 2 +-
...host-user-gpu-secondary.x86_64-latest.args | 2 +-
.../vhost-user-vga.x86_64-latest.args | 2 +-
.../vhost-vsock-auto.x86_64-latest.args | 2 +-
.../vhost-vsock-ccw-auto.s390x-latest.args | 2 +-
.../vhost-vsock-ccw-iommu.s390x-latest.args | 2 +-
.../vhost-vsock-ccw.s390x-latest.args | 2 +-
.../vhost-vsock.x86_64-latest.args | 2 +-
...eo-bochs-display-device.x86_64-latest.args | 2 +-
.../video-device-pciaddr-default.args | 2 +-
tests/qemuxml2argvdata/video-none-device.args | 2 +-
.../video-qxl-device-vgamem.args | 2 +-
...video-qxl-device-vram64.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/video-qxl-device.args | 2 +-
tests/qemuxml2argvdata/video-qxl-heads.args | 2 +-
tests/qemuxml2argvdata/video-qxl-noheads.args | 2 +-
.../video-qxl-resolution.args | 2 +-
.../video-qxl-sec-device-vgamem.args | 2 +-
...o-qxl-sec-device-vram64.x86_64-latest.args | 2 +-
.../video-qxl-sec-device.args | 2 +-
...eo-ramfb-display-device.x86_64-latest.args | 2 +-
.../video-vga-device-vgamem.args | 2 +-
tests/qemuxml2argvdata/video-vga-device.args | 2 +-
.../qemuxml2argvdata/video-vga-qxl-heads.args | 2 +-
.../video-virtio-blob-off.x86_64-latest.args | 2 +-
.../video-virtio-blob-on.x86_64-latest.args | 2 +-
.../video-virtio-gpu-ccw.s390x-latest.args | 2 +-
.../video-virtio-gpu-device.args | 2 +-
.../video-virtio-gpu-sdl-gl.args | 2 +-
.../video-virtio-gpu-secondary.args | 2 +-
.../video-virtio-gpu-spice-gl.args | 2 +-
.../video-virtio-gpu-virgl.args | 2 +-
...video-virtio-vga-gpu-gl.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/video-virtio-vga.args | 2 +-
.../virtio-9p-createmode.x86_64-latest.args | 2 +-
.../virtio-9p-multidevs.x86_64-latest.args | 2 +-
.../virtio-input-passthrough.args | 2 +-
tests/qemuxml2argvdata/virtio-input.args | 2 +-
.../virtio-iommu-aarch64.aarch64-latest.args | 2 +-
.../virtio-iommu-x86_64.x86_64-latest.args | 2 +-
.../virtio-lun.x86_64-latest.args | 2 +-
...virtio-non-transitional.x86_64-latest.args | 2 +-
...-options-controller-ats.x86_64-latest.args | 2 +-
...ptions-controller-iommu.x86_64-latest.args | 2 +-
...tions-controller-packed.x86_64-latest.args | 2 +-
...virtio-options-disk-ats.x86_64-latest.args | 2 +-
...rtio-options-disk-iommu.x86_64-latest.args | 2 +-
...tio-options-disk-packed.x86_64-latest.args | 2 +-
.../virtio-options-fs-ats.x86_64-latest.args | 2 +-
...virtio-options-fs-iommu.x86_64-latest.args | 2 +-
...irtio-options-fs-packed.x86_64-latest.args | 2 +-
...irtio-options-input-ats.x86_64-latest.args | 2 +-
...tio-options-input-iommu.x86_64-latest.args | 2 +-
...io-options-input-packed.x86_64-latest.args | 2 +-
...-options-memballoon-ats.x86_64-latest.args | 2 +-
...loon-freepage-reporting.x86_64-latest.args | 2 +-
...ptions-memballoon-iommu.x86_64-latest.args | 2 +-
...tions-memballoon-packed.x86_64-latest.args | 2 +-
.../virtio-options-net-ats.x86_64-latest.args | 2 +-
...irtio-options-net-iommu.x86_64-latest.args | 2 +-
...rtio-options-net-packed.x86_64-latest.args | 2 +-
.../virtio-options-rng-ats.x86_64-latest.args | 2 +-
...irtio-options-rng-iommu.x86_64-latest.args | 2 +-
...rtio-options-rng-packed.x86_64-latest.args | 2 +-
...irtio-options-video-ats.x86_64-latest.args | 2 +-
...tio-options-video-iommu.x86_64-latest.args | 2 +-
...io-options-video-packed.x86_64-latest.args | 2 +-
.../virtio-options.x86_64-latest.args | 2 +-
.../virtio-rng-builtin.x86_64-5.2.0.args | 2 +-
.../virtio-rng-builtin.x86_64-latest.args | 2 +-
.../virtio-rng-ccw.s390x-latest.args | 2 +-
.../qemuxml2argvdata/virtio-rng-default.args | 2 +-
.../virtio-rng-egd-unix.x86_64-5.2.0.args | 2 +-
.../virtio-rng-egd-unix.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/virtio-rng-egd.args | 2 +-
.../qemuxml2argvdata/virtio-rng-multiple.args | 2 +-
tests/qemuxml2argvdata/virtio-rng-random.args | 2 +-
.../virtio-transitional.x86_64-latest.args | 2 +-
tests/qemuxml2argvdata/vmcoreinfo.args | 2 +-
.../watchdog-device.x86_64-latest.args | 2 +-
.../watchdog-diag288.s390x-latest.args | 2 +-
.../watchdog-dump.x86_64-latest.args | 2 +-
.../watchdog-injectnmi.x86_64-latest.args | 2 +-
.../watchdog-q35-multiple.x86_64-latest.args | 2 +-
.../watchdog.x86_64-latest.args | 2 +-
.../x86-kvm-32-on-64.x86_64-latest.args | 2 +-
...-default-cpu-kvm-pc-4.2.x86_64-latest.args | 2 +-
...default-cpu-kvm-q35-4.2.x86_64-latest.args | 2 +-
...efault-cpu-tcg-features.x86_64-latest.args | 2 +-
...-default-cpu-tcg-pc-4.2.x86_64-latest.args | 2 +-
...default-cpu-tcg-q35-4.2.x86_64-latest.args | 2 +-
.../x86_64-pc-graphics.x86_64-latest.args | 2 +-
.../x86_64-pc-headless.x86_64-latest.args | 2 +-
.../x86_64-q35-graphics.x86_64-latest.args | 2 +-
.../x86_64-q35-headless.x86_64-latest.args | 2 +-
tests/qemuxml2argvtest.c | 1 +
.../memory-hotplug-multiple.x86_64-latest.xml | 90 +++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
906 files changed, 1180 insertions(+), 920 deletions(-)
create mode 100644 tests/qemuxml2argvdata/memory-hotplug-multiple.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/memory-hotplug-multiple.xml
create mode 100644 tests/qemuxml2xmloutdata/memory-hotplug-multiple.x86_64-latest.xml
--
2.40.1
2
5
numad is removed from Fedora 39. Upstream is dead
https://src.fedoraproject.org/rpms/numad/c/a6bb891e8447e3b2a4c63774da94ad0d…
https://pagure.io/releng/failed-composes/issue/4990#comment-857670
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
This powers vcpu and numatune placement='auto'. Anyone know if that's
being actively used in kubevirt, openstack, etc?
libvirt.spec.in | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 1f77cd90b7..5f267a086b 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -173,6 +173,10 @@
%define with_numad 0%{!?_without_numad:1}
%endif
%endif
+%if 0%{?fedora} >= 39
+ # numad is retired in fedora 39+, upstream is dead
+ %define with_numad 0
+%endif
%ifarch %{arches_dmidecode}
%define with_dmidecode 0%{!?_without_dmidecode:1}
--
2.40.1
4
4