From 93dc338dfd719f02290639394ad7bd1800b971e4 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Tue, 3 Sep 2019 11:25:19 +0200 Subject: added support to requeue busy requests --- src/kernel/mq.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/kernel/mq.c') diff --git a/src/kernel/mq.c b/src/kernel/mq.c index 94f06f2..60673b0 100644 --- a/src/kernel/mq.c +++ b/src/kernel/mq.c @@ -28,9 +28,9 @@ * dnbd3_busy_iter - iterator for blk_mq_tagset_busy_iter * @req: the request * @priv: the passed argument from blk_mq_tagset_busy_iter - * @arg2: unknown + * @arg: unknown */ -static void dnbd3_busy_iter(struct request *req, void *priv, bool arg2) +static void dnbd3_busy_iter(struct request *req, void *priv, bool arg) { struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req); unsigned long *busy = (unsigned long *) priv; @@ -70,6 +70,26 @@ unsigned long dnbd3_is_mq_busy(struct dnbd3_device *dev) return busy; } +static void dnbd3_busy_iter_requeue(struct request *req, void *priv, bool arg) +{ + struct dnbd3_sock *sock = priv; + struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req); + if (!mutex_trylock(&cmd->lock)) { + /* request is in sending, so we will not requeue */ + return; + } + debug_sock(sock, "requeue busy request %p", req); + dnbd3_requeue_cmd(cmd); + mutex_unlock(&cmd->lock); +} + +void dndb3_reque_busy_requests(struct dnbd3_sock *sock) +{ + struct blk_mq_tag_set *set = &sock->device->tag_set; + blk_mq_tagset_busy_iter(set, dnbd3_busy_iter_requeue, sock); +} + + /** * dnbd3_requeue_cmd - requeue a command once -- cgit v1.2.3-55-g7522