Thread (28 messages) 28 messages, 7 authors, 2012-02-08

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help