Hi Sorin, Is it possible to assert on the IRQL before we assume DISPATCH_LEVEL:
+ NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, + NDIS_RWL_AT_DISPATCH_LEVEL); Mt concern that we might remove the first lock or we might change order and we will come with the wrong IRQL. Thanks, Eitan -----Original Message----- From: dev [mailto:[email protected]] On Behalf Of Sorin Vinturis Sent: Thursday, October 02, 2014 1:53 AM To: [email protected] Subject: [ovs-dev] [PATCH v2] datapath-windows: Incorrect assumption of the IRQL Acquiring a spin lock raises the IRQL to DISPATCH_LEVEL. But in many places of the code, while holding a spin lock, there are useless checks for the current IRQL against DISPATCH_LEVEL. Also, the dispatch flag is not correctly set when calling NdisAcquireRWLockXXX() functions, which causes an extra check of the current IRQL. Signed-off-by: Sorin Vinturis <[email protected]> Reported-by: Sorin Vinturis <[email protected]> Reported-at: https://urldefense.proofpoint.com/v1/url?u=https://github.com/openvswitch/ovs-issues/issues/47&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=yTvML8OxA42Jb6ViHe7fUXbvPVOYDPVq87w43doxtlY%3D%0A&m=0WWU%2Fzo6SqL595SrG7V3y0gytSAVoWAaZGTf36TpGog%3D%0A&s=91a7b2ccaf5971e25049fd5b24450729d6ae1671146826b52d4a0cc03e331b52 --- datapath-windows/ovsext/Datapath.c | 3 ++- datapath-windows/ovsext/Flow.c | 9 +++++---- datapath-windows/ovsext/PacketIO.c | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c index 44cdfc9..96f2180 100644 --- a/datapath-windows/ovsext/Datapath.c +++ b/datapath-windows/ovsext/Datapath.c @@ -1398,7 +1398,8 @@ OvsGetVportDumpNext(POVS_USER_PARAMS_CONTEXT usrParamsCtx, * ATM we assume we have one pid only. */ - NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0); + NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, + NDIS_RWL_AT_DISPATCH_LEVEL); if (gOvsSwitchContext->numVports > 0) { /* inBucket: the bucket, used for lookup */ diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c index 5cab6e1..0fad079 100644 --- a/datapath-windows/ovsext/Flow.c +++ b/datapath-windows/ovsext/Flow.c @@ -1150,7 +1150,8 @@ OvsDoDumpFlows(OvsFlowDumpInput *dumpInput, datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - OvsAcquireDatapathRead(datapath, &dpLockState, FALSE); + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + OvsAcquireDatapathRead(datapath, &dpLockState, TRUE); head = &datapath->flowTable[rowIndex]; node = head->Flink; @@ -1297,7 +1298,7 @@ OvsPutFlowIoctl(PVOID inputBuffer, datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE); + OvsAcquireDatapathWrite(datapath, &dpLockState, TRUE); status = HandleFlowPut(put, datapath, stats); OvsReleaseDatapath(datapath, &dpLockState); @@ -1489,7 +1490,7 @@ OvsGetFlowIoctl(PVOID inputBuffer, datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - OvsAcquireDatapathRead(datapath, &dpLockState, FALSE); + OvsAcquireDatapathRead(datapath, &dpLockState, TRUE); flow = OvsLookupFlow(datapath, &getInput->key, &hash, FALSE); if (!flow) { status = STATUS_INVALID_PARAMETER; @@ -1524,7 +1525,7 @@ OvsFlushFlowIoctl(UINT32 dpNo) datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE); + OvsAcquireDatapathWrite(datapath, &dpLockState, TRUE); DeleteAllFlows(datapath); OvsReleaseDatapath(datapath, &dpLockState); diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c index ac7862d..87d7037 100644 --- a/datapath-windows/ovsext/PacketIO.c +++ b/datapath-windows/ovsext/PacketIO.c @@ -268,7 +268,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext, } ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - OvsAcquireDatapathRead(datapath, &dpLockState, dispatch); + OvsAcquireDatapathRead(datapath, &dpLockState, TRUE); flow = OvsLookupFlow(datapath, &key, &hash, FALSE); if (flow) { -- 1.9.0.msysgit.0 _______________________________________________ dev mailing list [email protected] https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailman/listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=yTvML8OxA42Jb6ViHe7fUXbvPVOYDPVq87w43doxtlY%3D%0A&m=0WWU%2Fzo6SqL595SrG7V3y0gytSAVoWAaZGTf36TpGog%3D%0A&s=f9dd8af50a47fb88ce79c74fb070923f505fdde565a52320d1db7a4c5217fc12 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
