On Thu, Apr 28, 2016 at 07:51:04PM +0800, Chao Yu wrote: > > On Wed, Apr 27, 2016 at 09:41:48PM +0800, Chao Yu wrote: > >> From: Chao Yu <yuch...@huawei.com> > >> > >> The following condition can happen in a preemptible kernel, it may cause > >> checkpointer hunging. > >> > >> CPU0: CPU1: > >> - write_checkpoint > >> - do_checkpoint > >> - wait_on_all_pages_writeback > >> - f2fs_write_end_io > >> - wake_up > >> this is last writebacked page, but > >> no sleeper in sbi->cp_wait wait > >> queue, wake_up is not been called. > >> - prepare_to_wait(TASK_UNINTERRUPTIBLE) > >> Here, current task can been preempted, > >> but there will be no waker since last > >> write_end_io has bypassed wake_up. So > >> current task will sleep forever.
But here, you should be verifying if you really should go sleep; as the code did; it tests for !get_pages(, F2FS_WRITEBACK), and if you've just completed that very last one, this will break out. > >> - io_schedule_timeout > >