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]);