Skip to contentSkip to conversation

Searching a Bug on Raspberry Pi

DISCUSSION Georg Gast 2 participants 3 messages Jun 29, 2013 – Jul 4, 2013 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

Georg Gast

author
#0 lore raw

Hi there!

Currently i try to locate a bug in drivers/mmc/host/sdhci.c on RaspberryPi. I know it is not the mainline kernel...

Currently i use Kernel 3.8.13 and RT Patch 3.8.13-rt12 on the kernel found at git://github.com/raspberrypi/linux.git on branch rpi-3.8.y.

The bug shows up at booting and after 3 seconds of booting as it wants to mount the rootfs in a deadlock. as i compiled sdhci_bcm2708 as a module i can boot the kernel and system as i pushed the system to a usb stick. As far as good.

Now i try to find the bug, if the rootfs is on the sdcard. I narrowd the deadlock down to the following lines:

void sdhci_spin_lock_irqsave(struct sdhci_host *host,unsigned long *flags)

{
    return;
#ifdef CONFIG_PREEMPT
    if(enable_llm)
    {
        while(sdhci_locked)
        {
            preempt_schedule();
        }
        spin_lock_irqsave(&host->lock,*flags);
        disable_irq(host->irq);
        if(host->second_irq)
            disable_irq(host->second_irq);
        local_irq_enable();
    }
    else
#endif
        spin_lock_irqsave(&host->lock,*flags);
}

void sdhci_spin_unlock_irqrestore(struct sdhci_host *host,unsigned long flags)

{
    return;
#ifdef CONFIG_PREEMPT
    if(enable_llm)
    {
        local_irq_disable();
        if(host->second_irq)
            enable_irq(host->second_irq);
        enable_irq(host->irq);
    }
#endif
    spin_unlock_irqrestore(&host->lock,flags);
}

in drivers/mmc/host/sdhci.c . The both return statements are added by me. Now i can boot the RT Preempt kernel but it is for sure not the right fix.

My problem is, that i dont know how those both functions should work with the rt preempt patch.

What can you suggest me to fix that deadlock? I already bought the book "Linux Kernel Development" but i dont know how the kernel works exaktly with the PREEMPT patch. Can you point me to a site which shows how RTPREEMPT works in the irqsave/restore functions or can you please describe it to me?

Thank you
Georg

A message that is not in the archive (sent off-list or not yet received): CAFSh4Uz7B8L5Y0nsp1bW4pgPkyqHtXDSM0R-PiRLZQfd+URFYw@mail.gmail.com

author
#2 lore raw

Hi Tom,

the problem occurs even if i set enable_llm=0. The while loop is now not touched and the rpi deadlocks too.

As far as i understand it, the sdhci.c is the base for all sdhci card readers and the sdhci-*.c implement the ops for the specific hardware.

My problem is, that i dont have an other sdhci card reader here. It wont be possible to boot from, but i could try to read from it on a rt kernel. If i compile the sdhci_bcm2708 as a module, i could not get a device info from the rpi reader. Maybe an other reader works, then the real problem sits in sdhci_bcm2708.c (or at bad luck, it shows an bigger problem in sdhci.c).

Georg

Am 29.06.2013 23:36, schrieb Tom Cook:

Quoted 86 lines

This is as far as I've got too. I think you need to make the while loop conditional on CONFIG_PREEMPT_RT_FULL but I haven't had a chance to try it.

Tom

On 29 Jun 2013 21:16, "Georg Gast" <[email protected] <mailto:[email protected]>> wrote:

    Hi there!

    Currently i try to locate a bug in drivers/mmc/host/sdhci.c on
    RaspberryPi. I know it is not the mainline kernel...

    Currently i use Kernel 3.8.13 and RT Patch 3.8.13-rt12 on the kernel
    found at git://github.com/raspberrypi/__linux.git
    <http://github.com/raspberrypi/linux.git> on branch rpi-3.8.y.

    The bug shows up at booting and after 3 seconds of booting as it
    wants to mount the rootfs in a deadlock. as i compiled sdhci_bcm2708
    as a module i can boot the kernel and system as i pushed the system
    to a usb stick. As far as good.

    Now i try to find the bug, if the rootfs is on the sdcard. I narrowd
    the deadlock down to the following lines:

    void sdhci_spin_lock_irqsave(struct sdhci_host *host,unsigned long
    *flags)
    {
         return;
    #ifdef CONFIG_PREEMPT
         if(enable_llm)
         {
             while(sdhci_locked)
             {
                 preempt_schedule();
             }
             spin_lock_irqsave(&host->lock,__*flags);
             disable_irq(host->irq);
             if(host->second_irq)
                 disable_irq(host->second_irq);
             local_irq_enable();
         }
         else
    #endif
             spin_lock_irqsave(&host->lock,__*flags);
    }

    void sdhci_spin_unlock_irqrestore(__struct sdhci_host *host,unsigned
    long flags)
    {
         return;
    #ifdef CONFIG_PREEMPT
         if(enable_llm)
         {
             local_irq_disable();
             if(host->second_irq)
                 enable_irq(host->second_irq);
             enable_irq(host->irq);
         }
    #endif
         spin_unlock_irqrestore(&host->__lock,flags);
    }

    in drivers/mmc/host/sdhci.c . The both return statements are added
    by me. Now i can boot the RT Preempt kernel but it is for sure not
    the right fix.

    My problem is, that i dont know how those both functions should work
    with the rt preempt patch.

    What can you suggest me to fix that deadlock? I already bought the
    book "Linux Kernel Development" but i dont know how the kernel works
    exaktly with the PREEMPT patch. Can you point me to a site which
    shows how RTPREEMPT works in the irqsave/restore functions or can
    you please describe it to me?

    Thank you
    Georg
    --
    To unsubscribe from this list: send the line "unsubscribe
    linux-rt-users" in
    the body of a message to [email protected]
    <mailto:[email protected]>
    More majordomo info at http://vger.kernel.org/__majordomo-info.html
    <http://vger.kernel.org/majordomo-info.html>
#3 lore raw
Quoted 8 lines · Georg Gast

Hi Tom,

the problem occurs even if i set enable_llm=0. The while loop is now not touched and the rpi deadlocks too.

As far as i understand it, the sdhci.c is the base for all sdhci card readers and the sdhci-*.c implement the ops for the specific hardware.

Quoted 9 lines

My problem is, that i dont have an other sdhci card reader here. It wont be possible to boot from, but i could try to read from it on a rt kernel. If i compile the sdhci_bcm2708 as a module, i could not get a device info from the rpi reader. Maybe an other reader works, then the real problem sits in sdhci_bcm2708.c (or at bad luck, it shows an bigger problem in sdhci.c).

Georg

Here's a quick and dirty hack to get things going.

Regards,

Jeremy

drivers/mmc/host/sdhci.c +16 -0
@@ -162,9 +162,17 @@
 			preempt_schedule();
 		}
 		spin_lock_irqsave(&host->lock,*flags);
+#ifdef CONFIG_PREEMPT_RT_FULL
+		disable_irq_nosync(host->irq);
+#else
 		disable_irq(host->irq);
+#endif
 		if(host->second_irq)
+#ifdef CONFIG_PREEMPT_RT_FULL
+			disable_irq_nosync(host->second_irq);
+#else
 			disable_irq(host->second_irq);
+#endif
 		local_irq_enable();
 	}
 	else
@@ -1834,7 +1842,11 @@
 	host = mmc_priv(mmc);
 
 	sdhci_runtime_pm_get(host);
+#ifdef CONFIG_PREEMPT_RT_FULL
+	disable_irq_nosync(host->irq);
+#else
 	disable_irq(host->irq);
+#endif
 	spin_lock(&host->lock);
 
 	ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
@@ -1935,7 +1947,11 @@
 		wait_event_interruptible_timeout(host->buf_ready_int,
 					(host->tuning_done == 1),
 					msecs_to_jiffies(50));
+#ifdef CONFIG_PREEMPT_RT_FULL
+		disable_irq_nosync(host->irq);
+#else
 		disable_irq(host->irq);
+#endif
 		spin_lock(&host->lock);
 
 		if (!host->tuning_done) {