[libvirt] [PATCH] virt-aa-helper: Allow parsing supported features for qemu/kvm
by Shivaprasad G Bhat
The virt-aa-helper fails to parse the xmls with the memory/cpu
hotplug features or user assigned aliases. Set the features in
xmlopt->config for the parsing to succeed.
Signed-off-by: Shivaprasad G Bhat <sbhat(a)linux.vnet.ibm.com>
---
src/conf/domain_conf.c | 21 ---------------------
src/conf/domain_conf.h | 21 +++++++++++++++++++++
src/security/virt-aa-helper.c | 7 +++++++
3 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a1c2506..20ce83e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -64,27 +64,6 @@
VIR_LOG_INIT("conf.domain_conf");
-/* This structure holds various callbacks and data needed
- * while parsing and creating domain XMLs */
-struct _virDomainXMLOption {
- virObject parent;
-
- /* XML parser callbacks and defaults */
- virDomainDefParserConfig config;
-
- /* domain private data management callbacks */
- virDomainXMLPrivateDataCallbacks privateData;
-
- /* XML namespace callbacks */
- virDomainXMLNamespace ns;
-
- /* ABI stability callbacks */
- virDomainABIStability abi;
-
- /* Private data for save image stored in snapshot XML */
- virSaveCookieCallbacks saveCookie;
-};
-
#define VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS \
(VIR_DOMAIN_DEF_FORMAT_SECURE | \
VIR_DOMAIN_DEF_FORMAT_INACTIVE | \
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 6f7f96b..aacb88a 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2662,6 +2662,27 @@ struct _virDomainABIStability {
virDomainABIStabilityDomain domain;
};
+/* This structure holds various callbacks and data needed
+ * while parsing and creating domain XMLs */
+struct _virDomainXMLOption {
+ virObject parent;
+
+ /* XML parser callbacks and defaults */
+ virDomainDefParserConfig config;
+
+ /* domain private data management callbacks */
+ virDomainXMLPrivateDataCallbacks privateData;
+
+ /* XML namespace callbacks */
+ virDomainXMLNamespace ns;
+
+ /* ABI stability callbacks */
+ virDomainABIStability abi;
+
+ /* Private data for save image stored in snapshot XML */
+ virSaveCookieCallbacks saveCookie;
+};
+
virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
virDomainXMLPrivateDataCallbacksPtr priv,
virDomainXMLNamespacePtr xmlns,
diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
index f7ccae0..8b0ca46 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -699,6 +699,13 @@ get_definition(vahControl * ctl, const char *xmlStr)
goto exit;
}
+ if (virtType == VIR_DOMAIN_VIRT_QEMU || virtType == VIR_DOMAIN_VIRT_KVM) {
+ ctl->xmlopt->config.features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG |
+ VIR_DOMAIN_DEF_FEATURE_OFFLINE_VCPUPIN |
+ VIR_DOMAIN_DEF_FEATURE_INDIVIDUAL_VCPUS |
+ VIR_DOMAIN_DEF_FEATURE_USER_ALIAS;
+ }
+
if (virCapabilitiesAddGuestDomain(guest,
virtType,
NULL,
6 years, 10 months
[libvirt] Release of libvirt-4.0.0
by Daniel Veillard
First release of the year ! A bit late but it is now tagged in git
and signed tarball and rpms are at the usual place:
ftp://libvirt.org/libvirt/
I also pushed a release of the python bindings in git and at
ftp://libvirt.org/libvirt/python/
This is a relatively small release, probably due to the end of year slowdown
though there is some notable addition:
* New features
- tools: Provide bash completion support.
Both virsh and virt-admin now implement basic bash completion support.
- qemu: Refresh capabilities on host microcode update
A microcode update can cause the CPUID bits to change; therefore, the
capabilities cache should be rebuilt when such an update is detected on
the host.
- lxc: Set hostname based on container name
* Improvements
- CPU frequency reporting improvements
The CPU frequency will now be reported by virsh nodeinfo and other
tools for s390 hosts; at the same time; CPU frequency has been disabled
on aarch64 hosts because there's no way to detect it reliably.
- libxl: Mark domain0 as persistent
- Xen: Add support for multiple IP addresses on interface devices
- qemu: Add support for hot unplugging redirdev device
* Bug fixes
- qemu: Enforce vCPU hotplug granularity constraints
QEMU 2.7 and newer don't allow guests to start unless the initial vCPUs
count is a multiple of the vCPU hotplug granularity, so validate it and
report an error if needed.
thanks everybody for your help with this release, be it code, bug reports
reviews, documentation, etc ...
Enjoy the new release !
Daniel
--
Daniel Veillard | Red Hat Developers Tools http://developer.redhat.com/
veillard(a)redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | virtualization library http://libvirt.org/
6 years, 10 months
[libvirt] [PATCH] Revert "qemu: monitor: do not report error on shutdown"
by Michal Privoznik
This reverts commit aeda1b8c56dc58b0a413acc61bbea938b40499e1.
Problem is that we need mon->lastError to be set because it's
used all over the place. Also, there's nothing wrong with
reporting error if one occurred. I mean, if there's a thread
executing an API and which currently is talking on monitor it
definitely wants the error reported.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_monitor.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 85c7d68a1..fc146bdbf 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -78,7 +78,6 @@ struct _qemuMonitor {
* < 0: an error occurred during the registration of @fd */
int watch;
int hasSendFD;
- int willhangup;
virDomainObjPtr vm;
@@ -716,10 +715,8 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque)
if (events & VIR_EVENT_HANDLE_HANGUP) {
hangup = true;
if (!error) {
- if (!mon->willhangup) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("End of file from qemu monitor"));
- }
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("End of file from qemu monitor"));
eof = true;
events &= ~VIR_EVENT_HANDLE_HANGUP;
}
@@ -758,7 +755,7 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque)
if (mon->lastError.code != VIR_ERR_OK) {
/* Already have an error, so clear any new error */
virResetLastError();
- } else if (!mon->willhangup) {
+ } else {
virErrorPtr err = virGetLastError();
if (!err)
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -1352,7 +1349,6 @@ qemuMonitorEmitShutdown(qemuMonitorPtr mon, virTristateBool guest)
{
int ret = -1;
VIR_DEBUG("mon=%p guest=%u", mon, guest);
- mon->willhangup = 1;
QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm, guest);
return ret;
--
2.13.6
6 years, 10 months
[libvirt] [PATCH] qemu: Don't send any monitor commands afer SHUTDOWN event
by Michal Privoznik
After aeda1b8c56dc5 we tried to stop reporting I/O errors on
expected monitor HUP. We've achieved that by not setting
mon->lastError once we've received SHUTDOWN event. However, this
makes us to deadlock in case there's thread that enters the
monitor after the event is received. The problem is, we're no
longer setting mon->lastError and therefore qemuMonitorSend()
does not return early and continues execution until virCondWait()
(which will never wake up).
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_monitor.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 85c7d68a1..9f3e3eb14 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -1063,7 +1063,7 @@ qemuMonitorSend(qemuMonitorPtr mon,
{
int ret = -1;
- /* Check whether qemu quit unexpectedly */
+ /* Check whether qemu quit unexpectedly, */
if (mon->lastError.code != VIR_ERR_OK) {
VIR_DEBUG("Attempt to send command while error is set %s",
NULLSTR(mon->lastError.message));
@@ -1071,6 +1071,12 @@ qemuMonitorSend(qemuMonitorPtr mon,
return -1;
}
+ /* or expectedly. */
+ if (mon->willhangup) {
+ VIR_DEBUG("Attempt to send command while domain is shutting down");
+ return -1;
+ }
+
mon->msg = msg;
qemuMonitorUpdateWatch(mon);
--
2.13.6
6 years, 10 months
[libvirt] [PATCH] qemu: Fix crash in offline migration
by Jiri Denemark
When migrating a shutoff domain (i.e., offline migration), we have no
statistics to report and thus jobInfo will be NULL in
qemuMigrationFinish.
Broken by me in v3.10.0-183-ge8784e7868.
https://bugzilla.redhat.com/show_bug.cgi?id=1536351
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_migration.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index a56bc596ff..1854900c9a 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -5481,8 +5481,10 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
}
if (dom) {
- VIR_STEAL_PTR(priv->job.completed, jobInfo);
- priv->job.completed->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
+ if (jobInfo) {
+ VIR_STEAL_PTR(priv->job.completed, jobInfo);
+ priv->job.completed->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
+ }
if (qemuMigrationBakeCookie(mig, driver, vm, cookieout, cookieoutlen,
QEMU_MIGRATION_COOKIE_STATS) < 0)
--
2.16.0
6 years, 10 months
[libvirt] [PATCH 00/17] CPU models and features for Spectre, CVE-2017-5715
by Jiri Denemark
This is the libvirt's part of the changes related to CVE-2017-5715. The
new models can be used to pass the protective CPU features to guests.
But remember, the host CPU microcode, host kernel, QEMU, and libvirt all
need to be updated for this to be any useful.
Based on a patch from Paolo Bonzini.
See QEMU patches from Eduardo for more details:
https://patchew.org/QEMU/20180109154519.25634-1-ehabkost@redhat.com/
Jiri Denemark (16):
cputest: Add data for Intel(R) Xeon(R) CPU E5-2609 v3
cputest: Add data for Intel(R) Xeon(R) CPU E5-2623 v4
cputest: Add data for Intel(R) Xeon(R) Gold 5115 CPU
cputest: Add data for updated AMD EPYC 7601 32-Core Processor
cputest: Add data for updated Intel(R) Core(TM) i7-5600U CPU
cpu: Add Nehalem-IBRS CPU model
cpu: Add Westmere-IBRS CPU model
cpu: Add SandyBridge-IBRS CPU model
cpu: Add IvyBridge-IBRS CPU model
cpu: Add Haswell-noTSX-IBRS CPU model
cpu: Add Haswell-IBRS CPU model
cpu: Add Broadwell-noTSX-IBRS CPU model
cpu: Add Broadwell-IBRS CPU model
cpu: Add Skylake-Client-IBRS CPU model
cpu: Add Skylake-Server-IBRS CPU model
cpu: Add EPYC-IBPB CPU model
Paolo Bonzini (1):
cpu: add CPU features for indirect branch prediction protection
src/cpu/cpu_map.xml | 622 ++++++++++++++++++
tests/cputest.c | 5 +
.../x86_64-cpuid-Core-i7-5600U-ibrs-disabled.xml | 6 +
.../x86_64-cpuid-Core-i7-5600U-ibrs-enabled.xml | 8 +
.../x86_64-cpuid-Core-i7-5600U-ibrs-guest.xml | 29 +
.../x86_64-cpuid-Core-i7-5600U-ibrs-host.xml | 30 +
.../x86_64-cpuid-Core-i7-5600U-ibrs-json.xml | 15 +
.../x86_64-cpuid-Core-i7-5600U-ibrs.json | 525 +++++++++++++++
.../x86_64-cpuid-Core-i7-5600U-ibrs.xml | 41 ++
...86_64-cpuid-EPYC-7601-32-Core-ibpb-disabled.xml | 7 +
...x86_64-cpuid-EPYC-7601-32-Core-ibpb-enabled.xml | 9 +
.../x86_64-cpuid-EPYC-7601-32-Core-ibpb-guest.xml | 17 +
.../x86_64-cpuid-EPYC-7601-32-Core-ibpb-host.xml | 17 +
.../x86_64-cpuid-EPYC-7601-32-Core-ibpb-json.xml | 12 +
.../x86_64-cpuid-EPYC-7601-32-Core-ibpb.json | 722 ++++++++++++++++++++
.../x86_64-cpuid-EPYC-7601-32-Core-ibpb.xml | 54 ++
.../x86_64-cpuid-Xeon-E5-2609-v3-disabled.xml | 6 +
.../x86_64-cpuid-Xeon-E5-2609-v3-enabled.xml | 8 +
.../x86_64-cpuid-Xeon-E5-2609-v3-guest.xml | 31 +
.../x86_64-cpuid-Xeon-E5-2609-v3-host.xml | 32 +
.../x86_64-cpuid-Xeon-E5-2609-v3-json.xml | 14 +
.../cputestdata/x86_64-cpuid-Xeon-E5-2609-v3.json | 726 +++++++++++++++++++++
tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3.xml | 37 ++
.../x86_64-cpuid-Xeon-E5-2623-v4-disabled.xml | 7 +
.../x86_64-cpuid-Xeon-E5-2623-v4-enabled.xml | 8 +
.../x86_64-cpuid-Xeon-E5-2623-v4-guest.xml | 30 +
.../x86_64-cpuid-Xeon-E5-2623-v4-host.xml | 34 +
.../x86_64-cpuid-Xeon-E5-2623-v4-json.xml | 11 +
.../cputestdata/x86_64-cpuid-Xeon-E5-2623-v4.json | 662 +++++++++++++++++++
tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4.xml | 43 ++
.../x86_64-cpuid-Xeon-Gold-5115-disabled.xml | 8 +
.../x86_64-cpuid-Xeon-Gold-5115-enabled.xml | 8 +
.../x86_64-cpuid-Xeon-Gold-5115-guest.xml | 29 +
.../x86_64-cpuid-Xeon-Gold-5115-host.xml | 30 +
.../x86_64-cpuid-Xeon-Gold-5115-json.xml | 8 +
tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115.json | 614 +++++++++++++++++
tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115.xml | 54 ++
37 files changed, 4519 insertions(+)
create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-5600U-ibrs-disabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-5600U-ibrs-enabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-5600U-ibrs-guest.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-5600U-ibrs-host.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-5600U-ibrs-json.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-5600U-ibrs.json
create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-5600U-ibrs.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-EPYC-7601-32-Core-ibpb-disabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-EPYC-7601-32-Core-ibpb-enabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-EPYC-7601-32-Core-ibpb-guest.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-EPYC-7601-32-Core-ibpb-host.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-EPYC-7601-32-Core-ibpb-json.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-EPYC-7601-32-Core-ibpb.json
create mode 100644 tests/cputestdata/x86_64-cpuid-EPYC-7601-32-Core-ibpb.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3-disabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3-enabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3-guest.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3-host.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3-json.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3.json
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2609-v3.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4-disabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4-enabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4-guest.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4-host.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4-json.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4.json
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E5-2623-v4.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115-disabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115-enabled.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115-guest.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115-host.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115-json.xml
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115.json
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-5115.xml
--
2.15.1
6 years, 10 months
[libvirt] Test failures in libvirt RHEL-6.2.AUS errata job
by Jingjing Shao
Hi admin,
I met the error as below in the in libvirt RHEL-6.2.AUS errata job, can you help to check it ?
=======================================
1 of 54 tests failed
(2 tests were not run)
Please report to libvir-list(a)redhat.com
=======================================
make[1]: *** [check-TESTS] Error 1
make[1]: Leaving directory `/home/test/rpmbuild/BUILD/libvirt-0.9.4/tests'
make: *** [check-am] Error 2
error: Bad exit status from /var/tmp/rpm-tmp.FOpZXU (%check)
Details can be seen in attachment.
Reference: http://nest.test.redhat.com/mnt/qa/scratch/x86-64-6s-2aus-v1/2017:32031/t...
--
Regards,
Jingjing Shao
6 years, 10 months
[libvirt] [PATCH] Add Eduardo Otubo to Planet Virt-Tools
by Eduardo Otubo
Adding Eduardo Otubo's blog information and avatar to config.ini at
Planet Virt-Tools.
Signed-ff-by: Eduardo Otubo <otubo(a)redhat.com>
---
updater/virt-tools/config.ini | 6 ++++++
updater/virt-tools/images/otubo.png | Bin 0 -> 10597 bytes
2 files changed, 6 insertions(+)
create mode 100644 updater/virt-tools/images/otubo.png
diff --git a/updater/virt-tools/config.ini b/updater/virt-tools/config.ini
index 988e572..d47e82f 100644
--- a/updater/virt-tools/config.ini
+++ b/updater/virt-tools/config.ini
@@ -167,3 +167,9 @@ name = Nathan Gauër
[https://virtualpenguins.blogspot.com/feeds/posts/default]
name = Cornelia Huck
+
+[http://www.otubo.net/feeds/posts/default/-/virt/?alt=rss]
+name = Eduardo Otubo
+face = otubo.png
+facewidth = 80
+faceheight = 80
diff --git a/updater/virt-tools/images/otubo.png b/updater/virt-tools/images/otubo.png
new file mode 100644
index 0000000000000000000000000000000000000000..9dfd30fce1c7b06bac5ad9b07052ad170bbe768a
GIT binary patch
literal 10597
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
literal 0
HcmV?d00001
--
2.14.3
6 years, 10 months
[libvirt] [RFC PATCH 00/10] Resolve libvirtd hang on termination with connected long running client
by John Ferlan
This RFC is a combination of a couple of different patch postings that
I've combined into one central "stream" of patches that can be discussed
for their relative importance or need to fix the problem.
Although a bit long winded, I think I've captured enough history for
anyone so inclined to walk through the history to understand the maze
of twisty patches that it takes to hopefully resolve the issue.
The first two patches were presented previously, but not accepted:
https://www.redhat.com/archives/libvir-list/2017-November/msg00296.html
https://www.redhat.com/archives/libvir-list/2017-November/msg00297.html
However since that time, it seems "some form" of the patches is necessary.
Most importantly making sure the virObjectUnref for @srv and @srvAdm occurs
*prior to* the virNetDaemonClose(dmn); at cleanup (IOW: out of order for a
reason). Doing that also requires any program started on the servers also
has the virObjectUnref prior to daemon close.
The 3rd and 4th patches are a result of discussions held in mid
December related to libvirtd crashes/hangs and some possible adjustments
to help. Discussion starts here:
https://www.redhat.com/archives/libvir-list/2017-December/msg00515.html
This led to suggestions to move the toggling of services from Dispose
to Close *and* to split the virThreadPoolFree into a Drain function
that could also be called during the Close function rather than waiting
for the Dispose to occur.
Still testing showed that just those 4 patches it still wasn't enough
as libvirtd ended up just "hung" because of some patches Nikolay posted
that add a new shutdown state, see:
https://www.redhat.com/archives/libvir-list/2017-October/msg01134.html
Those patches languished mainly because it wasn't clear (at the time)
the relationship between them and another series dealing with libvirtd
crashes that was partially accepted and pushed:
https://www.redhat.com/archives/libvir-list/2017-October/msg01347.html
and followup discussion starting here:
https://www.redhat.com/archives/libvir-list/2017-November/msg00023.html
The 9th patch can be used to test that the first 8 do the job. The
details on how I set up the test environment is in the patch. If the
sequence is run before the first 8 patches, you will end up with a
couple of different hang scenarios. So if you're compelled to see
what the big deal is, then apply this one alone and have fun playing.
The 10th patch is the one patch from the partially pushed series that
wasn't pushed as it was not deemed necessary. It's presented here mainly
for completeness.
John Ferlan (5):
libvirtd: Alter refcnt processing for domain server objects
libvirtd: Alter refcnt processing for server program objects
netserver: Toggle service off during close
qemu: Introduce virTheadPoolDrain
APPLY ONLY FOR TESTING PURPOSES
Nikolay Shirokovskiy (5):
libvirt: introduce hypervisor driver shutdown function
qemu: implement state driver shutdown function
qemu: agent: fix monitor close during first sync
qemu: monitor: check monitor not closed upon send
libvirtd: fix crash on termination
daemon/libvirtd.c | 46 ++++++++++++++++++++++++++++++++-----------
src/driver-state.h | 4 ++++
src/libvirt.c | 18 +++++++++++++++++
src/libvirt_internal.h | 1 +
src/libvirt_private.syms | 2 ++
src/qemu/qemu_agent.c | 14 ++++++-------
src/qemu/qemu_driver.c | 44 +++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor.c | 27 ++++++++++++-------------
src/rpc/virnetdaemon.c | 1 +
src/rpc/virnetserver.c | 5 ++---
src/rpc/virnetserverservice.c | 2 ++
src/util/virthreadpool.c | 19 ++++++++++++------
src/util/virthreadpool.h | 2 ++
13 files changed, 143 insertions(+), 42 deletions(-)
--
2.13.6
6 years, 10 months
[libvirt] [PATCH V2] nodedev: Fix failing to parse PCI address for non-PCI network devices
by Jim Fehlig
Based loosely on a patch from Fei Li <fli(a)suse.com>.
Commit 8708ca01c added virNetDevSwitchdevFeature() to check if a network
device has Switchdev capabilities. virNetDevSwitchdevFeature() attempts
to retrieve the PCI device associated with the network device, ignoring
non-PCI devices. It does so via the following call chain
virNetDevSwitchdevFeature()->virNetDevGetPCIDevice()->
virPCIGetDeviceAddressFromSysfsLink()
For non-PCI network devices (qeth, Xen vif, etc),
virPCIGetDeviceAddressFromSysfsLink() will report an error when
virPCIDeviceAddressParse() fails. virPCIDeviceAddressParse() also
logs an error. After commit 8708ca01c there are now two errors reported
for each non-PCI network device even though the errors are harmless.
To avoid changing virPCIGetDeviceAddressFromSysfsLink(),
virPCIDeviceAddressParse() and related code that has quite a few
call sites, add a function to check if a network device is a
PCI device and use it in virNetDevSwitchdevFeature() before attempting
to retrieve the PCI device.
---
Suggestions welcome on a better name for virPCIIsPCIDevice, or even
a better approach to solving this issue. Currently virPCIIsPCIDevice
assumes the device is PCI if its subsystem starts with 'pci'. I'd be
happy to hear if there is a better way to determine if a network
device is PCI.
src/libvirt_private.syms | 1 +
src/util/virnetdev.c | 25 ++++++++++++++++++++++---
src/util/virpci.c | 32 ++++++++++++++++++++++++++++++++
src/util/virpci.h | 3 +++
4 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a705fa846..bdf98ded1 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2458,6 +2458,7 @@ virPCIGetVirtualFunctionInfo;
virPCIGetVirtualFunctions;
virPCIHeaderTypeFromString;
virPCIHeaderTypeToString;
+virPCIIsPCIDevice;
virPCIIsVirtualFunction;
virPCIStubDriverTypeFromString;
virPCIStubDriverTypeToString;
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index eb2d119bf..a9af08797 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -1148,6 +1148,21 @@ virNetDevSysfsDeviceFile(char **pf_sysfs_device_link, const char *ifname,
}
+static bool
+virNetDevIsPCIDevice(const char *devName)
+{
+ char *vfSysfsDevicePath = NULL;
+ bool ret;
+
+ if (virNetDevSysfsFile(&vfSysfsDevicePath, devName, "device/subsystem") < 0)
+ return false;
+
+ ret = virPCIIsPCIDevice(vfSysfsDevicePath);
+ VIR_FREE(vfSysfsDevicePath);
+ return ret;
+}
+
+
static virPCIDevicePtr
virNetDevGetPCIDevice(const char *devName)
{
@@ -3236,14 +3251,18 @@ virNetDevSwitchdevFeature(const char *ifname,
if (is_vf == 1 && virNetDevGetPhysicalFunction(ifname, &pfname) < 0)
goto cleanup;
- pci_device_ptr = pfname ? virNetDevGetPCIDevice(pfname) :
- virNetDevGetPCIDevice(ifname);
+ if (pfname == NULL && VIR_STRDUP(pfname, ifname) < 0)
+ goto cleanup;
+
/* No PCI device, then no feature bit to check/add */
- if (pci_device_ptr == NULL) {
+ if (!virNetDevIsPCIDevice(pfname)) {
ret = 0;
goto cleanup;
}
+ if ((pci_device_ptr = virNetDevGetPCIDevice(pfname)) == NULL)
+ goto cleanup;
+
if (!(nl_msg = nlmsg_alloc_simple(family_id,
NLM_F_REQUEST | NLM_F_ACK))) {
virReportOOMError();
diff --git a/src/util/virpci.c b/src/util/virpci.c
index fe57bef32..f22d89cd7 100644
--- a/src/util/virpci.c
+++ b/src/util/virpci.c
@@ -2651,6 +2651,38 @@ virPCIGetDeviceAddressFromSysfsLink(const char *device_link)
return bdf;
}
+/**
+ * virPCIIsPCIDevice:
+ * @device_link: sysfs path for the device
+ *
+ * Returns true if the device specified in @device_link sysfs
+ * path is a PCI device, otherwise returns false.
+ */
+bool
+virPCIIsPCIDevice(const char *device_link)
+{
+ char *device_path = NULL;
+ char *subsys = NULL;
+ bool ret;
+
+ if (!virFileExists(device_link)) {
+ VIR_DEBUG("'%s' does not exist", device_link);
+ return false;
+ }
+
+ device_path = canonicalize_file_name(device_link);
+ if (device_path == NULL) {
+ VIR_DEBUG("Failed to resolve device link '%s'", device_link);
+ return false;
+ }
+
+ subsys = last_component(device_path);
+ ret = STRPREFIX(subsys, "pci");
+
+ VIR_FREE(device_path);
+ return ret;
+}
+
/**
* virPCIGetPhysicalFunction:
* @vf_sysfs_path: sysfs path for the virtual function
diff --git a/src/util/virpci.h b/src/util/virpci.h
index f1fbe39e6..489d8a777 100644
--- a/src/util/virpci.h
+++ b/src/util/virpci.h
@@ -190,6 +190,9 @@ int virPCIDeviceWaitForCleanup(virPCIDevicePtr dev, const char *matcher);
virPCIDeviceAddressPtr
virPCIGetDeviceAddressFromSysfsLink(const char *device_link);
+bool
+virPCIIsPCIDevice(const char *device_link);
+
int virPCIGetPhysicalFunction(const char *vf_sysfs_path,
virPCIDeviceAddressPtr *pf);
--
2.15.1
6 years, 10 months