__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 );
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
