From mboxrd@z Thu Jan 1 00:00:00 1970 From: Asias He Subject: Re: [PATCH V2] block: Avoid missed wakeup in request waitqueue Date: Wed, 06 Jun 2012 10:14:42 +0800 Message-ID: <4FCEBD12.4030706@redhat.com> References: <20120528102614.GC15202@dhcp-172-17-108-109.mtv.corp.google.com> <1338254100-13336-1-git-send-email-asias@redhat.com> <20120529012115.GE20954@dhcp-172-17-108-109.mtv.corp.google.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: Tejun Heo , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org To: Jens Axboe Return-path: Received: from mx1.redhat.com ([209.132.183.28]:63838 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751289Ab2FFCNa (ORCPT ); Tue, 5 Jun 2012 22:13:30 -0400 In-Reply-To: <20120529012115.GE20954@dhcp-172-17-108-109.mtv.corp.google.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Hello, Jens On 05/29/2012 09:21 AM, Tejun Heo wrote: > On Tue, May 29, 2012 at 09:15:00AM +0800, Asias He wrote: >> After hot-unplug a stressed disk, I found that rl->wait[] is not empty >> while rl->count[] is empty and there are theads still sleeping on >> get_request after the queue cleanup. With simple debug code, I found >> there are exactly nr_sleep - nr_wakeup of theads in D state. So there >> are missed wakeup. >> >> $ dmesg | grep nr_sleep >> [ 52.917115] ---> nr_sleep=1046, nr_wakeup=873, delta=173 >> $ vmstat 1 >> 1 173 0 712640 24292 96172 0 0 0 0 419 757 0 0 0 100 0 >> >> To quote Tejun: >> >> 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. >> >> This patch fixes the missed wakeup by waking up all the theads which >> are sleeping on wait queue after queue drain. >> >> Changes in v2: Drop waitqueue_active() optimization >> >> Signed-off-by: Asias He > > Acked-by: Tejun Heo > > Jens, this one wants Cc: stable. Ping. -- Asias