Hello Stan,
You are right - we have the following code for the regular flow (prior calling
to ipoib_port_send()):
// Important issue, break the connection between the different
nbls
NET_BUFFER_LIST_NEXT_NBL(curr_net_buffer_list) = NULL;
Of course, when we get into bad flow, the assertion mentioned by Fab is no
longer valid.
Thus, to avoid big changes, we can simply modify the code of
NdisMSendNetBufferListsCompleteX in a following manner:
#if DBG
if (NET_BUFFER_LIST_STATUS(NetBufferLists) != NDIS_STATUS_SUCCESS) {
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ALL,
("NBL completed with error %d to NDIS\n",
NET_BUFFER_LIST_STATUS(NetBufferLists)));
} else {
ASSERT(NET_BUFFER_LIST_NEXT_NBL(NetBufferLists) == NULL);
}
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,
("Completing NBL=%x, g_NBL=%d, g_NBL_completed=%d \n",
NetBufferLists, g_NBL, g_NBL_complete) );
#endif
In addition, we should take into account that g_NBL was increased by an actual
numbers of NBLs inside the list. Thus, g_NBL_completed should be increased
accordingly (and not only once)
The other possibility was proposed by Stan. In this case the change will be
even smaller, but we will call to NDIS several times instead of one call only.
I am ok with both of them
From: [email protected]
[mailto:[email protected]] On Behalf Of Smith, Stan
Sent: Tuesday, March 01, 2011 3:42 AM
To: Fab Tillier; [email protected]
Subject: Re: [ofw] [IPoIB] NdisMSendNetBufferListCompleteX assert
>-----Original Message-----
>From: [email protected]
>[mailto:[email protected]] On Behalf Of Fab
>Tillier
>Sent: Monday, February 28, 2011 4:46 PM
>To: [email protected]
>Subject: [ofw] [IPoIB] NdisMSendNetBufferListCompleteX assert
>
>The assertion at line 1122 in ipoib_port.h seems wrong since the following
>code dereferences the NBL.
>Is it wrong, or there to cause an assert because of a send error?
>
>If the latter, a comment would help make the intent clear, as the code looks
>wrong as is.
>
>-Fab
NdisMSendNetBufferListsCompleteX() is completing a 'single' NBL
(NetworkBufferList); not a list of NBLs.
The code is correctly used in ipoib_port.cpp @ ipoib_port_send().
Although it's usage in ipoib_driver.cpp @ ipoib_send_net_buffer_list() after
label 'compl_status:' is incorrect.
Appears the comment is wrong w.r.t. NdisMSendNetBufferListsCompleteX() and the
for() loop should be extended down to encompass the
NdisMSendNetBufferListsCompleteX() call with a single NBL.
The dispatch check should be done once prior to entering the for()loop.
Tzachi, Alex - do you agree?
Stan.
>_______________________________________________
>ofw mailing list
>[email protected]
>http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw