[OpenAFS] FC3 + AFS 1.3.7x Problems (was: rought timeline for
1.4.x)
Derrick J Brashear
shadow@dementia.org
Wed, 22 Dec 2004 12:03:19 -0500 (EST)
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;
}