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/net.c | 58 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 24 deletions(-) (limited to 'src/kernel/net.c') diff --git a/src/kernel/net.c b/src/kernel/net.c index 35c49b5..07f350e 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -27,6 +27,7 @@ #include "net.h" #include "utils.h" #include "clientconfig.h" +#include "mq.h" #define DNBD3_REQ_OP_SPECIAL REQ_OP_DRV_IN @@ -175,7 +176,7 @@ int dnbd3_send_request(struct dnbd3_sock *sock, struct request *req, if (result != lng) { error_sock(sock, "connection to server lost"); if (cmd) { - blk_mq_requeue_request(req, true); + dnbd3_requeue_cmd(cmd); } sock->panic = true; sock->server->failures++; @@ -223,10 +224,6 @@ static int dnbd3_send_request_cmd(struct dnbd3_sock *sock, uint16_t dnbd3_cmd) mutex_lock(&sock->tx_lock); sock->pending = req; result = dnbd3_send_request(sock, req, NULL); - if (result <= 0) { - mutex_unlock(&sock->tx_lock); - goto error; - } mutex_unlock(&sock->tx_lock); error: @@ -336,15 +333,16 @@ static int dnbd3_receive_cmd_get_block_mq(struct dnbd3_sock *sock, kunmap(bvec->bv_page); sigprocmask(SIG_SETMASK, &oldset, NULL ); error_sock(sock, "could not receive from net to block layer"); + dnbd3_requeue_cmd(cmd); mutex_unlock(&cmd->lock); - return result; + return -EIO; } kunmap(bvec->bv_page); sigprocmask(SIG_SETMASK, &oldset, NULL ); } mutex_unlock(&cmd->lock); - blk_mq_end_request(req, 0); + dnbd3_end_cmd(cmd, 0); return result; } @@ -424,6 +422,7 @@ static int dnbd3_receive_cmd_get_servers(struct dnbd3_sock *sock, if (result <= 0) { error_sock(sock, "failed to receive get servers %d", result); + mutex_unlock(&dev->device_lock); return result; } else if (result != (count * sizeof(dnbd3_server_entry_t))) { error_sock(sock, "failed to get servers"); @@ -587,20 +586,22 @@ static void dnbd3_timer(struct timer_list *arg) dev = container_of(arg, struct dnbd3_device, timer); queue_work(dnbd3_wq, &dev->panic_worker); - if (dev->timer_count % TIMER_INTERVAL_KEEPALIVE_PACKET == 0) { - for (i = 0; i < NUMBER_CONNECTIONS; i++) { - if (dnbd3_is_sock_alive(dev->socks[i])) { - queue_work(dnbd3_wq, &dev->socks[i].keepalive_worker); + if (!dnbd3_is_mq_busy(dev)) { + if (dev->timer_count % TIMER_INTERVAL_KEEPALIVE_PACKET == 0) { + for (i = 0; i < NUMBER_CONNECTIONS; i++) { + if (dnbd3_is_sock_alive(dev->socks[i])) { + queue_work(dnbd3_wq, &dev->socks[i].keepalive_worker); + } } } - } - /* start after 4 seconds */ - if (dev->timer_count % TIMER_INTERVAL_PROBE_NORMAL == 4) { - queue_work(dnbd3_wq, &dev->discovery_worker); - } + /* start after 4 seconds */ + if (dev->timer_count % TIMER_INTERVAL_PROBE_NORMAL == 4) { + queue_work(dnbd3_wq, &dev->discovery_worker); + } - dev->timer_count++; + dev->timer_count++; + } dev->timer.expires = jiffies + HZ; add_timer(&dev->timer); } @@ -623,6 +624,7 @@ static void dnbd3_receive_worker(struct work_struct *work) result = dnbd3_receive_cmd(sock, &reply); if (result == -EAGAIN) { continue; + } else if (result <= 0) { error_sock(sock, "connection to server lost %d", result); goto error; @@ -759,9 +761,8 @@ static int dnbd3_adjust_connections(struct dnbd3_device *dev) { int i, j, fallback; struct dnbd3_server *plan[NUMBER_CONNECTIONS]; struct dnbd3_server **servers = dnbd3_sort_server(dev); - +//TODO don't connect to anyting bader then rtt unknown if (servers && servers[0]->host.type != 0) { - mutex_lock(&dev->device_lock); plan[0] = servers[0]; fallback = 0; j = 1; @@ -769,7 +770,8 @@ static int dnbd3_adjust_connections(struct dnbd3_device *dev) { debug_server(dev, plan[0], "server 0 with rtt %llu:", plan[0]->avg_rtt); for (i = 1; i < NUMBER_CONNECTIONS; i++) { - if (servers[j]->host.type != 0) { + if (servers[j]->host.type != 0 && + servers[j]->avg_rtt < RTT_UNKNOWN) { if (RTT_FACTOR(plan[i - 1]->avg_rtt) > servers[j]->avg_rtt) { plan[i] = servers[j]; @@ -786,16 +788,17 @@ static int dnbd3_adjust_connections(struct dnbd3_device *dev) { i, plan[i]->avg_rtt); } kfree(servers); - for (i = 0; i < NUMBER_CONNECTIONS; i++) { if (plan[i] != dev->socks[i].server) { if (dnbd3_is_sock_alive(dev->socks[i])) { dnbd3_socket_disconnect(&dev->socks[i]); } - dnbd3_socket_connect(&dev->socks[i], plan[i]); + j = dnbd3_socket_connect(&dev->socks[i], plan[i]); + if (j) { + return j; + } } } - mutex_unlock(&dev->device_lock); return 0; } else { /* there is nothing to connect */ if (servers) { @@ -838,7 +841,9 @@ static void dnbd3_panic_worker(struct work_struct *work) warn_dev(dev, "panicked, connections still alive %d", sock_alive); + mutex_lock(&dev->device_lock); dnbd3_adjust_connections(dev); + mutex_unlock(&dev->device_lock); } } @@ -1009,12 +1014,12 @@ static void dnbd3_discovery_worker(struct work_struct *work) dnbd3_server_entry_t *new_server; dev = container_of(work, struct dnbd3_device, discovery_worker); + debug_dev(dev, "starting discovery worker new server num is %d", dev->new_servers_num); if (dev->new_servers_num) { mutex_lock(&dev->device_lock); - for (i = 0; i < dev->new_servers_num; i++) { new_server = &dev->new_servers[i]; if (new_server->host.type != 0) { @@ -1036,7 +1041,10 @@ static void dnbd3_discovery_worker(struct work_struct *work) } } + + mutex_lock(&dev->device_lock); dnbd3_adjust_connections(dev); + mutex_unlock(&dev->device_lock); dev->discovery_count++; } @@ -1140,6 +1148,7 @@ static int dnbd3_socket_connect(struct dnbd3_sock *sock, result = __dnbd3_socket_connect(sock, server); if (result) { error_sock(sock, "connection to socket failed"); + mutex_unlock(&sock->tx_lock); result = -EIO; goto error; } @@ -1271,6 +1280,7 @@ int dnbd3_net_connect(struct dnbd3_device *dev) result = dnbd3_adjust_connections(dev); if (result) { error_dev(dev, "failed to connect to initial server"); + dnbd3_net_disconnect(dev); return -ENOENT; } -- cgit v1.2.3-55-g7522