libvirt/src/util
Eric Blake b4541a2f3d cgroup: be robust against cgroup movement races
https://bugzilla.redhat.com/show_bug.cgi?id=965169 documents a
problem starting domains when cgroups are enabled; I was able
to reliably reproduce the race about 5% of the time when I added
hooks to domain startup by 3 seconds (as that seemed to be about
the length of time that qemu created and then closed a temporary
thread, probably related to aio handling of initially opening
a disk image).  The problem has existed since we introduced
virCgroupMoveTask in commit 9102829 (v0.10.0).

There are some inherent TOCTTOU races when moving tasks between
kernel cgroups, precisely because threads can be created or
completed in the window between when we read a thread id from the
source and when we write to the destination.  As the goal of
virCgroupMoveTask is merely to move ALL tasks into the new
cgroup, it is sufficient to iterate until no more threads are
being created in the old group, and ignoring any threads that
die before we can move them.

It would be nicer to start the threads in the right cgroup to
begin with, but by default, all child threads are created in
the same cgroup as their parent, and we don't want vcpu child
threads in the emulator cgroup, so I don't see any good way
of avoiding the move.  It would also be nice if the kernel were
to implement something like rename() as a way to atomically move
a group of threads from one cgroup to another, instead of forcing
a window where we have to read and parse the source, then format
and write back into the destination.

* src/util/vircgroup.c (virCgroupAddTaskStrController): Ignore
ESRCH, because a thread ended between read and write attempts.
(virCgroupMoveTask): Loop until all threads have moved.

Signed-off-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit 83e4c77547)
2013-05-21 11:57:07 -06:00
..
iohelper.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
keymaps.csv
viralloc.c util: fix virAllocVar's comment 2013-03-22 13:05:46 +01:00
viralloc.h viralloc: Export virAllocTest* 2013-03-22 12:45:14 +01:00
virarch.c Add armv6l architecture to list of valid arches 2013-04-04 11:07:32 +01:00
virarch.h Add armv6l architecture to list of valid arches 2013-04-04 11:07:32 +01:00
viratomic.c maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
viratomic.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
viraudit.c Convert HAVE_AUDIT to WITH_AUDIT 2013-01-11 11:03:23 +00:00
viraudit.h Change logging category parameter into an enum 2012-09-28 10:39:28 +01:00
virauth.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virauth.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virauthconfig.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virauthconfig.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virbitmap.c util: Add a helper to check if all bits of a bitmap are clear 2013-04-06 10:14:21 +08:00
virbitmap.h util: Add a helper to check if all bits of a bitmap are clear 2013-04-06 10:14:21 +08:00
virbuffer.c util: Check for negative indent in virBufferAdd 2013-01-16 10:52:39 +01:00
virbuffer.h Rename buf.{c,h} to virbuffer.{c,h} 2012-12-21 11:17:12 +00:00
vircgroup.c cgroup: be robust against cgroup movement races 2013-05-21 11:57:07 -06:00
vircgroup.h Fix build breaker with ATTRIBUTE_NONNULL defs 2013-04-16 07:17:00 -04:00
vircgrouppriv.h Track symlinks for co-mounted cgroup controllers 2013-04-15 17:35:32 +01:00
vircommand.c util: new virCommandSetMax(MemLock|Processes|Files) 2013-04-26 10:23:46 -04:00
vircommand.h util: new virCommandSetMax(MemLock|Processes|Files) 2013-04-26 10:23:46 -04:00
virconf.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virconf.h Rename conf.{c,h} to virconf.{c,h} 2012-12-21 11:17:13 +00:00
virdbus.c Convert HAVE_DBUS to WITH_DBUS 2013-01-14 13:25:47 +00:00
virdbus.h Convert HAVE_DBUS to WITH_DBUS 2013-01-14 13:25:47 +00:00
virdnsmasq.c use client id for IPv6 DHCP host definition 2013-02-25 02:49:06 -05:00
virdnsmasq.h use client id for IPv6 DHCP host definition 2013-02-25 02:49:06 -05:00
virebtables.c Use virMacAddrFormat instead of manual mac address formatting 2013-04-02 15:53:43 +02:00
virebtables.h Rename ebtables.{c,h} to virebtables.{c,h} 2012-12-21 11:17:13 +00:00
virendian.h util: add virendian.h macros 2013-02-12 09:00:15 -07:00
virerror.c Add an API for re-mounting cgroups, to isolate the process location 2013-04-15 17:35:32 +01:00
virerror.h Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virevent.c docs: don't ignore virEvent API 2013-02-01 16:01:45 -07:00
virevent.h Rename event.{c,h} to virevent.{c,h} 2012-12-21 11:17:13 +00:00
vireventpoll.c build: avoid non-portable cast of pthread_t 2013-05-06 14:19:35 -06:00
vireventpoll.h Rename event_poll.{c,h} to vireventpoll.{c,h} 2012-12-21 11:17:13 +00:00
virfile.c Introduce a virFileDeleteTree method 2013-04-15 17:35:31 +01:00
virfile.h Introduce a virFileDeleteTree method 2013-04-15 17:35:31 +01:00
virhash.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virhash.h
virhashcode.c maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virhashcode.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virhook.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virhook.h Rename util.{c,h} to virutil.{c,h} 2012-12-21 11:19:49 +00:00
viridentity.c Fix initialization of virIdentityPtr thread locals 2013-03-21 10:58:15 +00:00
viridentity.h Add API to get the system identity 2013-03-19 13:45:19 +00:00
virinitctl.c virInitctlRequest: unbreak make syntax check 2013-05-03 11:26:25 -04:00
virinitctl.h Add APIs for talking to init via /dev/initctl 2012-11-30 19:17:30 +00:00
viriptables.c net: use newer iptables syntax 2013-03-27 16:20:03 -06:00
viriptables.h net: use structs for address and port ranges 2013-02-19 14:42:18 -05:00
virjson.c Convert HAVE_YAJL into WITH_YAJL 2013-01-11 11:03:22 +00:00
virjson.h Rename json.{c,h} to virjson.{c,h} 2012-12-21 11:17:13 +00:00
virkeycode-mapgen.py Rewrite keycode map to avoid a struct 2013-04-08 10:03:20 +01:00
virkeycode.c Rewrite keycode map to avoid a struct 2013-04-08 10:03:20 +01:00
virkeycode.h cleanup: Don't include libvirt/libvirt.h 2013-04-17 15:50:53 +08:00
virkeyfile.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virkeyfile.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virlockspace.c util: Need to check child JSON allocation before use 2013-01-22 14:34:12 +01:00
virlockspace.h Rename json.{c,h} to virjson.{c,h} 2012-12-21 11:17:13 +00:00
virlog.c build: avoid non-portable cast of pthread_t 2013-05-06 14:19:35 -06:00
virlog.h Add method for checking if a string is (probably) a log message 2013-03-07 18:56:52 +00:00
virmacaddr.c util: Change virMacAddrFormat to lowercase hex characters 2013-04-02 15:53:43 +02:00
virmacaddr.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virnetdev.c build: fix cygwin build in virnetdev 2013-04-30 15:16:22 -06:00
virnetdev.h Avoid casts between unsigned char * and struct nlmsghdr 2013-04-08 10:03:21 +01:00
virnetdevbandwidth.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virnetdevbandwidth.h bandwidth: Create rate update function 2012-12-11 18:36:55 +01:00
virnetdevbridge.c Fix conditional build of virNetDevSetupControlFull 2013-03-07 18:08:33 +00:00
virnetdevbridge.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virnetdevmacvlan.c Avoid casts between unsigned char * and struct nlmsghdr 2013-04-08 10:03:21 +01:00
virnetdevmacvlan.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virnetdevopenvswitch.c util: Need to add virCommandFree() 2013-01-24 12:37:30 +01:00
virnetdevopenvswitch.h Rename util.{c,h} to virutil.{c,h} 2012-12-21 11:19:49 +00:00
virnetdevtap.c build: mark conditionally unused variables 2013-04-30 08:21:26 -06:00
virnetdevtap.h virnetdevtap: add virNetDevTapGetName 2013-04-26 15:37:15 -06:00
virnetdevveth.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virnetdevveth.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virnetdevvlan.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virnetdevvlan.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virnetdevvportprofile.c Avoid casts between unsigned char * and struct nlmsghdr 2013-04-08 10:03:21 +01:00
virnetdevvportprofile.h Rename uuid.{c,h} to viruuid.{c,h} 2012-12-21 11:19:49 +00:00
virnetlink.c Fix signature of dummy virNetlinkCommand stub 2013-04-15 17:35:30 +01:00
virnetlink.h Avoid casts between unsigned char * and struct nlmsghdr 2013-04-08 10:03:21 +01:00
virnodesuspend.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virnodesuspend.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virnuma.c util: Error out if the numa nodeset is out of range 2013-04-24 23:23:31 +08:00
virnuma.h NUMA: cleanup for numa related codes 2013-03-20 19:37:00 +08:00
virobject.c Use VIR_ALLOC_VAR instead of VIR_ALLOC_N for creating virObject 2013-04-08 10:03:21 +01:00
virobject.h build: allow virObject to have no parent 2013-01-22 13:45:38 -07:00
virpci.c pci: autolearn name of stub driver, remove from arglist 2013-05-02 02:09:29 -04:00
virpci.h pci: autolearn name of stub driver, remove from arglist 2013-05-02 02:09:29 -04:00
virpidfile.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virpidfile.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virportallocator.c build: fix build on BSD 2013-01-17 16:39:10 -07:00
virportallocator.h Add a port allocator class 2013-01-16 11:02:58 +00:00
virprocess.c build: fix mingw build of virprocess.c 2013-05-06 14:17:35 -06:00
virprocess.h util: new virCommandSetMax(MemLock|Processes|Files) 2013-04-26 10:23:46 -04:00
virrandom.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virrandom.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virsexpr.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virsexpr.h Rename sexpr.{c,h} to virsexpr.{c,h} 2012-12-21 11:19:48 +00:00
virsocketaddr.c create virSocketAddrGetIpPrefix utility function 2013-04-22 14:10:53 -04:00
virsocketaddr.h create virSocketAddrGetIpPrefix utility function 2013-04-22 14:10:53 -04:00
virstatslinux.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virstatslinux.h Rename stats_linux.{c,h} to virstatslinux.{c,h} 2012-12-21 11:19:48 +00:00
virstoragefile.c util: fix virFileOpenAs return value and resulting error logs 2013-05-10 13:10:07 -04:00
virstoragefile.h build: avoid unsafe functions in libgen.h 2013-04-25 14:47:01 -06:00
virstring.c Add function to find a needle in a string array 2013-04-12 16:55:45 -04:00
virstring.h Add function to find a needle in a string array 2013-04-12 16:55:45 -04:00
virsysinfo.c Implement minimal sysinfo for ARM platforms 2013-04-04 11:07:31 +01:00
virsysinfo.h Rename util.{c,h} to virutil.{c,h} 2012-12-21 11:19:49 +00:00
virthread.c Rename threads.{c,h} to virthread.{c,h} 2012-12-21 11:19:49 +00:00
virthread.h build: avoid non-portable cast of pthread_t 2013-05-06 14:19:35 -06:00
virthreadpool.c virCondDestroy: Lose attribute RETURN_CHECK 2013-02-08 09:12:11 +01:00
virthreadpool.h Rename threadpool.{c,h} to virthreadpool.{c,h} 2012-12-21 11:19:48 +00:00
virthreadpthread.c build: avoid non-portable cast of pthread_t 2013-05-06 14:19:35 -06:00
virthreadpthread.h Rename threads.{c,h} to virthread.{c,h} 2012-12-21 11:19:49 +00:00
virthreadwin32.c build: avoid non-portable cast of pthread_t 2013-05-06 14:19:35 -06:00
virthreadwin32.h Rename threads.{c,h} to virthread.{c,h} 2012-12-21 11:19:49 +00:00
virtime.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
virtime.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
virtpm.c Helper functions for host TPM support 2013-04-12 16:55:45 -04:00
virtpm.h Helper functions for host TPM support 2013-04-12 16:55:45 -04:00
virtypedparam.c Avoid resetting errors in virTypedParamsFree 2013-02-19 10:52:37 +01:00
virtypedparam.h Introduce virTypedParamsClear public API 2013-01-18 15:04:00 +01:00
viruri.c Rename virterror.c virterror_internal.h to virerror.{c,h} 2012-12-21 11:19:50 +00:00
viruri.h Fix crash accessing a NULL URI when looking up auth credentials 2012-09-21 10:13:53 +01:00
virusb.c Use unsigned int instead of unsigned 2013-04-15 23:07:08 +08:00
virusb.h Convert virPCIDeviceList and virUSBDeviceList into virObjectLockable 2013-02-05 19:22:26 +00:00
virutil.c util: fix virFileOpenAs return value and resulting error logs 2013-05-10 13:10:07 -04:00
virutil.h qemu: Fix setting of memory tunables 2013-04-23 07:10:56 +02:00
viruuid.c Generate RFC4122 compliant UUIDs 2013-04-08 13:18:07 -06:00
viruuid.h Rename uuid.{c,h} to viruuid.{c,h} 2012-12-21 11:19:49 +00:00
virxml.c util: Add docs for virXMLProp string 2013-02-27 11:49:03 +01:00
virxml.h Rename xml.{c,h} to virxml.{c,h} 2012-12-21 11:19:50 +00:00