[ofw] [IPOIB_NDIS6_CM] missing IRQL restore

Tzachi Dar tzachid at mellanox.co.il
Wed Aug 4 00:27:59 PDT 2010


I agree, this is indeed a bug, please check it in.

Thanks
Tzachi

> -----Original Message-----
> From: Smith, Stan [mailto:stan.smith at intel.com]
> Sent: Tuesday, August 03, 2010 11:49 PM
> To: Tzachi Dar
> Cc: ofw at lists.openfabrics.org
> Subject: [IPOIB_NDIS6_CM] missing IRQL restore
> 
> 
> Hello,
>   In ipoib_port.cpp, function ipoib_port_send() the following code is
> executed:
> 
>         if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))
>         {
>                 //TODO Tzachid: make an assert here to validate your
> IRQL
>                 ASSERT (KeGetCurrentIrql() == DISPATCH_LEVEL);
>                 old_irql = DISPATCH_LEVEL;
>         } else {
>                 NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);
>                 //ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL); //
> Happens
>         }
> 
> Further on under an error condition
> 
>         cl_obj_lock( &p_port->obj );
>         if( p_port->state != IB_QPS_RTS )
>         {
>                 cl_obj_unlock( &p_port->obj );
> 
>                 IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,
>                         ("Invalid QP state: not RTS, exiting from
> port_send\n"));
>                 NET_BUFFER_LIST_STATUS(p_net_buffer_list) =
> NDIS_STATUS_FAILURE;
>                 ipoib_inc_send_stat( p_port->p_adapter,
> IP_STAT_DROPPED, 0 );
> 
>                 NdisMSendNetBufferListsCompleteX( p_port->p_adapter,
> 
> p_net_buffer_list,
> 
> send_complete_flags );
>                 return;
>         }
>         cl_obj_unlock( &p_port->obj );
> 
> Looks like the IRQL can be messed up on exit.
> Following patch fixes the problem.
> Do you agree?
> 
> thanks,
> 
> stan.
> 
> --- A/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp  Tue Aug 03 13:02:05
> 2010
> +++ B/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp  Tue Aug 03 13:40:09
> 2010
> @@ -5440,6 +5440,10 @@
>                 NdisMSendNetBufferListsCompleteX( p_port->p_adapter,
> 
> p_net_buffer_list,
> 
> send_complete_flags );
> +
> +               NDIS_LOWER_IRQL(old_irql, DISPATCH_LEVEL);
> +
> +               IPOIB_EXIT( IPOIB_DBG_SEND );
>                 return;
>         }
>         cl_obj_unlock( &p_port->obj );



More information about the ofw mailing list