summaryrefslogtreecommitdiffstats
path: root/src/kernel/mq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/mq.c')
-rw-r--r--src/kernel/mq.c24
1 files changed, 22 insertions, 2 deletions
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