netdev
[Top] [All Lists]

Re: bug: excess context switches on read() of tcp sockets

To: Andi Kleen <ak@xxxxxx>
Subject: Re: bug: excess context switches on read() of tcp sockets
From: Ben LaHaise <bcrl@xxxxxxxxxx>
Date: Tue, 28 Aug 2001 15:33:12 -0400 (EDT)
Cc: <netdev@xxxxxxxxxxx>
In-reply-to: <20010828210719.08488@colin.muc.de>
Sender: owner-netdev@xxxxxxxxxxx
On Tue, 28 Aug 2001, Andi Kleen wrote:

> The likely suspect is ksoftirqd. Add counters to the ksoftirqd loop.

That was my original thinking, but I applied the patch below.  It doesn't
seem to be triggering the "oh, bother" message at all, so our friendly
scapegoat is not to be.  What's the next dead chicken I should offer up?

                -ben

--- /md0/kernels/2.4/v2.4.9-ac2/kernel/softirq.c        Mon Aug 13 15:12:09 2001
+++ kernel/softirq.c    Tue Aug 28 15:24:48 2001
@@ -63,7 +63,7 @@
        int cpu = smp_processor_id();
        __u32 pending;
        long flags;
-       __u32 mask;
+       int i = 0;

        if (in_interrupt())
                return;
@@ -75,7 +75,6 @@
        if (pending) {
                struct softirq_action *h;

-               mask = ~pending;
                local_bh_disable();
 restart:
                /* Reset the pending bitmask before enabling irqs */
@@ -95,14 +94,15 @@
                local_irq_disable();

                pending = softirq_pending(cpu);
-               if (pending & mask) {
-                       mask &= ~pending;
+               if (pending && (i++ < 16))
                        goto restart;
-               }
+
                __local_bh_enable();

-               if (pending)
+               if (pending) {
+                       printk("oh bother\n");
                        wakeup_softirqd(cpu);
+               }
        }

        local_irq_restore(flags);


<Prev in Thread] Current Thread [Next in Thread>