Hello, Asias. On Fri, May 25, 2012 at 09:16:47AM +0800, Asias He wrote: > >I found this after queue cleanup. rl->wait[] is not empty while > >rl->count[] == 0. There are exactly nr_sleep - nr_wakeup of process in D > >state. So missed wakeup happens? Any ideas to do more debug to find the > >root-cause? > > Ping. Ah, okay, freed_request() wakes up single waiter with the assumption that after the wakeup there will at least be one successful allocation which in turn will continue the wakeup chain until the wait list is empty - ie. waiter wakeup is dependent on successful request allocation happening after each wakeup. With queue marked dead, any woken up waiter fails the allocation path, so the wakeup chaining is lost and we're left with hung waiters. What we need is wake_up_all() after drain completion. Can you please test that? Thanks. -- tejun -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html