]> git.ipfire.org Git - thirdparty/libvirt.git/commit
virNetDevVethCreate: Serialize callers
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 25 Feb 2014 15:41:07 +0000 (16:41 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 26 Feb 2014 07:50:47 +0000 (08:50 +0100)
commitc0d162c68c2f19af8d55a435a9e372da33857048
tree83e993f40e9133eeef4aab57fcab51f84259ebc9
parentf2dc1f67043eb18f781d3016d4a3ea38eb72836a
virNetDevVethCreate: Serialize callers

Consider dozen of LXC domains, each of them having this type of interface:

    <interface type='network'>
      <mac address='52:54:00:a7:05:4b'/>
      <source network='default'/>
    </interface>

When starting these domain in parallel, all workers may meet in
virNetDevVethCreate() where a race starts. Race over allocating veth
pairs because allocation requires two steps:

  1) find first nonexistent '/sys/class/net/vnet%d/'
  2) run 'ip link add ...' command

Now consider two threads. Both of them find N as the first unused veth
index but only one of them succeeds allocating it. The other one fails.
For such cases, we are running the allocation in a loop with 10 rounds.
However this is very flaky synchronization. It should be rather used
when libvirt is competing with other process than when libvirt threads
fight each other. Therefore, internally we should use mutex to serialize
callers, and do the allocation in loop (just in case we are competing
with a different process). By the way we have something similar already
since 1cf97c87.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/util/virnetdevveth.c