[ofw] [IPOIB_NDIS6_CM] missing IRQL restore
Smith, Stan
stan.smith at intel.com
Tue Aug 3 13:48:43 PDT 2010
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