Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48cc661e authored by Jens Axboe's avatar Jens Axboe
Browse files

null_blk: use async queue restart helper



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: default avatarRabin Vincent <rabin@rab.in>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 21491412
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -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)