• M
    nwfilter: fix lock order deadlock · 2f5e24ba
    Maxim Nestratov 提交于
    Below is backtraces of two deadlocked threads:
    
    thread #1:
     virDomainConfVMNWFilterTeardown
       virNWFilterTeardownFilter
           lock updateMutex <------------
           _virNWFilterTeardownFilter
                try to lock interface <----------
    
    thread #2:
     learnIPAddressThread
        lock interface <-------
        virNWFilterInstantiateFilterLate
            try to lock updateMutex <----------
    
    The problem is fixed by unlocking interface before calling
    virNWFilterInstantiateFilterLate to avoid updateMutex and interface ordering
    deadlocks. Otherwise we are going to instantiate the filter while holding
    interface lock, which will try to lock updateMutex, and if some other thread
    instantiating a filter in parallel is holding updateMutex and is trying to
    lock interface, both will deadlock.
    Also it is safe to unlock interface before virNWFilterInstantiateFilterLate
    because learnIPAddressThread stopped capturing packets and applied necessary
    rules on the interface, while instantiating a new filter doesn't require a
    locked interface.
    Signed-off-by: NMaxim Nestratov <mnestratov@virtuozzo.com>
    2f5e24ba
nwfilter_learnipaddr.c 24.8 KB