From f6c99126c9df1cae6a8d9b51998760a5896f4e9d Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Fri, 23 Aug 2019 12:09:03 +0200 Subject: moved mq part to new file fixed various bugs --- src/kernel/core.c | 163 +++--------------------------------------------------- 1 file changed, 9 insertions(+), 154 deletions(-) (limited to 'src/kernel/core.c') diff --git a/src/kernel/core.c b/src/kernel/core.c index 6f0dab4..19f4bac 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -51,6 +51,7 @@ #include "sysfs.h" #include "clientconfig.h" #include "net.h" +#include "mq.h" @@ -62,159 +63,6 @@ static unsigned int max_devs = NUMBER_DEVICES; static struct dnbd3_device *device; int major; -/** - * dnbd3_requeue_cmd - requeue a command once - * @cmd: the command to requeue - */ -static void dnbd3_requeue_cmd(struct dnbd3_cmd *cmd) -{ - struct request *req = blk_mq_rq_from_pdu(cmd); - if (!cmd->requed) { - cmd->requed = true; - blk_mq_requeue_request(req, true); - } else { - blk_mq_end_request(req, BLK_STS_IOERR); - } -} - -/** - * dnbd3_handle_cmd - handles a mq command - * @cmd: the cmd to send - * @index: the index of the queue - */ -static int dnbd3_handle_cmd(struct dnbd3_cmd *cmd, int index) -{ - struct request *req = blk_mq_rq_from_pdu(cmd); - struct dnbd3_device *dev = cmd->dnbd3; - struct dnbd3_sock *sock = &dev->socks[index]; - int ret = -1; - -// debug_dev(dev, "handle request at position %lu, size %d, index %d", -// blk_rq_pos(req), blk_rq_bytes(req), index); - - - if (!(sock->server && sock->sock && !sock->panic)) { -// warn_dev(dev, "attempted send on invalid socket %d", index); - msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000); - - dnbd3_requeue_cmd(cmd); - ret = 0; - goto out; - } - - cmd->status = BLK_STS_OK; - - mutex_lock(&sock->tx_lock); - if (unlikely(!sock->sock)) { - mutex_unlock(&sock->tx_lock); - warn_sock(sock, "not connected"); - return -EIO; - } - - blk_mq_start_request(req); - if (unlikely(sock->pending && sock->pending != req)) { - dnbd3_requeue_cmd(cmd); - ret = 0; - goto out; - } - - ret = dnbd3_send_request(sock, blk_mq_rq_from_pdu(cmd), cmd); - if (ret == -EAGAIN) { - dev_err_ratelimited(disk_to_dev(dev->disk), "request send failed, requeueing\n"); - dnbd3_requeue_cmd(cmd); - ret = 0; - } -out: - mutex_unlock(&sock->tx_lock); - return ret; -} - -/** - * dnbd3_queue_rq - queue request - * @hctx: state for a hardware queue facing the hardware block device - * @bd: the queue data including the request - */ -static blk_status_t dnbd3_queue_rq(struct blk_mq_hw_ctx *hctx, - const struct blk_mq_queue_data *bd) -{ - struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(bd->rq); - int ret; - - mutex_lock(&cmd->lock); -// cmd->requed = false; - - ret = dnbd3_handle_cmd(cmd, hctx->queue_num); - if (ret < 0) { - ret = BLK_STS_IOERR; - } else if (ret >= 0) { - ret = BLK_STS_OK; - } - mutex_unlock(&cmd->lock); - - return ret; -} - -/** - * dnbd3_init_request - init a mq request - * @set: the mq tag set - * @rq: the request - * @hctx_idx: - * @numa_node: - */ -static int dnbd3_init_request(struct blk_mq_tag_set *set, struct request *rq, - unsigned int hctx_idx, unsigned int numa_node) -{ - struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(rq); - cmd->dnbd3 = set->driver_data; - cmd->requed = false; - mutex_init(&cmd->lock); - return 0; -} - -/** - * dnbd3_xmit_timeout - timeout function for mq - * @req: the timedout request - * @reserved: - */ -static enum blk_eh_timer_return dnbd3_xmit_timeout(struct request *req, - bool reserved) -{ - struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req); - struct dnbd3_device *dev = cmd->dnbd3; - int i; - warn_dev(dev, "received timeout"); - - if (!mutex_trylock(&cmd->lock)) { - return BLK_EH_RESET_TIMER; - } - - for (i = 0; i < NUMBER_CONNECTIONS; i++) { - if (dnbd3_is_sock_alive(dev->socks[i])) { - info_sock(&dev->socks[i], "reset request to new socket"); - dnbd3_requeue_cmd(cmd); - return BLK_EH_DONE; - } - } - - dev_err_ratelimited(disk_to_dev(dev->disk), "connection timed out\n"); - cmd->status = BLK_STS_IOERR; - blk_mq_complete_request(req); - blk_mq_end_request(req, BLK_STS_TIMEOUT); - return BLK_EH_DONE; -} - -/** - * struct blk_mq_ops - dnbd3_mq_ops - * multiqueue operations - */ -static struct blk_mq_ops dnbd3_mq_ops = { - .queue_rq = dnbd3_queue_rq, - .init_request = dnbd3_init_request, - .timeout = dnbd3_xmit_timeout, -}; - - - /** * dnbd3_ioctl - the ioctl function of the dnbd3 kernel modul * @bdev: the block device @@ -301,6 +149,12 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, mutex_unlock(&dev->device_lock); result = dnbd3_net_connect(dev); + if (result) { + if (dev->imgname) { + kfree(dev->imgname); + dev->imgname = NULL; + } + } imgname = NULL; } break; @@ -392,6 +246,7 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor) mutex_init(&dev->device_lock); mutex_lock(&dev->device_lock); +// atomic_set(&dev->mq_requests, 0); for (i = 0; i < NUMBER_CONNECTIONS; i++) { dev->socks[i].device = dev; dev->socks[i].sock_nr = i; @@ -421,7 +276,7 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor) dev->tag_set.numa_node = NUMA_NO_NODE; dev->tag_set.cmd_size = sizeof(struct dnbd3_cmd); dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | - BLK_MQ_F_SG_MERGE | BLK_MQ_F_BLOCKING; + BLK_MQ_F_SG_MERGE; // | BLK_MQ_F_BLOCKING; dev->tag_set.driver_data = dev; err = blk_mq_alloc_tag_set(&dev->tag_set); -- cgit v1.2.3-55-g7522