[PATCH v4 4/4] tests: update LXC config dataset to support V3 indexes
LXC version 3 config files are still using network old style definition. So, as LXC supports it now, they can be converted to use this new definition. Signed-off-by: Julio Faracco --- .../lxcconf2xml-ethernet-v3.config| 16 - .../lxcconf2xml-fstab-v3.config | 10 +++--- .../lxcconf2xml-macvlannetwork-v3.config | 10 +++--- .../lxcconf2xml-miscnetwork-v3.config | 34 +-- .../lxcconf2xml-nonenetwork-v3.config | 2 +- .../lxcconf2xml-physnetwork-v3.config | 14 .../lxcconf2xml-simple-v3.config | 18 +- .../lxcconf2xml-vlannetwork-v3.config | 10 +++--- 8 files changed, 57 insertions(+), 57 deletions(-) diff --git a/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config index 630cb2ebb6..0a641549f3 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config @@ -1,14 +1,14 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = veth -lxc.network.flags = up -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.name = eth0 -lxc.network.ipv4 = 192.168.122.2/24 -lxc.network.ipv4.gateway = 192.168.122.1 -lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 -lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 +lxc.net.0.type = veth +lxc.net.0.flags = up +lxc.net.0.hwaddr = 02:00:15:8f:05:c1 +lxc.net.0.name = eth0 +lxc.net.0.ipv4 = 192.168.122.2/24 +lxc.net.0.ipv4.gateway = 192.168.122.1 +lxc.net.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 +lxc.net.0.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 #remove next line if host DNS configuration should not be available to container lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0 diff --git a/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config index 8b62818657..79bcfa1bd1 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config @@ -1,11 +1,11 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = veth -lxc.network.flags = up -lxc.network.link = virbr0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.name = eth0 +lxc.net.0.type = veth +lxc.net.0.flags = up +lxc.net.0.link = virbr0 +lxc.net.0.hwaddr = 02:00:15:8f:05:c1 +lxc.net.0.name = eth0 #remove next line if host DNS configuration should not be available to container lxc.mount.fstab = /var/lib/lxc/migrate_test/fstab diff --git a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config index 631f07ecca..ab8d85361f 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config @@ -1,11 +1,11 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = macvlan -lxc.network.flags = up -lxc.network.link = eth0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.macvlan.mode = vepa +lxc.net.0.type = macvlan +lxc.net.0.flags = up +lxc.net.0.link = eth0 +lxc.net.0.hwaddr = 02:00:15:8f:05:c1 +lxc.net.0.macvlan.mode = vepa #remove next line if host DNS configuration should not be available to container lxc.rootfs.path = /var/lib/lxc/migrate_test/rootfs diff --git a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config index b46cb3ee7d..537da64592 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config @@ -1,22 +1,22 @@ -lxc.network.type = phys -lxc.network.link = eth0 -lxc.network.name = eth1 -lxc.network.ipv4 = 192.168.122.2/24 -lxc.network.ipv4.gateway = 192.168.122.1 -lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 -lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 +lxc.net.0.type = phys +lxc.net.0.link = eth0 +lxc.net.0.name = eth1 +lxc.net.0.ipv4 = 192.168.122.2/24 +lxc.net.0.ipv4.gateway = 192.168.122.1 +lxc.net.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 +lxc.net.0.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 -lxc.network.type = vlan -lxc.network.flags = up -lxc.network.link = eth0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.vlan.id = 2 +lxc.net.1.type = vlan +lxc.net.1.flags = up +lxc.net.1.link = eth0 +lxc.net.1.hwaddr = 02:00:15:8f:05:c1 +lxc.net.1.vlan.id = 2 -lxc.network.type = macvlan -lxc.network.flags = up -lxc.network.link = eth0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.macvlan.mode = vepa +lxc.net.2.type = macvlan +lxc.net.2.flags = up +lxc.net.2.link = eth0 +lxc.net.2.hwaddr = 02:00:15:8f:05:c1 +lxc.net.2.macvlan.mode = vepa
[PATCH v4 3/4] lxc: remove domain definition from lxc network struct
Domain definition is useless now inside network structure. This pointer was required because new network definition was being added each time that a new network type appeared. So, this should be processed into old function `lxcNetworkParseDataType()`. Now, as it was moved to an array, it can be handle together each interface pointer. Signed-off-by: Julio Faracco --- src/lxc/lxc_native.c | 17 + 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 8bbe205659..99539a0205 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -414,7 +414,6 @@ lxcCreateHostdevDef(int mode, int type, const char *data) typedef struct _lxcNetworkParseData lxcNetworkParseData; typedef lxcNetworkParseData *lxcNetworkParseDataPtr; struct _lxcNetworkParseData { -virDomainDefPtr def; char *type; char *link; char *mac; @@ -470,13 +469,16 @@ lxcAddNetworkRouteDefinition(const char *address, } static int -lxcAddNetworkDefinition(lxcNetworkParseData *data) +lxcAddNetworkDefinition(virDomainDefPtr def, lxcNetworkParseData *data) { virDomainNetDefPtr net = NULL; virDomainHostdevDefPtr hostdev = NULL; bool isPhys, isVlan = false; size_t i; +if (!data) +return -1; + if ((data->type == NULL) || STREQ(data->type, "empty") || STREQ(data->type, "") || STREQ(data->type, "none")) return 0; @@ -518,9 +520,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) >source.caps.u.net.ip.nroutes) < 0) goto error; -if (VIR_EXPAND_N(data->def->hostdevs, data->def->nhostdevs, 1) < 0) +if (VIR_EXPAND_N(def->hostdevs, def->nhostdevs, 1) < 0) goto error; -data->def->hostdevs[data->def->nhostdevs - 1] = hostdev; +def->hostdevs[def->nhostdevs - 1] = hostdev; } else { if (!(net = lxcCreateNetDef(data->type, data->link, data->mac, data->flag, data->macvlanmode, @@ -542,9 +544,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) >guestIP.nroutes) < 0) goto error; -if (VIR_EXPAND_N(data->def->nets, data->def->nnets, 1) < 0) +if (VIR_EXPAND_N(def->nets, def->nnets, 1) < 0) goto error; -data->def->nets[data->def->nnets - 1] = net; +def->nets[def->nnets - 1] = net; } return 1; @@ -766,9 +768,8 @@ lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties) for (i = 0; i < networks.ndata; i++) { lxcNetworkParseDataPtr data = networks.parseData[i]; -data->def = def; -status = lxcAddNetworkDefinition(data); +status = lxcAddNetworkDefinition(def, data); if (status < 0) goto error; -- 2.20.1
[PATCH v4 2/4] lxc: add LXC version 3 network parser
LXC version 3 or higher introduced indexes for network interfaces. Libvirt should be able to parse entries like `lxc.net.2.KEY`. This commit adds functions to parse this type of field. That's why array structures are so important this time. Signed-off-by: Julio Faracco --- src/lxc/lxc_native.c | 51 1 file changed, 51 insertions(+) diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 31aa666e38..8bbe205659 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -649,6 +649,55 @@ lxcNetworkParseDataSuffix(const char *entry, } +static lxcNetworkParseDataPtr +lxcNetworkGetParseDataByIndex(lxcNetworkParseDataArray *networks, + unsigned int index) +{ +size_t ndata = networks->ndata; +size_t i; + +for (i = 0; i < ndata; i++) { +if (networks->parseData[i]->index == index) +return networks->parseData[i]; +} + +/* Index was not found. So, it is time to add new * + * interface and return this last position. */ +if (VIR_EXPAND_N(networks->parseData, networks->ndata, 1) < 0) +return NULL; + +networks->parseData[ndata] = g_new0(lxcNetworkParseData, 1); +networks->parseData[ndata]->index = index; + +return networks->parseData[ndata]; +} + + +static int +lxcNetworkParseDataEntry(const char *name, + virConfValuePtr value, + lxcNetworkParseDataArray *networks) +{ +lxcNetworkParseData *parseData; +const char *suffix_tmp = STRSKIP(name, "lxc.net."); +char *suffix = NULL; +unsigned long long index; + +if (virStrToLong_ull(suffix_tmp, , 10, ) < 0) +return -1; + +if (suffix[0] != '.') +return -1; + +suffix++; + +if (!(parseData = lxcNetworkGetParseDataByIndex(networks, index))) +return -1; + +return lxcNetworkParseDataSuffix(suffix, value, parseData); +} + + static lxcNetworkParseDataPtr lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks, const char *entry) @@ -695,6 +744,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) if (STRPREFIX(name, "lxc.network.")) return lxcNetworkParseDataEntryLegacy(name, value, networks); +if (STRPREFIX(name, "lxc.net.")) +return lxcNetworkParseDataEntry(name, value, networks); return 0; } -- 2.20.1
[PATCH v4 0/4] This series implement support for network syntax settings for LXC 3.X.
Old: lxc.network.type = veth lxc.network.flags = up lxc.network.link = virbr0 New: lxc.net.0.type = veth lxc.net.0.flags = up lxc.net.0.link = virbr0 v1-v2: Moving sscanf to virStrToLong_ull according Daniel's suggestion. v2-v3: Adding missing g_autofree from `suffix` variable. v2-v4: Removing g_autofree inserted above and adding some missing free functions. See Daniel's test results/comments. Julio Faracco (4): lxc: refactor lxcNetworkParseData pointers to use new structures lxc: add LXC version 3 network parser lxc: remove domain definition from lxc network struct tests: update LXC config dataset to support V3 indexes src/lxc/lxc_native.c | 200 -- .../lxcconf2xml-ethernet-v3.config| 16 +- .../lxcconf2xml-fstab-v3.config | 10 +- .../lxcconf2xml-macvlannetwork-v3.config | 10 +- .../lxcconf2xml-miscnetwork-v3.config | 34 +-- .../lxcconf2xml-nonenetwork-v3.config | 2 +- .../lxcconf2xml-physnetwork-v3.config | 14 +- .../lxcconf2xml-simple-v3.config | 18 +- .../lxcconf2xml-vlannetwork-v3.config | 10 +- 9 files changed, 190 insertions(+), 124 deletions(-) -- 2.20.1
[PATCH v4 1/4] lxc: refactor lxcNetworkParseData pointers to use new structures
Struct lxcNetworkParseData is being used as a single pointer which iterates through LXC config lines. It means that it will be applied as a network each time that a new type appears. After, the same struct is used to populate a new network interface. This commit changes this logic to multiple lxcNetworkParseData to move this strcuture to an array. It makes more sense if we are using indexes to fill interface settings. This is better to improve code clarity. This commit still introduces *Legacy() functions to keep support of network old style definitions. Signed-off-by: Julio Faracco --- src/lxc/lxc_native.c | 140 --- 1 file changed, 77 insertions(+), 63 deletions(-) diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index dd2345c324..31aa666e38 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -411,7 +411,9 @@ lxcCreateHostdevDef(int mode, int type, const char *data) return hostdev; } -typedef struct { +typedef struct _lxcNetworkParseData lxcNetworkParseData; +typedef lxcNetworkParseData *lxcNetworkParseDataPtr; +struct _lxcNetworkParseData { virDomainDefPtr def; char *type; char *link; @@ -424,9 +426,14 @@ typedef struct { size_t nips; char *gateway_ipv4; char *gateway_ipv6; -bool privnet; -size_t networks; -} lxcNetworkParseData; +size_t index; +}; + +typedef struct { +size_t ndata; +lxcNetworkParseDataPtr *parseData; +} lxcNetworkParseDataArray; + static int lxcAddNetworkRouteDefinition(const char *address, @@ -552,39 +559,6 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) } -static int -lxcNetworkParseDataType(virConfValuePtr value, -lxcNetworkParseData *parseData) -{ -virDomainDefPtr def = parseData->def; -size_t networks = parseData->networks; -bool privnet = parseData->privnet; -int status; - -/* Store the previous NIC */ -status = lxcAddNetworkDefinition(parseData); - -if (status < 0) -return -1; -else if (status > 0) -networks++; -else if (parseData->type != NULL && STREQ(parseData->type, "none")) -privnet = false; - -/* clean NIC to store a new one */ -memset(parseData, 0, sizeof(*parseData)); - -parseData->def = def; -parseData->networks = networks; -parseData->privnet = privnet; - -/* Keep the new value */ -parseData->type = value->str; - -return 0; -} - - static int lxcNetworkParseDataIPs(const char *name, virConfValuePtr value, @@ -633,8 +607,7 @@ lxcNetworkParseDataSuffix(const char *entry, switch (elem) { case VIR_LXC_NETWORK_CONFIG_TYPE: -if (lxcNetworkParseDataType(value, parseData) < 0) -return -1; +parseData->type = value->str; break; case VIR_LXC_NETWORK_CONFIG_LINK: parseData->link = value->str; @@ -676,12 +649,40 @@ lxcNetworkParseDataSuffix(const char *entry, } +static lxcNetworkParseDataPtr +lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks, +const char *entry) +{ +int elem = virLXCNetworkConfigEntryTypeFromString(entry); +size_t ndata = networks->ndata; + +if (elem == VIR_LXC_NETWORK_CONFIG_TYPE) { +/* Index was not found. So, it is time to add new * + * interface and return this last position. */ +if (VIR_EXPAND_N(networks->parseData, networks->ndata, 1) < 0) +return NULL; + +networks->parseData[ndata] = g_new0(lxcNetworkParseData, 1); +networks->parseData[ndata]->index = networks->ndata; + +return networks->parseData[ndata]; +} + +/* Return last element added like a stack. */ +return networks->parseData[ndata - 1]; +} + + static int -lxcNetworkParseDataEntry(const char *name, - virConfValuePtr value, - lxcNetworkParseData *parseData) +lxcNetworkParseDataEntryLegacy(const char *name, + virConfValuePtr value, + lxcNetworkParseDataArray *networks) { const char *suffix = STRSKIP(name, "lxc.network."); +lxcNetworkParseData *parseData; + +if (!(parseData = lxcNetworkGetParseDataByIndexLegacy(networks, suffix))) +return -1; return lxcNetworkParseDataSuffix(suffix, value, parseData); } @@ -690,10 +691,10 @@ lxcNetworkParseDataEntry(const char *name, static int lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) { -lxcNetworkParseData *parseData = data; +lxcNetworkParseDataArray *networks = data; if (STRPREFIX(name, "lxc.network.")) -return lxcNetworkParseDataEntry(name, value, parseData); +return lxcNetworkParseDataEntryLegacy(name, value, networks); return 0; } @@ -702,36 +703,49 @@ static int lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties) { int status; -size_t i;
Re: [PATCH 0/5] Add support for SPAPR vTPM for pSeries VM
On Fri, Jan 31, 2020 at 10:17 PM Stefan Berger wrote: > > QEMU 5.0 will have SPAPR vTPM support. This series of patches > adds support for the XML and command line creation of the > SPAPR vTPM for pSeries VMs along with test cases. > > Regards, >Stefan > > Stefan Berger (5): > conf: Add support for tpm-spapr to domain XML > qemu: Extend QEMU capabilities with 'tpm-spapr' > qemu: Extend QEMU with tpm-spapr support > tests: Extend ppc64 capabilities data with TPM related XML and > responses > tests: Add test for domain XML with tpm-spapr TPM device model > > docs/formatdomain.html.in | 4 +- > docs/schemas/domaincommon.rng | 4 + > src/conf/domain_conf.c|24 +- > src/conf/domain_conf.h| 1 + > src/qemu/qemu_capabilities.c | 6 + > src/qemu/qemu_capabilities.h | 1 + > src/qemu/qemu_command.c |15 +- > src/qemu/qemu_domain.c| 8 +- > src/qemu/qemu_domain_address.c|10 + > tests/domaincapsdata/qemu_5.0.0.ppc64.xml | 115 + > .../caps_5.0.0.ppc64.replies | 24695 > .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1128 + > .../tpm-emulator-spapr.ppc64-latest.args |45 + > tests/qemuxml2argvdata/tpm-emulator-spapr.xml |60 + > tests/qemuxml2argvtest.c | 4 + > 15 files changed, 26105 insertions(+), 15 deletions(-) > create mode 100644 tests/domaincapsdata/qemu_5.0.0.ppc64.xml > create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.ppc64.replies > create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml > create mode 100644 > tests/qemuxml2argvdata/tpm-emulator-spapr.ppc64-latest.args > create mode 100644 tests/qemuxml2argvdata/tpm-emulator-spapr.xml > Series: Reviewed-by: Marc-André Lureau > -- > 2.17.1 >
[libvirt PATCH 2/4] qemu: tpm: use g_autofree
Mark eligible declarations as g_autofree and remove the corresponding VIR_FREE calls. Signed-off-by: Ján Tomko --- src/qemu/qemu_tpm.c | 30 ++ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c index 385f4c74f7..cfe7eb1846 100644 --- a/src/qemu/qemu_tpm.c +++ b/src/qemu/qemu_tpm.c @@ -126,7 +126,7 @@ qemuTPMCreateEmulatorStorage(const char *storagepath, gid_t swtpm_group) { int ret = -1; -char *swtpmStorageDir = g_path_get_dirname(storagepath); +g_autofree char *swtpmStorageDir = g_path_get_dirname(storagepath); if (qemuTPMEmulatorInitStorage(swtpmStorageDir) < 0) goto cleanup; @@ -150,8 +150,6 @@ qemuTPMCreateEmulatorStorage(const char *storagepath, ret = 0; cleanup: -VIR_FREE(swtpmStorageDir); - return ret; } @@ -220,14 +218,12 @@ qemuTPMEmulatorCreatePidFilename(const char *swtpmStateDir, const char *shortName) { char *pidfile = NULL; -char *devicename = NULL; +g_autofree char *devicename = NULL; devicename = g_strdup_printf("%s-swtpm", shortName); pidfile = virPidFileBuildPath(swtpmStateDir, devicename); -VIR_FREE(devicename); - return pidfile; } @@ -433,7 +429,7 @@ qemuTPMEmulatorRunSetup(const char *storagepath, int exitstatus; int ret = -1; char uuid[VIR_UUID_STRING_BUFLEN]; -char *vmid = NULL; +g_autofree char *vmid = NULL; g_autofree char *swtpm_setup = virTPMGetSwtpmSetup(); VIR_AUTOCLOSE pwdfile_fd = -1; @@ -516,7 +512,6 @@ qemuTPMEmulatorRunSetup(const char *storagepath, ret = 0; cleanup: -VIR_FREE(vmid); virCommandFree(cmd); return ret; @@ -554,7 +549,7 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm, { virCommandPtr cmd = NULL; bool created = false; -char *pidfile; +g_autofree char *pidfile = NULL; g_autofree char *swtpm = virTPMGetSwtpm(); VIR_AUTOCLOSE pwdfile_fd = -1; VIR_AUTOCLOSE migpwdfile_fd = -1; @@ -615,7 +610,6 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm, virCommandAddArg(cmd, "--pid"); virCommandAddArgFormat(cmd, "file=%s", pidfile); -VIR_FREE(pidfile); if (tpm->data.emulator.hassecretuuid) { if (!virTPMSwtpmCapsGet(VIR_TPM_SWTPM_FEATURE_CMDARG_PWD_FD)) { @@ -669,8 +663,8 @@ qemuTPMEmulatorStop(const char *swtpmStateDir, const char *shortName) { virCommandPtr cmd; -char *pathname; -char *errbuf = NULL; +g_autofree char *pathname = NULL; +g_autofree char *errbuf = NULL; g_autofree char *swtpm_ioctl = virTPMGetSwtpmIoctl(); if (!swtpm_ioctl) @@ -701,8 +695,7 @@ qemuTPMEmulatorStop(const char *swtpmStateDir, unlink(pathname); cleanup: -VIR_FREE(pathname); -VIR_FREE(errbuf); +return; } @@ -735,7 +728,7 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver, { virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int ret = 0; -char *shortName = NULL; +g_autofree char *shortName = NULL; switch (def->tpm->type) { case VIR_DOMAIN_TPM_TYPE_EMULATOR: @@ -755,7 +748,6 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver, } cleanup: -VIR_FREE(shortName); virObjectUnref(cfg); return ret; @@ -885,7 +877,7 @@ qemuExtTPMStop(virQEMUDriverPtr driver, virDomainObjPtr vm) { virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); -char *shortName = NULL; +g_autofree char *shortName = NULL; switch (vm->def->tpm->type) { case VIR_DOMAIN_TPM_TYPE_EMULATOR: @@ -902,7 +894,6 @@ qemuExtTPMStop(virQEMUDriverPtr driver, } cleanup: -VIR_FREE(shortName); virObjectUnref(cfg); } @@ -913,7 +904,7 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver, virCgroupPtr cgroup) { virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); -char *shortName = NULL; +g_autofree char *shortName = NULL; int ret = -1, rc; pid_t pid; @@ -939,7 +930,6 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver, ret = 0; cleanup: -VIR_FREE(shortName); virObjectUnref(cfg); return ret; -- 2.19.2
[libvirt PATCH 3/4] qemu: tpm: use g_autoptr where applicable
This requires stealing one cmd pointer before returning it. Signed-off-by: Ján Tomko --- src/qemu/qemu_tpm.c | 26 -- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c index cfe7eb1846..f9cea2ffde 100644 --- a/src/qemu/qemu_tpm.c +++ b/src/qemu/qemu_tpm.c @@ -425,7 +425,7 @@ qemuTPMEmulatorRunSetup(const char *storagepath, const unsigned char *secretuuid, bool incomingMigration) { -virCommandPtr cmd = NULL; +g_autoptr(virCommand) cmd = NULL; int exitstatus; int ret = -1; char uuid[VIR_UUID_STRING_BUFLEN]; @@ -512,8 +512,6 @@ qemuTPMEmulatorRunSetup(const char *storagepath, ret = 0; cleanup: -virCommandFree(cmd); - return ret; } @@ -547,7 +545,7 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm, const char *shortName, bool incomingMigration) { -virCommandPtr cmd = NULL; +g_autoptr(virCommand) cmd = NULL; bool created = false; g_autofree char *pidfile = NULL; g_autofree char *swtpm = virTPMGetSwtpm(); @@ -639,14 +637,12 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm, migpwdfile_fd = -1; } -return cmd; +return g_steal_pointer(); error: if (created) qemuTPMDeleteEmulatorStorage(tpm); -virCommandFree(cmd); - return NULL; } @@ -703,7 +699,7 @@ int qemuExtTPMInitPaths(virQEMUDriverPtr driver, virDomainDefPtr def) { -virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); int ret = 0; switch (def->tpm->type) { @@ -716,8 +712,6 @@ qemuExtTPMInitPaths(virQEMUDriverPtr driver, break; } -virObjectUnref(cfg); - return ret; } @@ -726,7 +720,7 @@ int qemuExtTPMPrepareHost(virQEMUDriverPtr driver, virDomainDefPtr def) { -virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); int ret = 0; g_autofree char *shortName = NULL; @@ -748,8 +742,6 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver, } cleanup: -virObjectUnref(cfg); - return ret; } @@ -876,7 +868,7 @@ void qemuExtTPMStop(virQEMUDriverPtr driver, virDomainObjPtr vm) { -virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autofree char *shortName = NULL; switch (vm->def->tpm->type) { @@ -894,7 +886,7 @@ qemuExtTPMStop(virQEMUDriverPtr driver, } cleanup: -virObjectUnref(cfg); +return; } @@ -903,7 +895,7 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver, virDomainDefPtr def, virCgroupPtr cgroup) { -virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autofree char *shortName = NULL; int ret = -1, rc; pid_t pid; @@ -930,7 +922,5 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver, ret = 0; cleanup: -virObjectUnref(cfg); - return ret; } -- 2.19.2
[libvirt PATCH 4/4] qemu: tpm: remove unused labels
Remove all the labels that are now redundant. Signed-off-by: Ján Tomko --- src/qemu/qemu_tpm.c | 74 + 1 file changed, 27 insertions(+), 47 deletions(-) diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c index f9cea2ffde..f3562d7dfe 100644 --- a/src/qemu/qemu_tpm.c +++ b/src/qemu/qemu_tpm.c @@ -125,11 +125,10 @@ qemuTPMCreateEmulatorStorage(const char *storagepath, uid_t swtpm_user, gid_t swtpm_group) { -int ret = -1; g_autofree char *swtpmStorageDir = g_path_get_dirname(storagepath); if (qemuTPMEmulatorInitStorage(swtpmStorageDir) < 0) -goto cleanup; +return -1; *created = false; @@ -141,16 +140,13 @@ qemuTPMCreateEmulatorStorage(const char *storagepath, virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not create directory %s as %u:%d"), storagepath, swtpm_user, swtpm_group); -goto cleanup; +return -1; } if (virFileChownFiles(storagepath, swtpm_user, swtpm_group) < 0) -goto cleanup; - -ret = 0; +return -1; - cleanup: -return ret; +return 0; } @@ -427,7 +423,6 @@ qemuTPMEmulatorRunSetup(const char *storagepath, { g_autoptr(virCommand) cmd = NULL; int exitstatus; -int ret = -1; char uuid[VIR_UUID_STRING_BUFLEN]; g_autofree char *vmid = NULL; g_autofree char *swtpm_setup = virTPMGetSwtpmSetup(); @@ -444,7 +439,7 @@ qemuTPMEmulatorRunSetup(const char *storagepath, cmd = virCommandNew(swtpm_setup); if (!cmd) -goto cleanup; +return -1; virUUIDFormat(vmuuid, uuid); vmid = g_strdup_printf("%s:%s", vmname, uuid); @@ -469,10 +464,10 @@ qemuTPMEmulatorRunSetup(const char *storagepath, virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, _("%s does not support passing a passphrase using a file " "descriptor"), swtpm_setup); -goto cleanup; +return -1; } if ((pwdfile_fd = qemuTPMSetupEncryption(secretuuid, cmd)) < 0) -goto cleanup; +return -1; virCommandAddArg(cmd, "--pwdfile-fd"); virCommandAddArgFormat(cmd, "%d", pwdfile_fd); @@ -506,13 +501,10 @@ qemuTPMEmulatorRunSetup(const char *storagepath, _("Could not run '%s'. exitstatus: %d; " "Check error log '%s' for details."), swtpm_setup, exitstatus, logfile); -goto cleanup; +return -1; } -ret = 0; - - cleanup: -return ret; +return 0; } @@ -673,11 +665,11 @@ qemuTPMEmulatorStop(const char *swtpmStateDir, return; if (!virFileExists(pathname)) -goto cleanup; +return; cmd = virCommandNew(swtpm_ioctl); if (!cmd) -goto cleanup; +return; virCommandAddArgList(cmd, "--unix", pathname, "-s", NULL); @@ -689,9 +681,6 @@ qemuTPMEmulatorStop(const char *swtpmStateDir, /* clean up the socket */ unlink(pathname); - - cleanup: -return; } @@ -700,19 +689,17 @@ qemuExtTPMInitPaths(virQEMUDriverPtr driver, virDomainDefPtr def) { g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); -int ret = 0; switch (def->tpm->type) { case VIR_DOMAIN_TPM_TYPE_EMULATOR: -ret = qemuTPMEmulatorInitPaths(def->tpm, cfg->swtpmStorageDir, - def->uuid); -break; +return qemuTPMEmulatorInitPaths(def->tpm, cfg->swtpmStorageDir, +def->uuid); case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: case VIR_DOMAIN_TPM_TYPE_LAST: break; } -return ret; +return 0; } @@ -721,28 +708,25 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver, virDomainDefPtr def) { g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); -int ret = 0; g_autofree char *shortName = NULL; switch (def->tpm->type) { case VIR_DOMAIN_TPM_TYPE_EMULATOR: shortName = virDomainDefGetShortName(def); if (!shortName) -goto cleanup; +return -1; -ret = qemuTPMEmulatorPrepareHost(def->tpm, cfg->swtpmLogDir, - def->name, cfg->swtpm_user, - cfg->swtpm_group, - cfg->swtpmStateDir, cfg->user, - shortName); -break; +return qemuTPMEmulatorPrepareHost(def->tpm, cfg->swtpmLogDir, + def->name, cfg->swtpm_user, + cfg->swtpm_group, + cfg->swtpmStateDir, cfg->user, + shortName);
[libvirt PATCH 1/4] qemu: tpm: remove unused pidfile variable
qemuExtTPMSetupCgroup declares pidfile but never uses it. Signed-off-by: Ján Tomko --- src/qemu/qemu_tpm.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c index 6741373583..385f4c74f7 100644 --- a/src/qemu/qemu_tpm.c +++ b/src/qemu/qemu_tpm.c @@ -913,7 +913,6 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver, virCgroupPtr cgroup) { virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); -char *pidfile = NULL; char *shortName = NULL; int ret = -1, rc; pid_t pid; @@ -940,7 +939,6 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver, ret = 0; cleanup: -VIR_FREE(pidfile); VIR_FREE(shortName); virObjectUnref(cfg); -- 2.19.2
[libvirt PATCH 0/4] qemu: tpm: use g_auto
Ján Tomko (4): qemu: tpm: remove unused pidfile variable qemu: tpm: use g_autofree qemu: tpm: use g_autoptr where applicable qemu: tpm: remove unused labels src/qemu/qemu_tpm.c | 130 +++- 1 file changed, 44 insertions(+), 86 deletions(-) -- 2.19.2
[libvirt PATCH 3/3] virBufferTrim: do not accept len
Always trim the full specified suffix. All of the callers outside of tests were passing either strlen or the actual length of the string. Signed-off-by: Ján Tomko --- src/conf/domain_addr.c | 2 +- src/conf/domain_conf.c | 6 +++--- src/cpu/cpu_x86.c | 6 +++--- src/qemu/qemu_command.c | 8 src/rpc/virnetsshsession.c | 2 +- src/storage/storage_util.c | 4 ++-- src/util/virbuffer.c| 28 src/util/virbuffer.h| 2 +- src/util/virqemu.c | 2 +- src/util/virresctrl.c | 4 ++-- tests/qemublocktest.c | 2 +- tests/qemumonitorjsontest.c | 4 ++-- tests/virbuftest.c | 13 ++--- tools/virsh-domain.c| 8 tools/vsh.c | 4 ++-- 15 files changed, 41 insertions(+), 54 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index bde0784189..c0e468122a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -1946,7 +1946,7 @@ virDomainUSBAddressPortFormatBuf(virBufferPtr buf, break; virBufferAsprintf(buf, "%u.", port[i]); } -virBufferTrim(buf, ".", -1); +virBufferTrim(buf, "."); } diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9b60db7ecd..c95bd34fb5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -25521,7 +25521,7 @@ virDomainVirtioNetGuestOptsFormat(char **outstr, virBufferAsprintf(, "ufo='%s' ", virTristateSwitchTypeToString(def->driver.virtio.guest.ufo)); } -virBufferTrim(, " ", -1); +virBufferTrim(, " "); *outstr = virBufferContentAndReset(); return 0; @@ -25561,7 +25561,7 @@ virDomainVirtioNetHostOptsFormat(char **outstr, virBufferAsprintf(, "mrg_rxbuf='%s' ", virTristateSwitchTypeToString(def->driver.virtio.host.mrg_rxbuf)); } -virBufferTrim(, " ", -1); +virBufferTrim(, " "); *outstr = virBufferContentAndReset(); return 0; @@ -30580,7 +30580,7 @@ virDomainGetBlkioParametersAssignFromDef(virDomainDefPtr def, def->blkio.devices[i].path, \ def->blkio.devices[i].param); \ } \ -virBufferTrim(, ",", -1); \ +virBufferTrim(, ","); \ data = virBufferContentAndReset(); \ if (virTypedParameterAssign(&(params[(*nparams)++]), name, \ VIR_TYPED_PARAM_STRING, data) < 0) \ diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 9b7981d574..dca9ed2979 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -1981,7 +1981,7 @@ x86FormatSignatures(virCPUx86ModelPtr model) (unsigned long)model->signatures[i]); } -virBufferTrim(, ",", -1); +virBufferTrim(, ","); return virBufferContentAndReset(); } @@ -3059,8 +3059,8 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, } } -virBufferTrim(, ",", -1); -virBufferTrim(, ",", -1); +virBufferTrim(, ","); +virBufferTrim(, ","); added = virBufferContentAndReset(); removed = virBufferContentAndReset(); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c8195cfbb9..81f5fa3416 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2360,7 +2360,7 @@ qemuBuildFloppyCommandLineControllerOptions(virCommandPtr cmd, if (explicitfdc && hasfloppy) { /* Newer Q35 machine types require an explicit FDC controller */ -virBufferTrim(_opts, ",", -1); +virBufferTrim(_opts, ","); virCommandAddArg(cmd, "-device"); virCommandAddArgBuffer(cmd, _opts); } @@ -3979,7 +3979,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, } -virBufferTrim(, ",", -1); +virBufferTrim(, ","); return virBufferContentAndReset(); } @@ -6330,7 +6330,7 @@ qemuBuildBootCommandLine(virCommandPtr cmd, if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOT_STRICT)) virBufferAddLit(_buf, "strict=on,"); -virBufferTrim(_buf, ",", -1); +virBufferTrim(_buf, ","); boot_opts_str = virBufferContentAndReset(_buf); if (boot_opts_str) { @@ -7744,7 +7744,7 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg, * doesn't support it, it fallbacks to previous migration algorithm silently. */ virBufferAddLit(, "seamless-migration=on,"); -virBufferTrim(, ",", -1); +virBufferTrim(, ","); virCommandAddArg(cmd, "-spice"); virCommandAddArgBuffer(cmd, ); diff --git a/src/rpc/virnetsshsession.c b/src/rpc/virnetsshsession.c index 63773ecfc2..c31d80d4eb 100644 --- a/src/rpc/virnetsshsession.c +++ b/src/rpc/virnetsshsession.c @@ -357,7 +357,7 @@ virNetSSHCheckHostKey(virNetSSHSessionPtr sess) * we have to use a *MAGIC* constant. */ for (i = 0; i < 16; i++) virBufferAsprintf(, "%02hhX:", keyhash[i]); -virBufferTrim(,
[libvirt PATCH 2/3] Use virBufferTrimLen when applicable
Replace all the cases that only supply the length and do not care about matching a suffix, as well as that one test case that does. Signed-off-by: Ján Tomko --- src/lxc/lxc_container.c | 2 +- tests/virbuftest.c | 6 +++--- tools/vsh.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c index b44cc68e67..fcd964cd1e 100644 --- a/src/lxc/lxc_container.c +++ b/src/lxc/lxc_container.c @@ -215,7 +215,7 @@ static virCommandPtr lxcContainerBuildInitCmd(virDomainDefPtr vmDef, virBufferAdd(, ttyPaths[i] + 5, -1); virBufferAddChar(, ' '); } -virBufferTrim(, NULL, 1); +virBufferTrimLen(, 1); virUUIDFormat(vmDef->uuid, uuidstr); diff --git a/tests/virbuftest.c b/tests/virbuftest.c index 7919075000..f2d4d9b9de 100644 --- a/tests/virbuftest.c +++ b/tests/virbuftest.c @@ -108,9 +108,9 @@ static int testBufTrim(const void *data G_GNUC_UNUSED) virBufferAddLit(buf, "a;"); virBufferTrim(buf, "", 0); virBufferTrim(buf, "", -1); -virBufferTrim(buf, NULL, 1); -virBufferTrim(buf, NULL, 5); -virBufferTrim(buf, "a", 2); +virBufferTrimLen(buf, 1); +virBufferTrimLen(buf, 5); +virBufferTrimLen(buf, 2); virBufferAddLit(buf, ",b,,"); virBufferTrim(buf, NULL, -1); diff --git a/tools/vsh.c b/tools/vsh.c index 9c58e40d4f..3c3b4bf1c3 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -2525,7 +2525,7 @@ vshTreePrintInternal(vshControl *ctl, vshPrint(ctl, "%s\n", virBufferCurrentContent(indent)); if (!root) -virBufferTrim(indent, NULL, 2); +virBufferTrimLen(indent, 2); return 0; } -- 2.19.2
[libvirt PATCH 1/3] util: introduce virBufferTrimLen
Just like the existing virBufferTrim, but only does one thing at a time. Signed-off-by: Ján Tomko --- src/libvirt_private.syms | 1 + src/util/virbuffer.c | 19 +++ src/util/virbuffer.h | 1 + 3 files changed, 21 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ebf830791e..7dfb2458eb 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1646,6 +1646,7 @@ virBufferStrcat; virBufferStrcatVArgs; virBufferTrim; virBufferTrimChars; +virBufferTrimLen; virBufferURIEncodeString; virBufferUse; virBufferVasprintf; diff --git a/src/util/virbuffer.c b/src/util/virbuffer.c index 914c386b18..b76d99b56f 100644 --- a/src/util/virbuffer.c +++ b/src/util/virbuffer.c @@ -700,6 +700,25 @@ virBufferTrimChars(virBufferPtr buf, const char *trim) g_string_truncate(buf->str, i + 1); } +/** + * virBufferTrimLen: + * @buf: the buffer to trim + * @len: the number of bytes to trim + * + * Trim the tail of a buffer. + */ +void +virBufferTrimLen(virBufferPtr buf, int len) +{ +if (!buf || !buf->str) +return; + +if (len > buf->str->len) +return; + +g_string_truncate(buf->str, buf->str->len - len); +} + /** * virBufferAddStr: * @buf: the buffer to append to diff --git a/src/util/virbuffer.h b/src/util/virbuffer.h index 183f78f279..7b068075b2 100644 --- a/src/util/virbuffer.h +++ b/src/util/virbuffer.h @@ -93,4 +93,5 @@ size_t virBufferGetEffectiveIndent(const virBuffer *buf); void virBufferTrim(virBufferPtr buf, const char *trim, int len); void virBufferTrimChars(virBufferPtr buf, const char *trim); +void virBufferTrimLen(virBufferPtr buf, int len); void virBufferAddStr(virBufferPtr buf, const char *str); -- 2.19.2
[libvirt PATCH 0/3] Clean up usage of virBufferTrim
Before it was possible to supply a matching suffix, a length of chars to trim, or both. However the combination of the two was only used in tests. Split the function into two. Ján Tomko (3): util: introduce virBufferTrimLen Use virBufferTrimLen when applicable virBufferTrim: do not accept len src/conf/domain_addr.c | 2 +- src/conf/domain_conf.c | 6 ++--- src/cpu/cpu_x86.c | 6 ++--- src/libvirt_private.syms| 1 + src/lxc/lxc_container.c | 2 +- src/qemu/qemu_command.c | 8 +++ src/rpc/virnetsshsession.c | 2 +- src/storage/storage_util.c | 4 ++-- src/util/virbuffer.c| 47 + src/util/virbuffer.h| 3 ++- src/util/virqemu.c | 2 +- src/util/virresctrl.c | 4 ++-- tests/qemublocktest.c | 2 +- tests/qemumonitorjsontest.c | 4 ++-- tests/virbuftest.c | 19 +++ tools/virsh-domain.c| 8 +++ tools/vsh.c | 6 ++--- 17 files changed, 67 insertions(+), 59 deletions(-) -- 2.19.2
Re: [PATCH 2/7] tests: Drop viratomictest
On Sat, Feb 01, 2020 at 07:33:44AM +0100, Michal Privoznik wrote: In future commits our virAtomic* APIs will be replaced with their GLib variants. Instead of trying to update the test after each commit and eventually removing the test anyway, remove it upfront and save the hassle. Alternatively, you could have just removed their usage, not the APIs themselves. Signed-off-by: Michal Privoznik --- tests/Makefile.am | 5 -- tests/viratomictest.c | 175 -- 2 files changed, 180 deletions(-) delete mode 100644 tests/viratomictest.c Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [PATCH 7/7] Drop virAtomic module
On Sat, Feb 01, 2020 at 07:33:49AM +0100, Michal Privoznik wrote: Now, that every use of virAtomic was replaced with its g_atomic s/,// equivalent, let's remove the module. Signed-off-by: Michal Privoznik --- configure.ac | 1 - m4/virt-atomic.m4 | 77 -- src/Makefile.am | 6 --- src/libvirt_atomic.syms | 11 src/libxl/libxl_domain.c | 1 - src/libxl/libxl_driver.c | 1 - src/lxc/lxc_process.c | 1 - src/nwfilter/nwfilter_dhcpsnoop.c | 1 - src/qemu/qemu_conf.c | 1 - src/qemu/qemu_domain.c| 1 - src/qemu/qemu_process.c | 1 - src/test/test_driver.c| 1 - src/util/Makefile.inc.am | 2 - src/util/viratomic.c | 35 src/util/viratomic.h | 90 --- src/util/virobject.c | 1 - src/util/virprocess.c | 1 - src/util/virsystemd.c | 1 - 18 files changed, 233 deletions(-) delete mode 100644 m4/virt-atomic.m4 delete mode 100644 src/libvirt_atomic.syms delete mode 100644 src/util/viratomic.c delete mode 100644 src/util/viratomic.h Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [PATCH 6/7] src: Drop virAtomicIntDecAndTest() with g_atomic_int_dec_and_test()
On Sat, Feb 01, 2020 at 07:33:48AM +0100, Michal Privoznik wrote: Signed-off-by: Michal Privoznik --- src/libxl/libxl_domain.c | 2 +- src/lxc/lxc_process.c | 2 +- src/nwfilter/nwfilter_dhcpsnoop.c | 8 src/qemu/qemu_process.c | 2 +- src/util/viratomic.h | 11 --- src/util/virobject.c | 2 +- 6 files changed, 8 insertions(+), 19 deletions(-) @@ -868,7 +868,7 @@ virNWFilterSnoopReqLeaseDel(virNWFilterSnoopReqPtr req, skip_instantiate: VIR_FREE(ipl); -ignore_value(virAtomicIntDecAndTest()); +ignore_value(!!g_atomic_int_dec_and_test()); lease_not_found: VIR_FREE(ipstr); @@ -1142,7 +1142,7 @@ static void virNWFilterDHCPDecodeWorker(void *jobdata, void *opaque) _("Instantiation of rules failed on " "interface '%s'"), req->binding->portdevname); } -ignore_value(virAtomicIntDecAndTest(job->qCtr)); +ignore_value(!!g_atomic_int_dec_and_test(job->qCtr)); VIR_FREE(job); } @@ -1543,7 +1543,7 @@ virNWFilterDHCPSnoopThread(void *req0) pcap_close(pcapConf[i].handle); } -ignore_value(virAtomicIntDecAndTest()); +ignore_value(!!g_atomic_int_dec_and_test()); return; } Here you can drop the ignore_value as well as the !! double inversion. Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [PATCH 5/7] src: Replace virAtomicIntInc() with g_atomic_int_add()
On Sat, Feb 01, 2020 at 07:33:47AM +0100, Michal Privoznik wrote: Signed-off-by: Michal Privoznik --- src/libxl/libxl_domain.c | 2 +- src/libxl/libxl_driver.c | 2 +- src/lxc/lxc_process.c | 4 ++-- src/nwfilter/nwfilter_dhcpsnoop.c | 10 +- src/qemu/qemu_process.c | 4 ++-- src/test/test_driver.c| 2 +- src/util/viratomic.h | 11 --- src/util/virobject.c | 4 ++-- src/util/virprocess.c | 2 +- 9 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 4e159157d7..ba157c0686 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -695,7 +695,7 @@ testDomainStartState(testDriverPtr privconn, int ret = -1; virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, reason); -dom->def->id = virAtomicIntInc(>nextDomID); +dom->def->id = g_atomic_int_add(>nextDomID, 1); if (virDomainObjSetDefTransient(privconn->xmlopt, dom, NULL) < 0) { This belongs in patch 1/7 To the rest: Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [PATCH 4/7] src: Replace virAtomicIntSet() with g_atomic_int_set()
On Sat, Feb 01, 2020 at 07:33:46AM +0100, Michal Privoznik wrote: Signed-off-by: Michal Privoznik --- src/nwfilter/nwfilter_dhcpsnoop.c | 2 +- src/test/test_driver.c| 4 ++-- src/util/viratomic.h | 9 - src/util/virobject.c | 2 +- src/util/virsystemd.c | 10 +- 5 files changed, 9 insertions(+), 18 deletions(-) Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [PATCH 3/7] src: Replace virAtomicIntGet() with g_atomic_int_get()
On Sat, Feb 01, 2020 at 07:33:45AM +0100, Michal Privoznik wrote: Signed-off-by: Michal Privoznik --- src/nwfilter/nwfilter_dhcpsnoop.c | 12 ++-- src/util/viratomic.h | 9 - src/util/virsystemd.c | 6 +++--- 3 files changed, 9 insertions(+), 18 deletions(-) Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [PATCH 1/7] test_driver: Replace virAtomicIntAdd() with virAtomicIntInc()
On Sat, Feb 01, 2020 at 07:33:43AM +0100, Michal Privoznik wrote: Instead of calling virAtomicIntAdd(, 1); we can call virAtomicIntInc() directly. Signed-off-by: Michal Privoznik --- src/test/test_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 47c1fc588f..6f617592f3 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -695,7 +695,7 @@ testDomainStartState(testDriverPtr privconn, int ret = -1; virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, reason); -dom->def->id = virAtomicIntAdd(>nextDomID, 1); +dom->def->id = virAtomicIntInc(>nextDomID); g_atomic_int_add(>nextDomID, 1); I don't see the value of changing it to a function that is being phased out. With that fixed: Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [PATCH 1/5] conf: Add support for tpm-spapr to domain XML
On Fri, Jan 31, 2020 at 04:17:39PM -0500, Stefan Berger wrote: From: Stefan Berger This patch adds support for the tpm-spapr device model for ppc64. The XML for this type of TPM looks as follows: Extend the documentation. Signed-off-by: Stefan Berger --- docs/formatdomain.html.in | 4 +++- docs/schemas/domaincommon.rng | 4 src/conf/domain_conf.c| 24 +--- src/conf/domain_conf.h| 1 + src/qemu/qemu_domain.c| 6 -- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 60a103d7c6..5a9835fbfe 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -8508,7 +8508,9 @@ qemu-kvm -net nic,model=? /dev/null The model attribute specifies what device model QEMU provides to the guest. If no model name is provided, - tpm-tis will automatically be chosen. + tpm-tis will automatically be chosen for non-ppc64 + architectures. For ppc64/pseries guests, tpm-spapr Since 6.1.0, ... + is the default. Since 4.4.0, another available choice is the tpm-crb, which should only be used when the backend device is a TPM 2.0. @@ -13242,7 +13243,8 @@ static virDomainTPMDefPtr virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, xmlNodePtr node, xmlXPathContextPtr ctxt, -unsigned int flags) +unsigned int flags, +virArch arch) { virDomainTPMDefPtr def; VIR_XPATH_NODE_AUTORESTORE(ctxt); @@ -13258,11 +13260,17 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, return NULL; model = virXMLPropString(node, "model"); -if (model != NULL && -(def->model = virDomainTPMModelTypeFromString(model)) < 0) { -virReportError(VIR_ERR_CONFIG_UNSUPPORTED, +if (model != NULL) { +if ((def->model = virDomainTPMModelTypeFromString(model)) < 0) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unknown TPM frontend model '%s'"), model); -goto error; +goto error; +} +} else { +if (ARCH_IS_PPC64(arch)) +def->model = VIR_DOMAIN_TPM_MODEL_SPAPR; +else +def->model = VIR_DOMAIN_TPM_MODEL_TIS; } Default models should be set in qemuDomainDeviceDefPostParse. (that might require a new VIR_DOMAIN_TPM_MODEL_DEFAULT, since so far we relied on VIR_DOMAIN_TPM_MODEL_TIS having the value of 0) The parser should just translate XML into libvirt structs. ctxt->node = node; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d3045b4bcd..ace611909d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7756,9 +7756,10 @@ qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm, switch (tpm->version) { case VIR_DOMAIN_TPM_VERSION_1_2: -/* only TIS available for emulator */ +/* only TIS available for emulator (non-ppc64 case) */ if (tpm->type == VIR_DOMAIN_TPM_TYPE_EMULATOR && -tpm->model != VIR_DOMAIN_TPM_MODEL_TIS) { +tpm->model != VIR_DOMAIN_TPM_MODEL_TIS && +!ARCH_IS_PPC64(def->os.arch)) { tpm->model != VIR_DOMAIN_TPM_MODEL_SPAPR no need to mention the architecture here. Alternatively, are the comment and the condition just trying to say 1.2 + tpm-crb + emulator do not mix? That might be shorter to write. Jano virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported interface %s for TPM 1.2"), virDomainTPMModelTypeToString(tpm->model)); @@ -7793,6 +7794,7 @@ qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm, case VIR_DOMAIN_TPM_MODEL_CRB: flag = QEMU_CAPS_DEVICE_TPM_CRB; break; +case VIR_DOMAIN_TPM_MODEL_SPAPR: case VIR_DOMAIN_TPM_MODEL_LAST: default: virReportEnumRangeError(virDomainTPMModel, tpm->model); -- 2.17.1 signature.asc Description: PGP signature
Re: [libvirt PATCH 3/5] cpu: Add the kvm-no-adjvtime CPU feature
On Fri, Jan 31, 2020 at 05:39:50PM +0100, Andrea Bolognani wrote: The feature is currently available on ARM only, and so it only needs to be known to the corresponding CPU driver. Signed-off-by: Andrea Bolognani --- src/cpu_map/arm_features.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cpu_map/arm_features.xml b/src/cpu_map/arm_features.xml index 8a53384463..13d00f07a8 100644 --- a/src/cpu_map/arm_features.xml +++ b/src/cpu_map/arm_features.xml @@ -19,4 +19,7 @@ + + I think just like other kvm* features, this would fit better in the hypervisor features element, not the CPU driver. Jano + -- 2.24.1 signature.asc Description: PGP signature
Re: [libvirt PATCH 4/5] qemu: Validate the kvm-no-adjvtime CPU feature
On Fri, Jan 31, 2020 at 05:39:51PM +0100, Andrea Bolognani wrote: Error out if the QEMU binary doesn't support it. Signed-off-by: Andrea Bolognani --- src/qemu/qemu_domain.c | 14 -- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d3045b4bcd..8b0c91d6c1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4625,7 +4625,8 @@ qemuDomainDefSetDefaultCPU(virDomainDefPtr def, static int -qemuDomainDefCPUPostParse(virDomainDefPtr def) +qemuDomainDefCPUPostParse(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps) { virCPUFeatureDefPtr sveFeature = NULL; bool sveVectorLengthsProvided = false; @@ -4696,6 +4697,15 @@ qemuDomainDefCPUPostParse(virDomainDefPtr def) } else if (STRPREFIX(feature->name, "sve")) { sveVectorLengthsProvided = true; } + +if (STREQ(feature->name, "kvm-no-adjvtime") && +!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_KVM_NO_ADJVTIME)) +{ +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The '%s' feature is not supported by this " + "QEMU binary"), feature->name); +return -1; Either qemuDomain.*Validate or qemuProcessVerifyCPU would be a better place for this check. Jano +} } signature.asc Description: PGP signature
Re: [libvirt PATCH 2/5] qemu: Add the QEMU_CAPS_CPU_KVM_NO_ADJVTIME capability
On Fri, Jan 31, 2020 at 05:39:49PM +0100, Andrea Bolognani wrote: We will use this capability to detect whether the QEMU binary supports the kvm-no-adjvtime CPU feature. Signed-off-by: Andrea Bolognani --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml | 1 + 3 files changed, 4 insertions(+) Reviewed-by: Ján Tomko Jano signature.asc Description: PGP signature
Re: [libvirt PATCH 1/5] tests: Add capabilities for QEMU 5.0.0 on aarch64
On Fri, Jan 31, 2020 at 05:39:48PM +0100, Andrea Bolognani wrote: This is the first QEMU version that supports the kvm-no-adjvtime CPU feature. s/is/will be/ s/supports/will support/ Signed-off-by: Andrea Bolognani FYI the sign-off is not present in the version you pushed to gitlab. --- This patch has been trimmed. .../qemu_5.0.0-virt.aarch64.xml | 156 + tests/domaincapsdata/qemu_5.0.0.aarch64.xml | 150 + .../caps_5.0.0.aarch64.replies| 22717 .../caps_5.0.0.aarch64.xml| 456 + 4 files changed, 23479 insertions(+) create mode 100644 tests/domaincapsdata/qemu_5.0.0-virt.aarch64.xml create mode 100644 tests/domaincapsdata/qemu_5.0.0.aarch64.xml create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.aarch64.replies create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml new file mode 100644 index 00..538b40dd5b --- /dev/null +++ b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml @@ -0,0 +1,456 @@ + + /usr/bin/qemu-system-aarch64 [...] + 4002050 + 0 + 61700241 + v4.2.0-1157-gadcd6e93b9 Reviewed-by: Ján Tomko Jano + aarch64 + + + signature.asc Description: PGP signature
[libvirt PATCH] rpc: gendispatch: trim Flags from the return struct name
This lets it generate the remote dispatch for StorageVolGetInfoFlags. Signed-off-by: Ján Tomko --- src/remote/remote_daemon_dispatch.c | 35 - src/remote/remote_protocol.x| 2 +- src/rpc/gendispatch.pl | 1 + 3 files changed, 2 insertions(+), 36 deletions(-) diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c index b08bd5b8ba..2741a32f63 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -7162,41 +7162,6 @@ remoteDispatchDomainInterfaceAddresses(virNetServerPtr server G_GNUC_UNUSED, } -static int -remoteDispatchStorageVolGetInfoFlags(virNetServerPtr server G_GNUC_UNUSED, - virNetServerClientPtr client, - virNetMessagePtr msg G_GNUC_UNUSED, - virNetMessageErrorPtr rerr, - remote_storage_vol_get_info_flags_args *args, - remote_storage_vol_get_info_flags_ret *ret) -{ -int rv = -1; -virStorageVolPtr vol = NULL; -virStorageVolInfo tmp; -virConnectPtr conn = remoteGetStorageConn(client); - -if (!conn) -goto cleanup; - -if (!(vol = get_nonnull_storage_vol(conn, args->vol))) -goto cleanup; - -if (virStorageVolGetInfoFlags(vol, , args->flags) < 0) -goto cleanup; - -ret->type = tmp.type; -ret->capacity = tmp.capacity; -ret->allocation = tmp.allocation; -rv = 0; - - cleanup: -if (rv < 0) -virNetMessageSaveError(rerr); -virObjectUnref(vol); -return rv; -} - - static int remoteDispatchNetworkPortGetParameters(virNetServerPtr server G_GNUC_UNUSED, virNetServerClientPtr client, diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 1f7963510a..d4393680e9 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -6367,7 +6367,7 @@ enum remote_procedure { REMOTE_PROC_NODE_DEVICE_EVENT_UPDATE = 377, /** - * @generate: none + * @generate: server * @priority: high * @acl: storage_vol:read */ diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index 8656c8f205..987a136566 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -994,6 +994,7 @@ elsif ($mode eq "server") { } else { my $struct_name = $call->{ProcName}; $struct_name =~ s/Get//; +$struct_name =~ s/Flags$//; splice(@args_list, $call->{ret_offset}, 0, ("")); -- 2.21.0
Re: [libvirt PATCH v2 39/56] util: import an event loop impl based on GMainContext
On Tue, Jan 28, 2020 at 01:11:20PM +, Daniel P. Berrangé wrote: The libvirt-glib project has provided a GMainContext based event loop impl for applications. This imports it and sets it up for use by libvirt as the primary event loop. This remains a private impl detail of libvirt. IOW, applications must *NOT* assume that a call to "virEventRegisterDefaultImpl" results in a GLib based event loop. They should continue to use the libvirt-glib API gvir_event_register() if they explicitly want to guarantee a GLib event loop. This follows the general principal that the libvirt public s/principal/principle/ same in the next patch. API should not expose the fact that GLib is being used internally. Signed-off-by: Daniel P. Berrangé --- build-aux/syntax-check.mk | 2 +- po/POTFILES.in| 1 + src/libvirt_private.syms | 5 + src/util/Makefile.inc.am | 2 + src/util/vireventglib.c | 455 ++ src/util/vireventglib.h | 28 +++ 6 files changed, 492 insertions(+), 1 deletion(-) create mode 100644 src/util/vireventglib.c create mode 100644 src/util/vireventglib.h Jano signature.asc Description: PGP signature