On 2016/4/28 22:37, Peter Zijlstra wrote: > On Thu, Apr 28, 2016 at 10:30:55PM +0800, Chao Yu wrote: >> On 2016/4/28 22:03, Peter Zijlstra wrote: >>> 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 <[email protected]> >>>>>> >>>>>> 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. >> >> You mean after being preempted with TASK_UNINTERRUPTIBLE status, that task >> still >> has chance to be scheduled to check '!get_pages(, F2FS_WRITEBACK)', is that >> right? > > Yes, preemption ignores task_struct::state.
Got it. Thanks very much for your help! :) > ------------------------------------------------------------------------------ Find and fix application performance issues faster with Applications Manager Applications Manager provides deep performance insights into multiple tiers of your business applications. It resolves application problems quickly and reduces your MTTR. Get your free trial! https://ad.doubleclick.net/ddm/clk/302982198;130105516;z _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
