[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