[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20080720.221106.201055562.davem@davemloft.net>
Date: Sun, 20 Jul 2008 22:11:06 -0700 (PDT)
From: David Miller <davem@...emloft.net>
To: adobriyan@...il.com
Cc: torvalds@...ux-foundation.org, akpm@...ux-foundation.org,
netdev@...r.kernel.org, linux-kernel@...r.kernel.org,
jeffrey.t.kirsher@...el.com
Subject: Re: [GIT]: Networking
From: David Miller <davem@...emloft.net>
Date: Sun, 20 Jul 2008 19:48:56 -0700 (PDT)
> From: Alexey Dobriyan <adobriyan@...il.com>
> Date: Mon, 21 Jul 2008 06:40:56 +0400
>
> > OK, the problem is really this buglet:
> >
> > BUG_ON(q == &noop_qdisc);
> > __netif_schedule
> > netif_tx_wake_queue
> > netif_wake_queue
> > atl1_check_link
> > atl1_up or atlx_link_chg_task
> > run_workqueue
>
> Thanks for the backtrace I'll work on fixing this.
[ Jeff and co., this is basically the kind of patch I want
to see eventually for the Intel drivers too... ]
Alexey, please try this patch:
atl1: Do not wake queue before queue has been started.
Based upon a bug report by Alexey Dobriyan.
Packet flow during link state events should not be done by
waking and stopping the TX queue anyways, that is handled
transparently by netif_carrier_{on,off}().
So, remove the netif_{wake,stop}_queue() calls in the link
check code, and add the necessary netif_start_queue() call
to atl1_up().
Signed-off-by: David S. Miller <davem@...emloft.net>
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 3e22e78..f12e3d1 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1308,7 +1308,6 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
dev_info(&adapter->pdev->dev, "link is down\n");
adapter->link_speed = SPEED_0;
netif_carrier_off(netdev);
- netif_stop_queue(netdev);
}
return 0;
}
@@ -1358,7 +1357,6 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
if (!netif_carrier_ok(netdev)) {
/* Link down -> Up */
netif_carrier_on(netdev);
- netif_wake_queue(netdev);
}
return 0;
}
@@ -2627,6 +2625,7 @@ static s32 atl1_up(struct atl1_adapter *adapter)
mod_timer(&adapter->watchdog_timer, jiffies);
atlx_irq_enable(adapter);
atl1_check_link(adapter);
+ netif_start_queue(netdev);
return 0;
err_up:
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists