lkml.org 
[lkml]   [2012]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] block: Avoid missed wakeup in request waitqueue
On 05/28/2012 06:26 PM, Tejun Heo wrote:
> On Mon, May 28, 2012 at 12:19:03PM +0800, Asias He wrote:
>> diff --git a/block/blk-core.c b/block/blk-core.c
>> index 1f61b74..1a45877 100644
>> --- a/block/blk-core.c
>> +++ b/block/blk-core.c
>> @@ -359,9 +359,10 @@ EXPORT_SYMBOL(blk_put_queue);
>> */
>> void blk_drain_queue(struct request_queue *q, bool drain_all)
>> {
>> + int i;
>> +
>> while (true) {
>> bool drain = false;
>> - int i;
>>
>> spin_lock_irq(q->queue_lock);
>>
>> @@ -400,6 +401,14 @@ void blk_drain_queue(struct request_queue *q, bool drain_all)
>> break;
>> msleep(10);
>> }
>> +
>> + /* Wake up threads which are sleeping on get_request() */
>> + spin_lock_irq(q->queue_lock);
>> + for (i = 0; i< ARRAY_SIZE(q->rq.wait); i++) {
>> + if (waitqueue_active(&q->rq.wait[i]))
>> + wake_up_all(&q->rq.wait[i]);
>> + }
>> + spin_unlock_irq(q->queue_lock);
>
> I don't think we need waitqueue_active() optimization here. Let's
> just do,
>
> /* please explain why this is necessary */
> for (i = 0; i< ARRAY_SIZE(q->rq.wait); i++)
> wake_up_all(&q->rq.wait[i]);

OK. V2 is on its way.


--
Asias


\
 
 \ /
  Last update: 2012-05-29 03:41    [from the cache]
©2003-2011 Jasper Spaans