summaryrefslogtreecommitdiffstats
path: root/src/kernel/net.c
diff options
context:
space:
mode:
authorFrederic Robra2019-08-23 12:09:03 +0200
committerFrederic Robra2019-08-23 12:09:03 +0200
commitf6c99126c9df1cae6a8d9b51998760a5896f4e9d (patch)
tree7cb2032c6e2960eed328dcff9903ae41886a18c8 /src/kernel/net.c
parentchanged strategy to connect to diffrent sockets (diff)
downloaddnbd3-ng-f6c99126c9df1cae6a8d9b51998760a5896f4e9d.tar.gz
dnbd3-ng-f6c99126c9df1cae6a8d9b51998760a5896f4e9d.tar.xz
dnbd3-ng-f6c99126c9df1cae6a8d9b51998760a5896f4e9d.zip
moved mq part to new file
fixed various bugs
Diffstat (limited to 'src/kernel/net.c')
-rw-r--r--src/kernel/net.c58
1 files changed, 34 insertions, 24 deletions
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;
}