mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
[PATCH] pdflush: handle resume wakeups
pdflush is carefully designed to ensure that all wakeups have some corresponding work to do - if a woken-up pdflush thread discovers that it hasn't been given any work to do then this is considered an error. That all broke when swsusp came along - because a timer-delivered wakeup to a frozen pdflush thread will just get lost. This causes the pdflush thread to get lost as well: the writeback timer is supposed to be re-armed by pdflush in process context, but pdflush doesn't execute the callout which does this. Fix that up by ignoring the return value from try_to_freeze(): jsut proceed, see if we have any work pending and only go back to sleep if that is not the case. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
bc64863814
commit
d616e09ab3
1 changed files with 7 additions and 8 deletions
15
mm/pdflush.c
15
mm/pdflush.c
|
@ -104,21 +104,20 @@ static int __pdflush(struct pdflush_work *my_work)
|
||||||
list_move(&my_work->list, &pdflush_list);
|
list_move(&my_work->list, &pdflush_list);
|
||||||
my_work->when_i_went_to_sleep = jiffies;
|
my_work->when_i_went_to_sleep = jiffies;
|
||||||
spin_unlock_irq(&pdflush_lock);
|
spin_unlock_irq(&pdflush_lock);
|
||||||
|
|
||||||
schedule();
|
schedule();
|
||||||
if (try_to_freeze()) {
|
try_to_freeze();
|
||||||
spin_lock_irq(&pdflush_lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irq(&pdflush_lock);
|
spin_lock_irq(&pdflush_lock);
|
||||||
if (!list_empty(&my_work->list)) {
|
if (!list_empty(&my_work->list)) {
|
||||||
printk("pdflush: bogus wakeup!\n");
|
/*
|
||||||
|
* Someone woke us up, but without removing our control
|
||||||
|
* structure from the global list. swsusp will do this
|
||||||
|
* in try_to_freeze()->refrigerator(). Handle it.
|
||||||
|
*/
|
||||||
my_work->fn = NULL;
|
my_work->fn = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (my_work->fn == NULL) {
|
if (my_work->fn == NULL) {
|
||||||
printk("pdflush: NULL work function\n");
|
printk("pdflush: bogus wakeup\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&pdflush_lock);
|
spin_unlock_irq(&pdflush_lock);
|
||||||
|
|
Loading…
Reference in a new issue