[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;
                     }