On Wed, 22 Dec 2004, Jason McCormick wrote:
Here is a kernel oops with libafs compiled with -fomit-frame-pointer. Is this more helpful?
It makes much more sense, but still sadly doesn't make the problem jump out at me.
However.
/* Transmit the packet if it needs to be sent. */
if (!clock_Lt(&now, &p->retryTime)) {
if (nXmitPackets == maxXmitPackets) {
osi_Panic("rxi_Start: xmit list overflowed");
}
xmitList[nXmitPackets++] = p;
}ok, well
/* Send (or resend) any packets that need it, subject to
* window restrictions and congestion burst control
* restrictions. Ask for an ack on the last packet sent in
* this burst. For now, we're relying upon the window being
* considerably bigger than the largest number of packets that
* are typically sent at once by one initial call to
* rxi_Start. This is probably bogus (perhaps we should ask
* for an ack when we're half way through the current
* window?). */so basically, i think the problem is the code is just wrong, it's not a stack overflow, because the call chain makes perfect sense.
This patch is totally untested, and really I'm making it up as I go, but if you're willing to patch rx.c and then make in src/libafs it should onyl recompile one file for each MODLOAD directory and give you another module to try; if you're willing, please do. I suspect there may be a window size issue doing it this way, but, we'll see.
--- rx.c 1 Dec 2004 23:36:48 -0000 1.66 +++ rx.c 22 Dec 2004 17:01:19 -0000 @@ -5032,8 +5032,11 @@ if (!(call->flags & RX_CALL_TQ_BUSY)) { call->flags |= RX_CALL_TQ_BUSY; do { - call->flags &= ~RX_CALL_NEED_START; #endif /* AFS_GLOBAL_RXLOCK_KERNEL */ + restart: +#ifdef AFS_GLOBAL_RXLOCK_KERNEL + call->flags &= ~RX_CALL_NEED_START; +#endif nXmitPackets = 0; maxXmitPackets = MIN(call->twind, call->cwind); xmitList = (struct rx_packet **) @@ -5085,7 +5088,12 @@ /* Transmit the packet if it needs to be sent. */
if (!clock_Lt(&now, &p->retryTime)) {
if (nXmitPackets == maxXmitPackets) {
- osi_Panic("rxi_Start: xmit list overflowed");
+ rxi_SendXmitList(call, xmitList, nXmitPackets,
+ istack, &now, &retryTime,
+ resending);
+ osi_Free(xmitList, maxXmitPackets *
+ sizeof(struct rx_packet *));
+ goto restart;
}
xmitList[nXmitPackets++] = p;
}_______________________________________________ OpenAFS-info mailing list [email protected] https://lists.openafs.org/mailman/listinfo/openafs-info
