Skip to content
  • Oleg Nesterov's avatar
    PM / Freezer: Reimplement wait_event_freezekillable using freezer_do_not_count/freezer_count · 6f35c4ab
    Oleg Nesterov authored
    Commit 27920651 "PM / Freezer: Make fake_signal_wake_up() wake
    TASK_KILLABLE tasks too" updated fake_signal_wake_up() used by freezer
    to wake up KILLABLE tasks.  Sending unsolicited wakeups to tasks in
    killable sleep is dangerous as there are code paths which depend on
    tasks not waking up spuriously from KILLABLE sleep.
    
    For example. sys_read() or page can sleep in TASK_KILLABLE assuming
    that wait/down/whatever _killable can only fail if we can not return
    to the usermode.  TASK_TRACED is another obvious example.
    
    The offending commit was to resolve freezer hang during system PM
    operations caused by KILLABLE sleeps in network filesystems.
    wait_event_freezekillable(), which depends on the spurious KILLABLE
    wakeup, was added by f06ac72e "cifs, freezer: add
    wait_event_freezekillable and have cifs use it" to be used to
    implement killable & freezable sleeps in network filesystems.
    
    To prepare for reverting of 27920651
    
    , this patch reimplements
    wait_event_freezekillable() using freezer_do_not_count/freezer_count()
    so that it doesn't depend on the spurious KILLABLE wakeup.  This isn't
    very nice but should do for now.
    
    [tj: Refreshed patch to apply to linus/master and updated commit
        description on Rafael's request.]
    
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    6f35c4ab