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-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html