summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Asselstine <mark.asselstine@windriver.com>2018-11-28 11:17:32 -0500
committerBruce Ashfield <bruce.ashfield@windriver.com>2018-11-29 12:05:18 -0500
commit9ad042c295179a99f2f774cc42faea6fd42badcd (patch)
tree2fc93e11f4769cd0c45bd63f89e54de5316eeefc
parent885e8770585d4010f19a5b462764e8cc8455c2fd (diff)
downloadmeta-virtualization-9ad042c295179a99f2f774cc42faea6fd42badcd.tar.gz
libvirt: uprev from 4.7.0 to 4.9.0
Minor update bringing in new features such as better support for cgroup v2, vfio AP support, support for XEN suspend/wakeup. Basic usecases pass and the ptest return similar results we have been achieving with the last few uprevs: ==================================== Testsuite summary for libvirt 4.9.0 ==================================== # TOTAL: 120 # PASS: 117 # SKIP: 0 # XFAIL: 0 # FAIL: 3 # XPASS: 0 # ERROR: 0 Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
-rw-r--r--recipes-extended/libvirt/libvirt-python.inc4
-rw-r--r--recipes-extended/libvirt/libvirt/lxc_monitor-Avoid-AB-BA-lock-race.patch106
-rw-r--r--recipes-extended/libvirt/libvirt_4.9.0.bb (renamed from recipes-extended/libvirt/libvirt_4.7.0.bb)5
3 files changed, 4 insertions, 111 deletions
diff --git a/recipes-extended/libvirt/libvirt-python.inc b/recipes-extended/libvirt/libvirt-python.inc
index be9079d7..ae43ba80 100644
--- a/recipes-extended/libvirt/libvirt-python.inc
+++ b/recipes-extended/libvirt/libvirt-python.inc
@@ -18,8 +18,8 @@ FILES_${PN}-python = "${bindir}/* ${libdir}/* ${libdir}/${PYTHON_DIR}/*"
18SRC_URI += "http://libvirt.org/sources/python/libvirt-python-${PV}.tar.gz;name=libvirt_python" 18SRC_URI += "http://libvirt.org/sources/python/libvirt-python-${PV}.tar.gz;name=libvirt_python"
19SRC_URI += "file://libvirt_api_xml_path.patch;patchdir=../libvirt-python-${PV}" 19SRC_URI += "file://libvirt_api_xml_path.patch;patchdir=../libvirt-python-${PV}"
20 20
21SRC_URI[libvirt_python.md5sum] = "32cf281199367aec2881c96d1bd80dc6" 21SRC_URI[libvirt_python.md5sum] = "cba7dc90d564aa8c267c38d452b83f80"
22SRC_URI[libvirt_python.sha256sum] = "e36fee5898de3550ed7e63d5d0a8447f9d78f06574634855dee59eae27930908" 22SRC_URI[libvirt_python.sha256sum] = "01c4becf50b521a9e3d1b48a3a79d83cb389d86d760b895d911d78f5b6ae7b60"
23 23
24export LIBVIRT_API_PATH = "${S}/docs/libvirt-api.xml" 24export LIBVIRT_API_PATH = "${S}/docs/libvirt-api.xml"
25export LIBVIRT_CFLAGS = "-I${S}/include" 25export LIBVIRT_CFLAGS = "-I${S}/include"
diff --git a/recipes-extended/libvirt/libvirt/lxc_monitor-Avoid-AB-BA-lock-race.patch b/recipes-extended/libvirt/libvirt/lxc_monitor-Avoid-AB-BA-lock-race.patch
deleted file mode 100644
index fc3880fb..00000000
--- a/recipes-extended/libvirt/libvirt/lxc_monitor-Avoid-AB-BA-lock-race.patch
+++ /dev/null
@@ -1,106 +0,0 @@
1From 7882c6eca53fe9abe253497a50f6c5ae062176d3 Mon Sep 17 00:00:00 2001
2From: Mark Asselstine <mark.asselstine@windriver.com>
3Date: Mon, 24 Sep 2018 11:11:35 -0400
4Subject: [PATCH] lxc_monitor: Avoid AB / BA lock race
5
6A deadlock situation can occur when autostarting a LXC domain 'guest'
7due to two threads attempting to take opposing locks while holding
8opposing locks (AB BA problem). Thread A takes and holds the 'vm' lock
9while attempting to take the 'client' lock, meanwhile, thread B takes
10and holds the 'client' lock while attempting to take the 'vm' lock.
11
12The potential for this can be seen as follows:
13
14Thread A:
15virLXCProcessAutostartDomain (takes vm lock)
16 --> virLXCProcessStart
17 --> virLXCProcessConnectMonitor
18 --> virLXCMonitorNew
19 --> virNetClientSetCloseCallback (wants client lock)
20
21Thread B:
22virNetClientIncomingEvent (takes client lock)
23 --> virNetClientIOHandleInput
24 --> virNetClientCallDispatch
25 --> virNetClientCallDispatchMessage
26 --> virNetClientProgramDispatch
27 --> virLXCMonitorHandleEventInit
28 --> virLXCProcessMonitorInitNotify (wants vm lock)
29
30Since these threads are scheduled independently and are preemptible it
31is possible for the deadlock scenario to occur where each thread locks
32their first lock but both will fail to get their second lock and just
33spin forever. You get something like:
34
35virLXCProcessAutostartDomain (takes vm lock)
36 --> virLXCProcessStart
37 --> virLXCProcessConnectMonitor
38 --> virLXCMonitorNew
39<...>
40virNetClientIncomingEvent (takes client lock)
41 --> virNetClientIOHandleInput
42 --> virNetClientCallDispatch
43 --> virNetClientCallDispatchMessage
44 --> virNetClientProgramDispatch
45 --> virLXCMonitorHandleEventInit
46 --> virLXCProcessMonitorInitNotify (wants vm lock but spins)
47<...>
48 --> virNetClientSetCloseCallback (wants client lock but spins)
49
50Neither thread ever gets the lock it needs to be able to continue
51while holding the lock that the other thread needs.
52
53The actual window for preemption which can cause this deadlock is
54rather small, between the calls to virNetClientProgramNew() and
55execution of virNetClientSetCloseCallback(), both in
56virLXCMonitorNew(). But it can be seen in real world use that this
57small window is enough.
58
59By moving the call to virNetClientSetCloseCallback() ahead of
60virNetClientProgramNew() we can close any possible chance of the
61deadlock taking place. There should be no other implications to the
62move since the close callback (in the unlikely event was called) will
63spin on the vm lock. The remaining work that takes place between the
64old call location of virNetClientSetCloseCallback() and the new
65location is unaffected by the move.
66
67Upstream-Status: Backport commit 7882c6eca53f
68
69Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
70Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
71---
72 src/lxc/lxc_monitor.c | 11 +++++++----
73 1 file changed, 7 insertions(+), 4 deletions(-)
74
75diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c
76index e765c16..0b18a14 100644
77--- a/src/lxc/lxc_monitor.c
78+++ b/src/lxc/lxc_monitor.c
79@@ -161,6 +161,13 @@ virLXCMonitorPtr virLXCMonitorNew(virDomainObjPtr vm,
80 if (virNetClientRegisterAsyncIO(mon->client) < 0)
81 goto error;
82
83+ /* avoid deadlock by making this call before assigning virLXCMonitorEvents */
84+ virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon,
85+ virLXCMonitorCloseFreeCallback);
86+
87+ /* close callback now has its own reference */
88+ virObjectRef(mon);
89+
90 if (!(mon->program = virNetClientProgramNew(VIR_LXC_MONITOR_PROGRAM,
91 VIR_LXC_MONITOR_PROGRAM_VERSION,
92 virLXCMonitorEvents,
93@@ -175,10 +182,6 @@ virLXCMonitorPtr virLXCMonitorNew(virDomainObjPtr vm,
94 mon->vm = virObjectRef(vm);
95 memcpy(&mon->cb, cb, sizeof(mon->cb));
96
97- virObjectRef(mon);
98- virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon,
99- virLXCMonitorCloseFreeCallback);
100-
101 cleanup:
102 VIR_FREE(sockpath);
103 return mon;
104--
1052.7.4
106
diff --git a/recipes-extended/libvirt/libvirt_4.7.0.bb b/recipes-extended/libvirt/libvirt_4.9.0.bb
index 51367985..768cf0e7 100644
--- a/recipes-extended/libvirt/libvirt_4.7.0.bb
+++ b/recipes-extended/libvirt/libvirt_4.9.0.bb
@@ -35,11 +35,10 @@ SRC_URI = "http://libvirt.org/sources/libvirt-${PV}.tar.xz;name=libvirt \
35 file://install-missing-file.patch \ 35 file://install-missing-file.patch \
36 file://0001-ptest-Remove-Windows-1252-check-from-esxutilstest.patch \ 36 file://0001-ptest-Remove-Windows-1252-check-from-esxutilstest.patch \
37 file://configure.ac-search-for-rpc-rpc.h-in-the-sysroot.patch \ 37 file://configure.ac-search-for-rpc-rpc.h-in-the-sysroot.patch \
38 file://lxc_monitor-Avoid-AB-BA-lock-race.patch \
39 " 38 "
40 39
41SRC_URI[libvirt.md5sum] = "38da6c33250dcbc0a6d68de5c758262b" 40SRC_URI[libvirt.md5sum] = "aaf7b265ac2013d6eb184a86b5f7eeb9"
42SRC_URI[libvirt.sha256sum] = "92c279f7321624ac5a37a81f8bbe8c8d2a16781da04c63c99c92d3de035767e4" 41SRC_URI[libvirt.sha256sum] = "4fd4bfe7312b7996a817c7919cf0062de0d5b3c400c93bd30855a46c40dd455a"
43 42
44inherit autotools gettext update-rc.d pkgconfig ptest systemd 43inherit autotools gettext update-rc.d pkgconfig ptest systemd
45 44