<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;
font-family:"Calibri","sans-serif";
color:#1F497D;}
span.EmailStyle22
{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">Applied at 3089<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 12:33 PM<br>
<b>To:</b> ofw@lists.openfabrics.org<br>
<b>Subject:</b> RE: [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"><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>