On 02/25/2014 09:07 AM, Michal Privoznik wrote: > 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@xxxxxxxxxx> > --- > src/util/virnetdevveth.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > ACK -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list