Can you provide an appropriate summary line for the subject? The current one is not appropriate.
On Mon, Oct 06, 2014 at 03:05:29PM +0000, Sorin Vinturis wrote: > 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://github.com/openvswitch/ovs-issues/issues/47 > Acked-by: Nithin Raju <[email protected]> > Acked-by: Alin Gabriel Serdean <[email protected]> > Acked-by: Eitan Eliahu <[email protected]> > --- > datapath-windows/ovsext/Datapath.c | 5 +++-- > datapath-windows/ovsext/Flow.c | 12 ++++++++---- > datapath-windows/ovsext/PacketIO.c | 2 +- > 3 files changed, 12 insertions(+), 7 deletions(-) > > diff --git a/datapath-windows/ovsext/Datapath.c > b/datapath-windows/ovsext/Datapath.c > index 44cdfc9..8ab689a 100644 > --- a/datapath-windows/ovsext/Datapath.c > +++ b/datapath-windows/ovsext/Datapath.c > @@ -1397,8 +1397,9 @@ OvsGetVportDumpNext(POVS_USER_PARAMS_CONTEXT > usrParamsCtx, > * it means we have an array of pids, instead of a single pid. > * ATM we assume we have one pid only. > */ > - > - NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0); > + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); > + 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..0648155 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,8 @@ OvsPutFlowIoctl(PVOID inputBuffer, > > datapath = &gOvsSwitchContext->datapath; > ASSERT(datapath); > - OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE); > + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); > + OvsAcquireDatapathWrite(datapath, &dpLockState, TRUE); > status = HandleFlowPut(put, datapath, stats); > OvsReleaseDatapath(datapath, &dpLockState); > > @@ -1489,7 +1491,8 @@ OvsGetFlowIoctl(PVOID inputBuffer, > > datapath = &gOvsSwitchContext->datapath; > ASSERT(datapath); > - OvsAcquireDatapathRead(datapath, &dpLockState, FALSE); > + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); > + OvsAcquireDatapathRead(datapath, &dpLockState, TRUE); > flow = OvsLookupFlow(datapath, &getInput->key, &hash, FALSE); > if (!flow) { > status = STATUS_INVALID_PARAMETER; > @@ -1524,7 +1527,8 @@ OvsFlushFlowIoctl(UINT32 dpNo) > > datapath = &gOvsSwitchContext->datapath; > ASSERT(datapath); > - OvsAcquireDatapathWrite(datapath, &dpLockState, FALSE); > + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); > + 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] > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
