Messages in this thread | | | Date | Tue, 11 May 2010 16:55:38 -0700 | Subject | Re: [linux-pm] Is it supposed to be ok to call del_gendisk while userspace is frozen? | From | Matt Reimer <> |
| |
On Thu, Apr 22, 2010 at 10:17 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote: > On Friday 23 April 2010, Matt Reimer wrote: >> On Thu, Mar 4, 2010 at 1:15 PM, Pavel Machek <pavel@ucw.cz> wrote: >> > Hi! >> > >> >> > My thought exactly. This is the only approach that also solves the >> >> > following race: >> >> > >> >> > A driver is unloaded at the same time as a suspend starts. >> >> > >> >> > The writeback thread gets frozen. >> >> > >> >> > Then before the rmmod thread is frozen, it calls del_gendisk. >> >> > >> >> > Delaying things by means of a workqueue (or the equivalent) might also >> >> > work, but it doesn't seem as safe. For example, some important >> >> > writebacks might end up getting delayed until too late. >> > >> > Delaying writebacks during sleep should be ok... That's why we do >> > sync() after userspace is frozen -- nothing really important should be >> > waiting for writeback after that point. >> >> Has this been fixed, > > No, it hasn't. > >> or has a consensus about how to fix this been >> achieved? I'm hitting the same problem and have some time to work on a >> fix. > > Generally, it looks like del_gendisk should thaw writeback threads, but not > during suspend, only during resume.
Thawing the writeback thread only during resume does fix the case Maxim originally presented:
0. build kernel with CONFIG_MMC_UNSAFE_RESUME 1. insert SD card 2. suspend 3. remove SD card while suspended 4. resume from suspend hangs
But if CONFIG_MMC_UNSAFE_RESUME is not set, the kernel oopses during suspend because the MMC device suspend times out:
mmc0: card e624 removed **** DPM device timeout: pxa2xx-mci.0 (pxa2xx-mci) kernel BUG at /home/mreimer/sdg/android/android-2.1/kernel/drivers/base/power/main.c:453! Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c0004000 [00000000] *pgd=00000000 Internal error: Oops: 817 [#1] PREEMPT
If I thaw the writeback thread unconditionally in del_gendisk() then suspend and resume work as expected for both CONFIG_MMC_UNSAFE_RESUME set/not set, even when the card is removed while suspended.
So what is the proper fix?
Matt -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |