[libvirt] [PATCH v2] nwfilter: fix deadlock caused updating network device and nwfilter

Pavel Hrdina phrdina at redhat.com
Thu Nov 13 09:31:13 UTC 2014


On 11/12/2014 05:17 PM, John Ferlan wrote:
>
>
> On 11/12/2014 04:51 AM, Pavel Hrdina wrote:
>> Commit 6e5c79a1 tried to fix deadlock between nwfilter{Define,Undefine}
>> and starting of guest, but this same deadlock is also for
>
> s/is also/exists/
>
>> updating/attaching network device to domain.
>>
>> The deadlock was introduced by removing global QEMU driver lock because
>> nwfilter was counting on this lock and ensure that all driver locks are
>> locked inside of nwfilter{Define,Undefine}.
>>
>> This patch extends usage of virNWFilterReadLockFilterUpdates to prevent
>> the deadlock for all possible paths in QEMU driver. LXC and UML drivers
>> still have global lock.
>>
>> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1143780
>>
>> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
>> ---
>>   src/qemu/qemu_driver.c    | 12 ++++++++++++
>>   src/qemu/qemu_migration.c |  3 +++
>>   src/qemu/qemu_process.c   |  4 ++++
>>   3 files changed, 19 insertions(+)
>>
>
> I thought I had built these yesterday when reviewing, but apparently not
> as doing a build just now failed because the symbols are not defined in
> qemu_migration.c and qemu_process.c (I have gcc version 4.8.3 20140911
> (Red Hat 4.8.3-7) (GCC) on my f20 box)
>
> I squashed the following and it builds...
>
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 533bb35..9106800 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -50,6 +50,7 @@
>   #include "viruuid.h"
>   #include "virtime.h"
>   #include "locking/domain_lock.h"
> +#include "nwfilter_conf.h"
>   #include "rpc/virnetsocket.h"
>   #include "virstoragefile.h"
>   #include "viruri.h"
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 0078a70..1c1476c 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -57,6 +57,7 @@
>   #include "domain_nwfilter.h"
>   #include "locking/domain_lock.h"
>   #include "network/bridge_driver.h"
> +#include "nwfilter_conf.h"
>   #include "viruuid.h"
>   #include "virprocess.h"
>   #include "virtime.h"
>
> ACK with the squashed in #includes
>

Thanks, I've already found that build issue and fixed it.

>
> John
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 56e8430..716e9a4 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -5902,6 +5902,8 @@ qemuDomainRestoreFlags(virConnectPtr conn,
>>                     VIR_DOMAIN_SAVE_PAUSED, -1);
>>
>>
>> +    virNWFilterReadLockFilterUpdates();
>> +
>>       fd = qemuDomainSaveImageOpen(driver, path, &def, &header, &xml,
>>                                    (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != 0,
>>                                    &wrapperFd, false, false);
>> @@ -5979,6 +5981,7 @@ qemuDomainRestoreFlags(virConnectPtr conn,
>>       virFileWrapperFdFree(wrapperFd);
>>       if (vm)
>>           virObjectUnlock(vm);
>> +    virNWFilterUnlockFilterUpdates();
>>       return ret;
>>   }
>>
>> @@ -7500,6 +7503,8 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>>       virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
>>                     VIR_DOMAIN_AFFECT_CONFIG, -1);
>>
>> +    virNWFilterReadLockFilterUpdates();
>> +
>>       cfg = virQEMUDriverGetConfig(driver);
>>
>>       affect = flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG);
>> @@ -7616,6 +7621,7 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>>           virObjectUnlock(vm);
>>       virObjectUnref(caps);
>>       virObjectUnref(cfg);
>> +    virNWFilterUnlockFilterUpdates();
>>       return ret;
>>   }
>>
>> @@ -7646,6 +7652,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
>>                     VIR_DOMAIN_AFFECT_CONFIG |
>>                     VIR_DOMAIN_DEVICE_MODIFY_FORCE, -1);
>>
>> +    virNWFilterReadLockFilterUpdates();
>> +
>>       cfg = virQEMUDriverGetConfig(driver);
>>
>>       affect = flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG);
>> @@ -7762,6 +7770,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
>>           virObjectUnlock(vm);
>>       virObjectUnref(caps);
>>       virObjectUnref(cfg);
>> +    virNWFilterUnlockFilterUpdates();
>>       return ret;
>>   }
>>
>> @@ -14503,6 +14512,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
>>        * and use of FORCE can cause multiple transitions.
>>        */
>>
>> +    virNWFilterReadLockFilterUpdates();
>> +
>>       if (!(vm = qemuDomObjFromSnapshot(snapshot)))
>>           return -1;
>>
>> @@ -14824,6 +14835,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
>>           virObjectUnlock(vm);
>>       virObjectUnref(caps);
>>       virObjectUnref(cfg);
>> +    virNWFilterUnlockFilterUpdates();
>>
>>       return ret;
>>   }
>> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
>> index c797206..533bb35 100644
>> --- a/src/qemu/qemu_migration.c
>> +++ b/src/qemu/qemu_migration.c
>> @@ -2525,6 +2525,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>>       if (virTimeMillisNow(&now) < 0)
>>           return -1;
>>
>> +    virNWFilterReadLockFilterUpdates();
>> +
>>       if (flags & VIR_MIGRATE_OFFLINE) {
>>           if (flags & (VIR_MIGRATE_NON_SHARED_DISK |
>>                        VIR_MIGRATE_NON_SHARED_INC)) {
>> @@ -2826,6 +2828,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>>           qemuDomainEventQueue(driver, event);
>>       qemuMigrationCookieFree(mig);
>>       virObjectUnref(caps);
>> +    virNWFilterUnlockFilterUpdates();
>>       return ret;
>>
>>    stop:
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index 24e5f0f..0078a70 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -3438,6 +3438,8 @@ qemuProcessReconnect(void *opaque)
>>
>>       VIR_FREE(data);
>>
>> +    virNWFilterReadLockFilterUpdates();
>> +
>>       virObjectLock(obj);
>>
>>       cfg = virQEMUDriverGetConfig(driver);
>> @@ -3589,6 +3591,7 @@ qemuProcessReconnect(void *opaque)
>>
>>       virObjectUnref(conn);
>>       virObjectUnref(cfg);
>> +    virNWFilterUnlockFilterUpdates();
>>
>>       return;
>>
>> @@ -3624,6 +3627,7 @@ qemuProcessReconnect(void *opaque)
>>       }
>>       virObjectUnref(conn);
>>       virObjectUnref(cfg);
>> +    virNWFilterUnlockFilterUpdates();
>>   }
>>
>>   static int
>>




More information about the libvir-list mailing list