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

Reply via email to