diff options
author | Frederic Robra | 2019-09-03 11:25:19 +0200 |
---|---|---|
committer | Frederic Robra | 2019-09-03 11:25:19 +0200 |
commit | 93dc338dfd719f02290639394ad7bd1800b971e4 (patch) | |
tree | 7ef910ee823a4362ad2c46963bd1d92c263d1170 /src/kernel/mq.c | |
parent | splitted net (diff) | |
download | dnbd3-ng-93dc338dfd719f02290639394ad7bd1800b971e4.tar.gz dnbd3-ng-93dc338dfd719f02290639394ad7bd1800b971e4.tar.xz dnbd3-ng-93dc338dfd719f02290639394ad7bd1800b971e4.zip |
added support to requeue busy requests
Diffstat (limited to 'src/kernel/mq.c')
-rw-r--r-- | src/kernel/mq.c | 24 |
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 |