|
@@ -615,15 +615,19 @@ static void blk_mq_check_expired(struct blk_mq_hw_ctx *hctx,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void blk_mq_rq_timer(unsigned long priv)
|
|
|
+static void blk_mq_timeout_work(struct work_struct *work)
|
|
|
{
|
|
|
- struct request_queue *q = (struct request_queue *)priv;
|
|
|
+ struct request_queue *q =
|
|
|
+ container_of(work, struct request_queue, timeout_work);
|
|
|
struct blk_mq_timeout_data data = {
|
|
|
.next = 0,
|
|
|
.next_set = 0,
|
|
|
};
|
|
|
int i;
|
|
|
|
|
|
+ if (blk_queue_enter(q, true))
|
|
|
+ return;
|
|
|
+
|
|
|
blk_mq_queue_tag_busy_iter(q, blk_mq_check_expired, &data);
|
|
|
|
|
|
if (data.next_set) {
|
|
@@ -638,6 +642,7 @@ static void blk_mq_rq_timer(unsigned long priv)
|
|
|
blk_mq_tag_idle(hctx);
|
|
|
}
|
|
|
}
|
|
|
+ blk_queue_exit(q);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2015,7 +2020,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
|
|
|
hctxs[i]->queue_num = i;
|
|
|
}
|
|
|
|
|
|
- setup_timer(&q->timeout, blk_mq_rq_timer, (unsigned long) q);
|
|
|
+ INIT_WORK(&q->timeout_work, blk_mq_timeout_work);
|
|
|
blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30 * HZ);
|
|
|
|
|
|
q->nr_queues = nr_cpu_ids;
|