Re: infinite spin in RT when booting with DHCP on

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Uwe,

On 02/03/2012 11:35 AM, Uwe Kleine-König wrote:
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 <Frank.Li@xxxxxxxxxxxxx>
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 <b32542@xxxxxxxxxxxxx>
    Signed-off-by: Frank Li <Frank.Li@xxxxxxxxxxxxx>

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@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux