Re: infinite spin in RT when booting with DHCP on
From: Hector Palacios <hidden>
Date: 2012-02-03 16:14:43
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Hi Uwe, On 02/03/2012 11:35 AM, Uwe Kleine-König wrote:
quoted
On my ARM iMX51 platform the problem occurs on every boot. Basically I'm launching udhcpc on the /etc/network/if-up.d/ifup script, to get a dynamic IP for the FEC.Maybe your environment is special then (pick one or more from: board, cable, phy, hub/switch, sun erruption, ice cream on your board or your favourite hardware designer :-).
No ice cream this time, promised!
As the problem occurs for you on every boot you seem to be the one who can debug that easily. Can you check if mainline is affected, too, after boosting ksoftirqd? I.e. either use chrt -f -p 99 $(pidof ksoftirqd) or add
> diff --git a/kernel/softirq.c b/kernel/softirq.c
> index 4eb3a0f..d08c046 100644
> --- a/kernel/softirq.c
> +++ b/kernel/softirq.c
> @@ -861,6 +861,10 @@ static int __cpuinit cpu_callback(struct notifier_block *nfb,
> printk("ksoftirqd for %i failed\n", hotcpu);
> return notifier_from_errno(PTR_ERR(p));
> }
> + sched_setscheduler_nocheck(p, SCHED_FIFO,&(struct sched_param){
> + .sched_priority = MAX_RT_PRIO-1,
> + });
> +
> kthread_bind(p, hotcpu);
> per_cpu(ksoftirqd, hotcpu) = p;
> break;
I added this patch and the problem was reproducible in 2.6.31.14. with Freescale's
2.6.31 BSP, but not on 2.6.35.15 with Freescale's 2.6.35 BSP.
So I revised the differences in the driver and 'git blame' showed me this commit
(Freescale's BSP for 2.6.35), which solves the problem:
commit bac5b435af4656802d3555aaeee983ae8fe5c96a
Author: Frank Li [off-list ref]
Date: Fri Dec 10 18:59:07 2010 +0800
ENGR00136218 FEC: Fix dhcp fail when enable preempt at mx28
DHCP fail when enable NO_HZ and preempt at mx28evk
Signed-off-by: Zeng Zhaoming [off-list ref]
Signed-off-by: Frank Li [off-list ref]
diff --git a/drivers/net/fec.c b/drivers/net/fec.c
index e3ce064..f581960 100644
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c@@ -253,6 +253,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) if (!fep->link) { /* Link is down or autonegotiation is in progress. */ + netif_stop_queue(dev); return NETDEV_TX_BUSY; }
@@ -681,6 +682,7 @@ static void fec_enet_adjust_link(struct net_device *dev) if (phy_dev->link) { if (fep->full_duplex != phy_dev->duplex) { fec_restart(dev, phy_dev->duplex); + netif_wake_queue(dev); status_change = 1; } }
@@ -1418,6 +1420,8 @@ fec_stop(struct net_device *dev) if (fep->ptimer_present) fec_ptp_stop(fep->ptp_priv); writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); + + fep->link = 0; } static int __devinit
This commit was not merged to mainline kernel. So I tried again with 2.6.35.14 with Freescale's BSP and Uwe's patch and reverted commit bac5b435 for verification. The problem was reproducible so the above patch solves it. Do you see any caveat with this commit? If not maybe it should make its way to mainline. Regards -- Héctor Palacios -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html