__recv_cb_internal revisited
Code clean-up and rearrange
Update shortage counter when reposting recv descriptors again
Signed-off by: Alexander Naslednikov (xalex at mellanox.co.il)

Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
===================================================================
--- ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp    (revision 3033)
+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp    (working copy)
@@ -2143,12 +2143,6 @@
                cl_perf_start( RepostRecv );
                shortage = __recv_mgr_repost( p_port );
                
-               if( shortage > 0 )
-               {                               
-                       recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;
-                       cl_dbg_out("Got SHORTAGE=%d\n",shortage);
-               }
-               
                cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );
 
                cl_perf_start( BuildNBLArray );
@@ -2161,12 +2155,13 @@
                {
                        /* We may have thrown away packets, and have a shortage 
*/
                        cl_perf_start( RepostRecv );
-                       __recv_mgr_repost( p_port );
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_ALL,
+                                       ("Out of recv descriptors, reposting 
again\n") )
+                       shortage = __recv_mgr_repost( p_port );
                        cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );
                }
 
                if( !NBL_cnt ) {
-                       //cl_dbg_out("NBL cnt == 0 :-(\n");
                        break;
                }
 
@@ -2174,7 +2169,8 @@
 
                cl_perf_start( RecvNdisIndicate );
                
-               if (shortage <= 0) {
+               if (shortage <= 0) 
+               {
 
                        res = shutter_add( &p_port->p_adapter->recv_shutter, 
NBL_cnt );
                        if (res)
@@ -2191,14 +2187,16 @@
                                __free_received_NBL( p_port, 
p_port->recv_mgr.recv_NBL_array[0] );
                                cl_spinlock_release( &p_port->recv_lock );
                        }
-                               
-               } else {
-                       /* If shortage >0, we already set the status to
-                          NDIS_RECEIVE_FLAGS_RESOURCES.  That is, IPoIB driver 
regain
+                       cl_perf_stop( &p_port->p_adapter->perf, 
RecvNdisIndicate );
+               } 
+               else 
+               {
+                       /* If shortage >0,  IPoIB driver should regain
                           ownership of the NET_BUFFER_LIST structures 
immediately.
                         */
                        res = shutter_add( &p_port->p_adapter->recv_shutter, 1 
);
                        if (res) {
+                               recv_complete_flags |= 
NDIS_RECEIVE_FLAGS_RESOURCES;
                                NdisMIndicateReceiveNetBufferLists(
                                                                                
                p_port->p_adapter->h_adapter,
                                                                                
                p_port->recv_mgr.recv_NBL_array[0],
@@ -2207,20 +2205,18 @@
                                                                                
                recv_complete_flags );
                                shutter_sub( &p_port->p_adapter->recv_shutter, 
-1 );
                        }
-               }
+                       cl_perf_stop( &p_port->p_adapter->perf, 
RecvNdisIndicate );
 
-               cl_perf_stop( &p_port->p_adapter->perf, RecvNdisIndicate );
-
-               /*
-                * Cap the number of receives to put back to what we just 
indicated
-                * with NDIS_STATUS_RESOURCES.
-                */
-               if( shortage > 0 )
-               {
-                       cl_dbg_out("GOT SHORTAGE <===============\n");
+                       /*
+                        * Cap the number of receives to put back to what we 
just indicated
+                        * with NDIS_STATUS_RESOURCES.
+                        */
+                       
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_ALL,
+                                       ("Out of recv descriptors, 
SHORTAGE=%d\n",shortage) );
+                       
                        /* Return all but the last packet to the pool. */
                        cl_spinlock_acquire( &p_port->recv_lock );
-                       //while( shortage-- > 1 )
                        while ( NBL_cnt-- > 0)
                        {
                                __buf_mgr_put_recv(
@@ -2232,12 +2228,8 @@
                        __recv_mgr_repost( p_port );
                        cl_spinlock_release( &p_port->recv_lock );
 
-                       /*
-                        * Return the last packet as if NDIS returned it, so 
that we repost
-                        * and report any other pending receives.
-                        */
-                       //ipoib_return_net_buffer_list( p_port, 
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );
                }
+
                cl_spinlock_acquire( &p_port->recv_lock );
 
        } while( NBL_cnt );

Attachment: recv_cb_revisited_ofw.patch
Description: recv_cb_revisited_ofw.patch

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to