<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style><!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="Section1">
<p class="MsoNormal"><span style="color:#1F497D">Now with the attachment<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Alex Naslednikov
<br>
<b>Sent:</b> Wednesday, February 02, 2011 11:59 AM<br>
<b>To:</b> Alex Naslednikov; ofw@lists.openfabrics.org<br>
<b>Subject:</b> [ofw][patch][IPoIB_NDIS6_CM] Deadlock fix<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Fix a deadlock between the send lock and the port lock <o:p>
</o:p></p>
<p class="MsoNormal">Currently the code that completes the send packets is not called under  lock.<o:p></o:p></p>
<p class="MsoNormal">Signed off by: Tzachi Dar (tzachi at mellanox.co.il)<o:p></o:p></p>
<p class="MsoNormal">Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp             (revision 3088)<o:p></o:p></p>
<p class="MsoNormal">+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp          (working copy)<o:p></o:p></p>
<p class="MsoNormal">@@ -4169,12 +4169,14 @@<o:p></o:p></p>
<p class="MsoNormal">                ipoib_adapter_t                               *p_adapter;<o:p></o:p></p>
<p class="MsoNormal">                KLOCK_QUEUE_HANDLE              hdl;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_state_t                     prev_state;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t              complete_list;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                UNREFERENCED_PARAMETER( pause_parameters );<o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                CL_ASSERT( adapter_context );<o:p></o:p></p>
<p class="MsoNormal">                p_adapter = (ipoib_adapter_t*)adapter_context;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init(&complete_list);<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );<o:p></o:p></p>
<p class="MsoNormal">                prev_state = p_adapter->ipoib_state;<o:p></o:p></p>
<p class="MsoNormal">@@ -4187,8 +4189,9 @@<o:p></o:p></p>
<p class="MsoNormal">                if( p_adapter->p_port )<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                cl_spinlock_acquire( &p_adapter->p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">-                              ipoib_port_resume( p_adapter->p_port,FALSE );<o:p></o:p></p>
<p class="MsoNormal">+                             ipoib_port_resume( p_adapter->p_port,FALSE, &complete_list );<o:p></o:p></p>
<p class="MsoNormal">                                cl_spinlock_release( &p_adapter->p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">+                             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                if ( prev_state == IPOIB_RUNNING ) { //i.e there was no active reset<o:p></o:p></p>
<p class="MsoNormal">                                IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class="MsoNormal">Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp                (revision 3088)<o:p></o:p></p>
<p class="MsoNormal">+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp             (working copy)<o:p></o:p></p>
<p class="MsoNormal">@@ -397,9 +397,7 @@<o:p></o:p></p>
<p class="MsoNormal"> static inline void <o:p></o:p></p>
<p class="MsoNormal"> __send_complete_net_buffer(<o:p></o:p></p>
<p class="MsoNormal">                IN           ipoib_send_NB_SG        *s_buf,
<o:p></o:p></p>
<p class="MsoNormal">-              IN           NDIS_STATUS                    status,<o:p></o:p></p>
<p class="MsoNormal">-              IN           ULONG                                                 compl_flags,<o:p></o:p></p>
<p class="MsoNormal">-              IN           boolean_t                                           bLock    );<o:p></o:p></p>
<p class="MsoNormal">+             IN           ULONG                                                 compl_flags);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> static inline NDIS_STATUS<o:p></o:p></p>
<p class="MsoNormal"> __send_mgr_queue(<o:p></o:p></p>
<p class="MsoNormal">@@ -992,12 +990,14 @@<o:p></o:p></p>
<p class="MsoNormal">                IN                                                           cl_obj_t* const                                                 p_obj )<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                ipoib_port_t      *p_port;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t              complete_list;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                CL_ASSERT( p_obj );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init(&complete_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                ipoib_port_down( p_port );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -1012,8 +1012,9 @@<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>
<p class="MsoNormal">-              ipoib_port_resume( p_port, FALSE );<o:p></o:p></p>
<p class="MsoNormal">+             ipoib_port_resume( p_port, FALSE, &complete_list );<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>
<p class="MsoNormal">+             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                dmp_ipoib_port_refs( p_port, "port_destroying()" );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -3878,6 +3879,8 @@<o:p></o:p></p>
<p class="MsoNormal">                cl_qlist_init( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class="MsoNormal">                cl_qpool_construct(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class="MsoNormal">                cl_qpool_construct( &p_port->send_mgr.send_pool );<o:p></o:p></p>
<p class="MsoNormal">+             cl_spinlock_construct(&p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal">+   <o:p></o:p></p>
<p class="MsoNormal">                p_port->p_desc = NULL;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -3934,6 +3937,8 @@<o:p></o:p></p>
<p class="MsoNormal">                                cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class="MsoNormal">                                return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">+    <o:p></o:p></p>
<p class="MsoNormal">+             cl_spinlock_init(&p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                //This send descriptor can't be allocated on the stack because of boundary<o:p></o:p></p>
<p class="MsoNormal">                // violation !!!<o:p></o:p></p>
<p class="MsoNormal">@@ -3949,20 +3954,58 @@<o:p></o:p></p>
<p class="MsoNormal">                                IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">                                                ("Allocation of port[%d] send descriptor failed\n", p_port->port_num) );<o:p></o:p></p>
<p class="MsoNormal">                                cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>
<p class="MsoNormal">+                             <o:p></o:p></p>
<p class="MsoNormal">+                             cl_spinlock_destroy(&p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal">                                cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class="MsoNormal">                                return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                return IB_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+static void<o:p></o:p></p>
<p class="MsoNormal">+__send_complete_add_to_list(<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           cl_qlist_t                                                                              *p_complete_list,<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           ipoib_send_NB_SG                                                                        *s_buf,<o:p></o:p></p>
<p class="MsoNormal">+             IN           NDIS_STATUS                    status)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+    NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class="MsoNormal">+    cl_qlist_insert_tail(p_complete_list, &s_buf->p_complete_list_item);<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+// Complete the entire list<o:p></o:p></p>
<p class="MsoNormal">+void <o:p></o:p></p>
<p class="MsoNormal">+send_complete_list_complete(<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           cl_qlist_t                                                                              *p_complete_list,<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           ULONG                                                                                 compl_flags)<o:p></o:p></p>
<p class="MsoNormal">+{<o:p></o:p></p>
<p class="MsoNormal">+             cl_list_item_t                    *p_item;<o:p></o:p></p>
<p class="MsoNormal">+             ipoib_send_NB_SG        *s_buf;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             KIRQL oldIrql = DISPATCH_LEVEL;<o:p></o:p></p>
<p class="MsoNormal">+             if ( (compl_flags & NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL) == 0 )<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                NDIS_RAISE_IRQL_TO_DISPATCH(&oldIrql);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             for( p_item = cl_qlist_remove_head( p_complete_list );<o:p></o:p></p>
<p class="MsoNormal">+                             p_item != cl_qlist_end( p_complete_list );<o:p></o:p></p>
<p class="MsoNormal">+                             p_item = cl_qlist_remove_head( p_complete_list ) )<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             s_buf = CONTAINING_RECORD(p_item, ipoib_send_NB_SG, p_complete_list_item);<o:p></o:p></p>
<p class="MsoNormal">+                             __send_complete_net_buffer(s_buf, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+             }<o:p></o:p></p>
<p class="MsoNormal">+             NDIS_LOWER_IRQL(oldIrql, DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+}<o:p></o:p></p>
<p class="MsoNormal"> static void <o:p></o:p></p>
<p class="MsoNormal"> __pending_list_destroy(<o:p></o:p></p>
<p class="MsoNormal">-              IN                                                           ipoib_port_t* const                                        p_port )<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           ipoib_port_t* const                                        p_port,<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           cl_qlist_t                                                                              *p_complete_list)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                cl_list_item_t                    *p_item;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_send_NB_SG        *s_buf;<o:p></o:p></p>
<p class="MsoNormal">-              ULONG                                                 send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                /* Complete any pending packets. */<o:p></o:p></p>
<p class="MsoNormal">                for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class="MsoNormal">@@ -3973,9 +4016,7 @@<o:p></o:p></p>
<p class="MsoNormal">                                ASSERT(s_buf->p_port == p_port);<o:p></o:p></p>
<p class="MsoNormal">                                ASSERT(s_buf->p_nbl);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-                              //TODO<o:p></o:p></p>
<p class="MsoNormal">-                              //__send_complete_net_buffer(s_buf, NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></p>
<p class="MsoNormal">-                              __send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></p>
<p class="MsoNormal">+                             __send_complete_add_to_list(p_complete_list  ,s_buf, NDIS_STATUS_FAILURE);<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -3983,16 +4024,21 @@<o:p></o:p></p>
<p class="MsoNormal"> __send_mgr_destroy(<o:p></o:p></p>
<p class="MsoNormal">                IN                                                           ipoib_port_t* const                                        p_port )<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t              complete_list;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal">                //Destroy pending list and put all the send buffers back to pool<o:p></o:p></p>
<p class="MsoNormal">                //The list should be already destroyed at this point<o:p></o:p></p>
<p class="MsoNormal">                ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init(&complete_list);<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">-              __pending_list_destroy(p_port);<o:p></o:p></p>
<p class="MsoNormal">+             __pending_list_destroy(p_port, &complete_list);<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">+             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                // Now, destroy the send pool<o:p></o:p></p>
<p class="MsoNormal">                cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>
<p class="MsoNormal">+             cl_spinlock_destroy(&p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal">                cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                //Now, free port send descriptor<o:p></o:p></p>
<p class="MsoNormal">@@ -4579,10 +4625,12 @@<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> bool <o:p></o:p></p>
<p class="MsoNormal"> ipoib_process_sg_list_real(<o:p></o:p></p>
<p class="MsoNormal">-    IN  PDEVICE_OBJECT          pDO,<o:p></o:p></p>
<p class="MsoNormal">-    IN  PVOID                   pIrp,<o:p></o:p></p>
<p class="MsoNormal">-    IN  PSCATTER_GATHER_LIST    p_sgl,<o:p></o:p></p>
<p class="MsoNormal">-    IN  PVOID                   context )<o:p></o:p></p>
<p class="MsoNormal">+             IN           PDEVICE_OBJECT                                             pDO,<o:p></o:p></p>
<p class="MsoNormal">+             IN           PVOID                                                                   pIrp,<o:p></o:p></p>
<p class="MsoNormal">+             IN           PSCATTER_GATHER_LIST              p_sgl,<o:p></o:p></p>
<p class="MsoNormal">+             IN           PVOID                                                                   context,<o:p></o:p></p>
<p class="MsoNormal">+             IN           cl_qlist_t                                                              *p_complete_list<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                NDIS_STATUS                                                    status;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_port_t                                      *p_port;<o:p></o:p></p>
<p class="MsoNormal">@@ -4657,7 +4705,8 @@<o:p></o:p></p>
<p class="MsoNormal">                                /* fail  net buffer */<o:p></o:p></p>
<p class="MsoNormal">                                IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">                                                                                ("Failed to get Eth hdr - send inside process SG list\n"));<o:p></o:p></p>
<p class="MsoNormal">-                              __send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></p>
<p class="MsoNormal">+                             __send_complete_add_to_list(p_complete_list  ,s_buf, status);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">                                <o:p></o:p></p>
<p class="MsoNormal">                                cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">                                ret = true;<o:p></o:p></p>
<p class="MsoNormal">@@ -4724,11 +4773,8 @@<o:p></o:p></p>
<p class="MsoNormal">                                                IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">                                                                                ("Bad status: packet has not been sent\n"));<o:p></o:p></p>
<p class="MsoNormal">                                                cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">+                                             __send_complete_add_to_list(p_complete_list  ,s_buf, NDIS_STATUS_SUCCESS);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-                                              __send_complete_net_buffer(                s_buf,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              NDIS_STATUS_SUCCESS,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              complete_flags,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              TRUE );<o:p></o:p></p>
<p class="MsoNormal">                                                ret = true;<o:p></o:p></p>
<p class="MsoNormal">                                                goto send_end;<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">@@ -4819,12 +4865,8 @@<o:p></o:p></p>
<p class="MsoNormal">                                                 * sends to fail.<o:p></o:p></p>
<p class="MsoNormal">                                                 */<o:p></o:p></p>
<p class="MsoNormal">                                                 //TODO - check previous comment !<o:p></o:p></p>
<p class="MsoNormal">-                                              cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">-                                              __send_complete_net_buffer( s_buf,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              NDIS_STATUS_SUCCESS,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              complete_flags,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              TRUE );<o:p></o:p></p>
<p class="MsoNormal">-                                              cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">+                                             __send_complete_add_to_list(p_complete_list  ,s_buf,NDIS_STATUS_SUCCESS );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">                                                ret = true;<o:p></o:p></p>
<p class="MsoNormal">                                                goto send_end;<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">@@ -4841,7 +4883,7 @@<o:p></o:p></p>
<p class="MsoNormal">                if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">-                              __send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>
<p class="MsoNormal">+                             __send_complete_add_to_list(p_complete_list  ,s_buf, NDIS_STATUS_FAILURE);<o:p></o:p></p>
<p class="MsoNormal">                                cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">                                ret = true;<o:p></o:p></p>
<p class="MsoNormal">                                goto send_end;<o:p></o:p></p>
<p class="MsoNormal">@@ -4885,7 +4927,7 @@<o:p></o:p></p>
<p class="MsoNormal">                                                                (p_desc->send_qp == p_port->ib_mgr.h_qp ? "UD":"RC"),<o:p></o:p></p>
<p class="MsoNormal">                                                                p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>
<p class="MsoNormal">                                cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">-                              __send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>
<p class="MsoNormal">+                             __send_complete_add_to_list(p_complete_list  ,s_buf, NDIS_STATUS_FAILURE);<o:p></o:p></p>
<p class="MsoNormal">                                cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class="MsoNormal">                                if( p_desc->send_qp == p_port->ib_mgr.h_qp )<o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">@@ -4929,6 +4971,8 @@<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                ipoib_send_NB_SG *  s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_port_t*                    p_port = s_buf->p_port;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t              complete_list;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init(&complete_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -4942,7 +4986,7 @@<o:p></o:p></p>
<p class="MsoNormal"> #endif<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              ipoib_process_sg_list_real( pDO, pIrp, p_sgl, context );<o:p></o:p></p>
<p class="MsoNormal">+             ipoib_process_sg_list_real( pDO, pIrp, p_sgl, context, &complete_list );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                if (g_ipoib_send_SG > 1) {<o:p></o:p></p>
<p class="MsoNormal"> #if 0<o:p></o:p></p>
<p class="MsoNormal">@@ -4953,6 +4997,7 @@<o:p></o:p></p>
<p class="MsoNormal"> #endif<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">+             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -6620,15 +6665,17 @@<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                p_next_netbuf = NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+                             cl_spinlock_acquire(&p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal">                                ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG*) (PVOID)<o:p></o:p></p>
<p class="MsoNormal">                                                                                                                                                (cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></p>
<p class="MsoNormal">+                             cl_spinlock_release(&p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal">                                if (s_buf == NULL)<o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">                                                ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">                                                NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class="MsoNormal">                                                NdisMSendNetBufferListsCompleteX( p_port->p_adapter,<o:p></o:p></p>
<p class="MsoNormal">                                                                                                                                                                                  p_net_buffer_list,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                                                send_complete_flags );             
<o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                                                                               send_complete_flags );<o:p></o:p></p>
<p class="MsoNormal">                                                break;<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">                                                <o:p></o:p></p>
<p class="MsoNormal">@@ -6660,6 +6707,8 @@<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                                ++g_ipoib_send_SW_in_loop;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+                             ++g_ipoib_send_SW_in_loop;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">                                status = NdisMAllocateNetBufferSGList(<o:p></o:p></p>
<p class="MsoNormal">                                                                                                                p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>
<p class="MsoNormal">                                                                                                                p_netbuf,<o:p></o:p></p>
<p class="MsoNormal">@@ -6668,7 +6717,6 @@<o:p></o:p></p>
<p class="MsoNormal">                                                                                                                (PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></p>
<p class="MsoNormal">                                                                                                                p_port->p_adapter->sg_list_size);<o:p></o:p></p>
<p class="MsoNormal">                                                <o:p></o:p></p>
<p class="MsoNormal">-                              cl_spinlock_acquire( &p_port->send_lock );      
<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                                if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">@@ -6682,9 +6730,11 @@<o:p></o:p></p>
<p class="MsoNormal">                                                NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></p>
<p class="MsoNormal">                                                NdisMSendNetBufferListsCompleteX( p_port->p_adapter,<o:p></o:p></p>
<p class="MsoNormal">                                                                                                                                                                                  p_net_buffer_list,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                                                send_complete_flags );             
<o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                                                                               send_complete_flags );<o:p></o:p></p>
<p class="MsoNormal">+                                             cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">                                                break;<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">+                             cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                                <o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">@@ -6694,17 +6744,17 @@<o:p></o:p></p>
<p class="MsoNormal">                XIPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> static inline void <o:p></o:p></p>
<p class="MsoNormal"> __send_complete_net_buffer(<o:p></o:p></p>
<p class="MsoNormal">                IN           ipoib_send_NB_SG        *s_buf,
<o:p></o:p></p>
<p class="MsoNormal">-              IN           NDIS_STATUS                    status,<o:p></o:p></p>
<p class="MsoNormal">-              IN           ULONG                                                 compl_flags,<o:p></o:p></p>
<p class="MsoNormal">-              IN           boolean_t                                           bLock )
<o:p></o:p></p>
<p class="MsoNormal">+             IN           ULONG                                                 compl_flags )
<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                PERF_DECLARE( FreeSendBuf );<o:p></o:p></p>
<p class="MsoNormal">                PERF_DECLARE( SendComp );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                CL_ASSERT( s_buf );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_BUF,<o:p></o:p></p>
<p class="MsoNormal">                                ("Processing send completion for NBL %p s_buf %p\n",<o:p></o:p></p>
<p class="MsoNormal">@@ -6729,10 +6779,7 @@<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> #endif<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-              switch (status)<o:p></o:p></p>
<p class="MsoNormal">-              {<o:p></o:p></p>
<p class="MsoNormal">+             switch (NET_BUFFER_LIST_STATUS(s_buf->p_nbl)) {<o:p></o:p></p>
<p class="MsoNormal">                                case NDIS_STATUS_SUCCESS:<o:p></o:p></p>
<p class="MsoNormal">                                                ++g_ipoib_send_ack;<o:p></o:p></p>
<p class="MsoNormal">                                                break;<o:p></o:p></p>
<p class="MsoNormal">@@ -6754,7 +6801,6 @@<o:p></o:p></p>
<p class="MsoNormal">                /* Complete the NBL */<o:p></o:p></p>
<p class="MsoNormal">                if (IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">-                              NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class="MsoNormal">                                PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo =         
<o:p></o:p></p>
<p class="MsoNormal">                                                (PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO)<o:p></o:p></p>
<p class="MsoNormal">                                                                (PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpLargeSendNetBufferListInfo);<o:p></o:p></p>
<p class="MsoNormal">@@ -6777,16 +6823,7 @@<o:p></o:p></p>
<p class="MsoNormal">                        pLsoInfo->LsoV2TransmitComplete.Type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></p>
<p class="MsoNormal">                    }<o:p></o:p></p>
<p class="MsoNormal">                                <o:p></o:p></p>
<p class="MsoNormal">-                              if (bLock)<o:p></o:p></p>
<p class="MsoNormal">-                              {<o:p></o:p></p>
<p class="MsoNormal">-                                              cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">-                                              NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>
<p class="MsoNormal">-                                                              s_buf->p_nbl, compl_flags );<o:p></o:p></p>
<p class="MsoNormal">-                                              cl_spinlock_acquire( &s_buf->p_port->send_lock ); 
<o:p></o:p></p>
<p class="MsoNormal">-                              } else {<o:p></o:p></p>
<p class="MsoNormal">-                                              NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>
<p class="MsoNormal">-                                                              s_buf->p_nbl, compl_flags );<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">+                             NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,         s_buf->p_nbl, compl_flags );<o:p></o:p></p>
<p class="MsoNormal">                } <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                if( s_buf->p_send_buf )<o:p></o:p></p>
<p class="MsoNormal">@@ -6813,7 +6850,9 @@<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> #endif<o:p></o:p></p>
<p class="MsoNormal">                //Put back into the pool list structure allocated for the NB<o:p></o:p></p>
<p class="MsoNormal">+             cl_spinlock_acquire(&s_buf->p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal">                cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t* )s_buf);<o:p></o:p></p>
<p class="MsoNormal">+             cl_spinlock_release(&s_buf->p_port->send_mgr.send_pool_lock);<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendComp );<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal">@@ -6834,7 +6873,8 @@<o:p></o:p></p>
<p class="MsoNormal"> void<o:p></o:p></p>
<p class="MsoNormal"> ipoib_port_resume(<o:p></o:p></p>
<p class="MsoNormal">                IN                                                           ipoib_port_t* const                                        p_port,<o:p></o:p></p>
<p class="MsoNormal">-              IN boolean_t                                                                                                                     b_pending )<o:p></o:p></p>
<p class="MsoNormal">+             IN boolean_t                                                                                                                     b_pending,<o:p></o:p></p>
<p class="MsoNormal">+             IN           cl_qlist_t                                                                                                                              *p_complete_list)<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                cl_list_item_t                    *p_item;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_send_NB_SG        *s_buf = NULL;<o:p></o:p></p>
<p class="MsoNormal">@@ -6875,8 +6915,7 @@<o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">                                                // Port is in error state, flush the list<o:p></o:p></p>
<p class="MsoNormal">                                                ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>
<p class="MsoNormal">-                                              __send_complete_net_buffer( s_buf, NDIS_STATUS_FAILURE,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                              NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, TRUE);<o:p></o:p></p>
<p class="MsoNormal">+                                             __send_complete_add_to_list(p_complete_list  ,s_buf, NDIS_STATUS_FAILURE);<o:p></o:p></p>
<p class="MsoNormal">                                } else {<o:p></o:p></p>
<p class="MsoNormal">                                                /* Check the send queue and pend the request if not empty. */<o:p></o:p></p>
<p class="MsoNormal">                                                if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )<o:p></o:p></p>
<p class="MsoNormal">@@ -6887,11 +6926,11 @@<o:p></o:p></p>
<p class="MsoNormal">                                                                break;<o:p></o:p></p>
<p class="MsoNormal">                                                }<o:p></o:p></p>
<p class="MsoNormal">                                                <o:p></o:p></p>
<p class="MsoNormal">-                                              continue_sending = ipoib_process_sg_list_real(<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                                              NULL,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                                              NULL,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                                              (PSCATTER_GATHER_LIST) s_buf->p_sgl,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                                              s_buf );<o:p></o:p></p>
<p class="MsoNormal">+                                             bool continue_sending = ipoib_process_sg_list_real(     NULL,
<o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                                                                                                                                            
                 NULL, <o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                                                                                                                                            
                 (PSCATTER_GATHER_LIST) s_buf->p_sgl, <o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                                                                                                                                            
                 s_buf, <o:p></o:p></p>
<p class="MsoNormal">+                                                                                                                                                                                                                                            
                 p_complete_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                                                //cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -6931,6 +6970,7 @@<o:p></o:p></p>
<p class="MsoNormal">                ip_stat_sel_t                     type;<o:p></o:p></p>
<p class="MsoNormal">                NET_BUFFER                                      *p_netbuffer = NULL;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_send_NB_SG        *s_buf;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t                                              complete_list;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                PERF_DECLARE( SendCompBundle );<o:p></o:p></p>
<p class="MsoNormal">                PERF_DECLARE( SendCb );<o:p></o:p></p>
<p class="MsoNormal">@@ -6941,6 +6981,7 @@<o:p></o:p></p>
<p class="MsoNormal">  <o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init(&complete_list);<o:p></o:p></p>
<p class="MsoNormal">                ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                cl_perf_clr( SendCompBundle );<o:p></o:p></p>
<p class="MsoNormal">@@ -7031,12 +7072,8 @@<o:p></o:p></p>
<p class="MsoNormal">                                                <o:p></o:p></p>
<p class="MsoNormal">                                                                break;<o:p></o:p></p>
<p class="MsoNormal">                                                }<o:p></o:p></p>
<p class="MsoNormal">+                                             __send_complete_add_to_list(&complete_list  ,s_buf, status);<o:p></o:p></p>
<p class="MsoNormal">                                                <o:p></o:p></p>
<p class="MsoNormal">-                                              __send_complete_net_buffer( s_buf,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              status,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                                                              TRUE );<o:p></o:p></p>
<p class="MsoNormal">-                                              <o:p></o:p></p>
<p class="MsoNormal">                                                cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                                                p_wc = p_wc->p_next;<o:p></o:p></p>
<p class="MsoNormal">@@ -7048,7 +7085,7 @@<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                /* Resume any sends awaiting resources. */<o:p></o:p></p>
<p class="MsoNormal">                cl_perf_start( PortResume );<o:p></o:p></p>
<p class="MsoNormal">-              ipoib_port_resume( p_port, TRUE );<o:p></o:p></p>
<p class="MsoNormal">+             ipoib_port_resume( p_port, TRUE, &complete_list );
<o:p></o:p></p>
<p class="MsoNormal">                cl_perf_stop( &p_port->p_adapter->perf, PortResume );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                /* Rearm the CQ. */<o:p></o:p></p>
<p class="MsoNormal">@@ -7063,6 +7100,7 @@<o:p></o:p></p>
<p class="MsoNormal">                cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle );<o:p></o:p></p>
<p class="MsoNormal">                //cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">+             send_complete_list_complete(&complete_list, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>
<p class="MsoNormal">                IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -8360,8 +8398,11 @@<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                ib_api_status_t                                status;<o:p></o:p></p>
<p class="MsoNormal">                ib_qp_mod_t                                    qp_mod;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t              complete_list;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class="MsoNormal">+             <o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init(&complete_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                /*<o:p></o:p></p>
<p class="MsoNormal">                 * Mark our state.  This causes all callbacks to abort.<o:p></o:p></p>
<p class="MsoNormal">@@ -8382,7 +8423,7 @@<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              __pending_list_destroy(p_port);<o:p></o:p></p>
<p class="MsoNormal">+             __pending_list_destroy(p_port, &complete_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -8395,6 +8436,7 @@<o:p></o:p></p>
<p class="MsoNormal">                cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class="MsoNormal">+             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                KeWaitForSingleObject( &p_port->sa_event,<o:p></o:p></p>
<p class="MsoNormal">                                                                                                   Executive,<o:p></o:p></p>
<p class="MsoNormal">@@ -8887,10 +8929,12 @@<o:p></o:p></p>
<p class="MsoNormal">                ipoib_port_t                      *p_port;<o:p></o:p></p>
<p class="MsoNormal">                cl_fmap_item_t                               *p_item;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_endpt_t                   *p_endpt;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t              complete_list;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init(&complete_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class="MsoNormal">                while( p_port->endpt_rdr )<o:p></o:p></p>
<p class="MsoNormal">@@ -8913,11 +8957,11 @@<o:p></o:p></p>
<p class="MsoNormal">                                                ("Invalid state - Aborting.\n") );<o:p></o:p></p>
<p class="MsoNormal">                                IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class="MsoNormal">                                                ("Invalid state - Aborting.\n") );<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">                                cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>
<p class="MsoNormal">                                //ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>
<p class="MsoNormal">-                              __pending_list_destroy( p_port );<o:p></o:p></p>
<p class="MsoNormal">+                             __pending_list_destroy( p_port, &complete_list );<o:p></o:p></p>
<p class="MsoNormal">                                cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>
<p class="MsoNormal">+                             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal">                                return;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -8988,8 +9032,9 @@<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">                IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class="MsoNormal">                                ("Calling ipoib_port_resume from mcast_cb, xmit pending sends\n"));<o:p></o:p></p>
<p class="MsoNormal">-              ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>
<p class="MsoNormal">+             ipoib_port_resume(p_port , FALSE, &complete_list);<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal">+             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                ipoib_port_deref( p_port, ref_join_mcast );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -9300,10 +9345,10 @@<o:p></o:p></p>
<p class="MsoNormal">                cl_list_item_t                    *p_item, *p_next;<o:p></o:p></p>
<p class="MsoNormal">                ipoib_send_NB_SG        *s_buf;<o:p></o:p></p>
<p class="MsoNormal">                PVOID                                   nbl_id;<o:p></o:p></p>
<p class="MsoNormal">-              cl_qlist_t                              cancel_list;<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_t                              complete_list;<o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              cl_qlist_init( &cancel_list );<o:p></o:p></p>
<p class="MsoNormal">+             cl_qlist_init( &complete_list );<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                ASSERT(FALSE); //TODO ???????????????? Do we reach here ????????????<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -9321,27 +9366,12 @@<o:p></o:p></p>
<p class="MsoNormal">                                if( nbl_id == cancel_id )<o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">                                                cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item );<o:p></o:p></p>
<p class="MsoNormal">-                                              NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED ;<o:p></o:p></p>
<p class="MsoNormal">-                                              cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf );<o:p></o:p></p>
<p class="MsoNormal">+                                             __send_complete_add_to_list(&complete_list                ,s_buf, NDIS_STATUS_REQUEST_ABORTED);<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              if( cl_qlist_count( &cancel_list ) )<o:p></o:p></p>
<p class="MsoNormal">-              {<o:p></o:p></p>
<p class="MsoNormal">-                              while( ( p_item = cl_qlist_remove_head( &cancel_list ))
<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                              != cl_qlist_end( &cancel_list ))<o:p></o:p></p>
<p class="MsoNormal">-                              {<o:p></o:p></p>
<p class="MsoNormal">-                                              s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></p>
<p class="MsoNormal">-                                              IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                                              <o:p></o:p></p>
<p class="MsoNormal">-                                              //TODO don't use DISPATCH LEVEL<o:p></o:p></p>
<p class="MsoNormal">-                                              __send_complete_net_buffer( s_buf, NDIS_STATUS_SEND_ABORTED,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                                                              NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, TRUE);<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-                                              <o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">+             send_complete_list_complete(&complete_list, IRQL_TO_COMPLETE_FLAG());<o:p></o:p></p>
<p class="MsoNormal">                IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h     (revision 3080)<o:p></o:p></p>
<p class="MsoNormal">+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h  (working copy)<o:p></o:p></p>
<p class="MsoNormal">@@ -620,6 +620,7 @@<o:p></o:p></p>
<p class="MsoNormal">                atomic32_t                                         depth;<o:p></o:p></p>
<p class="MsoNormal">                cl_qlist_t                                              pending_list;<o:p></o:p></p>
<p class="MsoNormal">                cl_qpool_t                                          send_pool;<o:p></o:p></p>
<p class="MsoNormal">+             cl_spinlock_t                      send_pool_lock;<o:p></o:p></p>
<p class="MsoNormal">                cl_qpool_t                                          sg_pool;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> }             ipoib_send_mgr_t;<o:p></o:p></p>
<p class="MsoNormal">@@ -842,6 +843,7 @@<o:p></o:p></p>
<p class="MsoNormal">                PSCATTER_GATHER_LIST              p_sgl;<o:p></o:p></p>
<p class="MsoNormal">                UINT                                                                      tcp_payload;<o:p></o:p></p>
<p class="MsoNormal">                PVOID                                                                   p_sg_buf;<o:p></o:p></p>
<p class="MsoNormal">+             cl_list_item_t                                    p_complete_list_item;<o:p></o:p></p>
<p class="MsoNormal"> } ipoib_send_NB_SG;<o:p></o:p></p>
<p class="MsoNormal"> /*<o:p></o:p></p>
<p class="MsoNormal"> * FIELDS<o:p></o:p></p>
<p class="MsoNormal">@@ -925,7 +927,8 @@<o:p></o:p></p>
<p class="MsoNormal"> void<o:p></o:p></p>
<p class="MsoNormal"> ipoib_port_resume(<o:p></o:p></p>
<p class="MsoNormal">                IN                                                           ipoib_port_t* const                                        p_port,<o:p></o:p></p>
<p class="MsoNormal">-              IN boolean_t                                                                                                                     b_pending );<o:p></o:p></p>
<p class="MsoNormal">+             IN boolean_t                                                                                                                     b_pending,<o:p></o:p></p>
<p class="MsoNormal">+             IN           cl_qlist_t                                                                                                                              *p_complete_list);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> NTSTATUS<o:p></o:p></p>
<p class="MsoNormal"> ipoib_mac_to_gid(<o:p></o:p></p>
<p class="MsoNormal">@@ -1088,7 +1091,16 @@<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+VOID<o:p></o:p></p>
<p class="MsoNormal">+send_complete_list_complete(<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           cl_qlist_t                                                                              *p_complete_list,<o:p></o:p></p>
<p class="MsoNormal">+             IN                                                           ULONG                                                                                 compl_flags);<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+#define IRQL_TO_COMPLETE_FLAG() KeGetCurrentIrql() == DISPATCH_LEVEL ? NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL : 0<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> // This function is only used to monitor send failures<o:p></o:p></p>
<p class="MsoNormal"> extern ULONG g_NBL_complete;<o:p></o:p></p>
<p class="MsoNormal"> extern ULONG g_NBL;<o:p></o:p></p>
<p class="MsoNormal"><b>Alexander (XaleX) Naslednikov<o:p></o:p></b></p>
<p class="MsoNormal"><b>SW Networking Team<o:p></o:p></b></p>
<p class="MsoNormal"><b>Mellanox Technologies<o:p></o:p></b></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>