Skip to content

Commit

Permalink
null_blk: use async queue restart helper
Browse files Browse the repository at this point in the history
If null_blk is run in NULL_IRQ_TIMER mode and with queue_mode NULL_Q_RQ,
we need to restart the queue from the hrtimer interrupt. We can't
directly invoke the request_fn from that context, so punt the queue run
to async kblockd context.

Tested-by: Rabin Vincent <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe committed Dec 28, 2015
1 parent 2149141 commit 48cc661
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions drivers/block/null_blk.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,20 +232,19 @@ static void end_cmd(struct nullb_cmd *cmd)
break;
case NULL_Q_BIO:
bio_endio(cmd->bio);
goto free_cmd;
break;
}

free_cmd(cmd);

/* Restart queue if needed, as we are freeing a tag */
if (q && !q->mq_ops && blk_queue_stopped(q)) {
if (queue_mode == NULL_Q_RQ && blk_queue_stopped(q)) {
unsigned long flags;

spin_lock_irqsave(q->queue_lock, flags);
if (blk_queue_stopped(q))
blk_start_queue(q);
blk_start_queue_async(q);
spin_unlock_irqrestore(q->queue_lock, flags);
}
free_cmd:
free_cmd(cmd);
}

static enum hrtimer_restart null_cmd_timer_expired(struct hrtimer *timer)
Expand Down

0 comments on commit 48cc661

Please sign in to comment.