[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