Acquiring a spin lock raises the IRQL level 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 <svintu...@cloudbasesolutions.com> Reported-by: Sorin Vinturis <svintu...@cloudbasesolutions.com> Reported-at: https://github.com/openvswitch/ovs-issues/issues/47 --- datapath-windows/ovsext/Datapath.c | 7 ++++++- datapath-windows/ovsext/Flow.c | 8 ++++---- datapath-windows/ovsext/PacketIO.c | 1 - datapath-windows/ovsext/User.c | 1 - 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c index 44cdfc9..b63ff96 100644 --- a/datapath-windows/ovsext/Datapath.c +++ b/datapath-windows/ovsext/Datapath.c @@ -42,6 +42,10 @@ #define NETLINK_FAMILY_NAME_LEN 48 +#ifndef IFNAMSIZ +#define IFNAMSIZ 16 +#endif + /* * Netlink messages are grouped by family (aka type), and each family supports @@ -1398,7 +1402,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..1c0111f 100644 --- a/datapath-windows/ovsext/Flow.c +++ b/datapath-windows/ovsext/Flow.c @@ -1150,7 +1150,7 @@ OvsDoDumpFlows(OvsFlowDumpInput *dumpInput, datapath = &gOvsSwitchContext->datapath; ASSERT(datapath); - OvsAcquireDatapathRead(datapath, &dpLockState, FALSE); + OvsAcquireDatapathRead(datapath, &dpLockState, TRUE); head = &datapath->flowTable[rowIndex]; node = head->Flink; @@ -1297,7 +1297,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 +1489,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 +1524,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..a0e096a 100644 --- a/datapath-windows/ovsext/PacketIO.c +++ b/datapath-windows/ovsext/PacketIO.c @@ -267,7 +267,6 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext, goto dropit; } - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); OvsAcquireDatapathRead(datapath, &dpLockState, dispatch); flow = OvsLookupFlow(datapath, &key, &hash, FALSE); diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c index 26cd431..d6ad650 100644 --- a/datapath-windows/ovsext/User.c +++ b/datapath-windows/ovsext/User.c @@ -365,7 +365,6 @@ OvsExecuteDpIoctl(PVOID inputBuffer, ndisStatus = OvsExtractFlow(pNbl, fwdDetail->SourcePortId, &key, &layers, NULL); if (ndisStatus == NDIS_STATUS_SUCCESS) { - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, NDIS_RWL_AT_DISPATCH_LEVEL); ndisStatus = OvsActionsExecute(gOvsSwitchContext, NULL, pNbl, -- 1.9.0.msysgit.0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev