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

Reply via email to