On 05/28/2012 08:30 AM, Tejun Heo wrote:
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! Works for me. Will cook a patch for this.
--
Asias
--
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