From 3dcda423a8c3bfeacdb11cf164a717ce7ca78572 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Tue, 13 Aug 2019 15:13:04 +0200 Subject: changed strategy to connect to diffrent sockets --- src/kernel/core.c | 61 +++++++++++++++++++------------------------------------ 1 file changed, 21 insertions(+), 40 deletions(-) (limited to 'src/kernel/core.c') diff --git a/src/kernel/core.c b/src/kernel/core.c index 8bb23d9..6f0dab4 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -72,6 +72,8 @@ static void dnbd3_requeue_cmd(struct dnbd3_cmd *cmd) if (!cmd->requed) { cmd->requed = true; blk_mq_requeue_request(req, true); + } else { + blk_mq_end_request(req, BLK_STS_IOERR); } } @@ -84,47 +86,22 @@ 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 = NULL; - bool first_try = true; + struct dnbd3_sock *sock = &dev->socks[index]; int ret = -1; - int i; - int sock_alive = 0; - debug_dev(dev, "handle request at position %lu, size %d, index %d", - blk_rq_pos(req), blk_rq_bytes(req), index); +// debug_dev(dev, "handle request at position %lu, size %d, index %d", +// blk_rq_pos(req), blk_rq_bytes(req), index); -again: - for (i = 0; i < NUMBER_CONNECTIONS; i++) { - if (dnbd3_is_sock_alive(dev->socks[i])) { - if (index == sock_alive) { - sock = &dev->socks[i]; - } - sock_alive++; - } - } + if (!(sock->server && sock->sock && !sock->panic)) { +// warn_dev(dev, "attempted send on invalid socket %d", index); + msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000); - if (!sock) { // TODO let the mq queues be the same number as NUMBER_CONNECTIONS than handle them - warn_dev(dev, "index is %d but no socket was found", index); - dev_err_ratelimited(disk_to_dev(dev->disk), "attempted send on invalid socket\n"); - if (sock_alive > 0) { - blk_mq_update_nr_hw_queues(&dev->tag_set, sock_alive); - dnbd3_requeue_cmd(cmd); - ret = 0; - goto out; - } - if (first_try) { - debug_dev(dev, "no socket found, going to sleep"); - msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000); - first_try = false; - goto again; - } - error_dev(dev, "failed to find a socket, end request"); - blk_mq_end_request(req, BLK_STS_IOERR); - return -EINVAL; + dnbd3_requeue_cmd(cmd); + ret = 0; + goto out; } - cmd->status = BLK_STS_OK; mutex_lock(&sock->tx_lock); @@ -164,7 +141,7 @@ static blk_status_t dnbd3_queue_rq(struct blk_mq_hw_ctx *hctx, int ret; mutex_lock(&cmd->lock); - cmd->requed = false; +// cmd->requed = false; ret = dnbd3_handle_cmd(cmd, hctx->queue_num); if (ret < 0) { @@ -290,7 +267,6 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, } } - mutex_lock(&dev->device_lock); switch (cmd) { case IOCTL_OPEN: debug_dev(dev, "ioctl open"); @@ -301,13 +277,14 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, } else if (msg == NULL) { result = -EINVAL; } else { + mutex_lock(&dev->device_lock); if (sizeof(msg->host) != sizeof(dev->initial_server.host)) { warn_dev(dev, "odd size bug#1 triggered in ioctl"); } memcpy(&dev->initial_server.host, &msg->host, sizeof(msg->host)); dev->initial_server.failures = 0; - dnbd3_set_rtt_unreachable(&dev->initial_server) + dnbd3_set_rtt_unknown(&dev->initial_server) dev->imgname = imgname; dev->rid = msg->rid; dev->use_server_provided_alts = @@ -320,6 +297,9 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, * NUMBER_SERVERS); memcpy(dev->alt_servers, &dev->initial_server, sizeof(dev->alt_servers[0])); + + mutex_unlock(&dev->device_lock); + result = dnbd3_net_connect(dev); imgname = NULL; } @@ -352,12 +332,14 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, } else if (msg == NULL) { result = -EINVAL; } else { + mutex_lock(&dev->device_lock); memcpy(&dev->new_servers[dev->new_servers_num].host, &msg->host, sizeof(msg->host)); /* 0 = ADD, 1 = REM */ dev->new_servers[dev->new_servers_num].failures = (cmd == IOCTL_ADD_SRV ? 0 : 1); - ++dev->new_servers_num; + dev->new_servers_num++; + mutex_unlock(&dev->device_lock); result = 0; } break; @@ -372,7 +354,6 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, result = -EIO; break; } - mutex_unlock(&dev->device_lock); error: if (msg) kfree(msg); if (imgname) kfree(imgname); @@ -435,7 +416,7 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor) dev->disk = disk; dev->tag_set.ops = &dnbd3_mq_ops; /* this can be changed later with blk_mq_update_nr_hw_queues() */ - dev->tag_set.nr_hw_queues = 1; + dev->tag_set.nr_hw_queues = NUMBER_CONNECTIONS; dev->tag_set.queue_depth = 128; dev->tag_set.numa_node = NUMA_NO_NODE; dev->tag_set.cmd_size = sizeof(struct dnbd3_cmd); -- cgit v1.2.3-55-g7522