Re: [PATCH] block: Avoid missed wakeup in request waitqueue

From: Asias He
Date: Mon May 28 2012 - 21:15:43 EST


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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/