diff options
author | Sorin Vinturis <svinturis@cloudbasesolutions.com> | 2015-04-07 16:35:54 +0000 |
---|---|---|
committer | Gurucharan Shetty <gshetty@nicira.com> | 2015-04-07 15:24:38 -0700 |
commit | 6c4e7adb0807155b603eef30a7929c42667bfa38 (patch) | |
tree | bc21b8f41540477578c5274f695723f2d391caca /datapath-windows/ovsext/Datapath.c | |
parent | f293a803d9ece7157ec5d098deb1bf29e5de5915 (diff) | |
download | openvswitch-6c4e7adb0807155b603eef30a7929c42667bfa38.tar.gz |
datapath-windows: Solved BSOD when uninstalling the driver (race condition)
The BSOD occurred because the FilterAttach routine released the switch
context, while there were IRPs in processing.
The solution was to add a reference count to prevent premature deallocation of the
global switch context structure, gOvsSwitchContext.
Signed-off-by: Sorin Vinturis <svinturis@cloudbasesolutions.com>
Reported-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Reported-at: https://github.com/openvswitch/ovs-issues/issues/58
Acked-by: Eitan Eliahu <eliahue@vmware.com>
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Diffstat (limited to 'datapath-windows/ovsext/Datapath.c')
-rw-r--r-- | datapath-windows/ovsext/Datapath.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c index e566ea9d0..fea7d3a7a 100644 --- a/datapath-windows/ovsext/Datapath.c +++ b/datapath-windows/ovsext/Datapath.c @@ -717,8 +717,13 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject, /* Check if the extension is enabled. */ if (NULL == gOvsSwitchContext) { - status = STATUS_DEVICE_NOT_READY; - goto done; + status = STATUS_NOT_FOUND; + goto exit; + } + + if (!OvsAcquireSwitchContext()) { + status = STATUS_NOT_FOUND; + goto exit; } /* Concurrent netlink operations are not supported. */ @@ -908,6 +913,9 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject, status = InvokeNetlinkCmdHandler(&usrParamsCtx, nlFamilyOps, &replyLen); done: + OvsReleaseSwitchContext(gOvsSwitchContext); + +exit: KeMemoryBarrier(); instance->inUse = 0; |