From bd1c4e2c84c25a945f61a66367ce8d0cf4551034 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Tue, 30 Jul 2019 12:15:38 +0200 Subject: added documentation --- src/kernel/net.c | 98 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 71 insertions(+), 27 deletions(-) (limited to 'src/kernel/net.c') diff --git a/src/kernel/net.c b/src/kernel/net.c index dfde203..2d0b6ad 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -65,21 +65,46 @@ (h).msg_flags = MSG_WAITALL | MSG_NOSIGNAL; \ } while (0) -#define dnbd3_avg_rtt(server) \ - (( (server)->rtts[0] + (server)->rtts[1] \ - + (server)->rtts[2] + (server)->rtts[3] ) / 4 ) -#define dnbd3_set_rtt_unreachable(server) \ - (server)->rtts[0] = (server)->rtts[1] = (server)->rtts[2] \ - = (server)->rtts[3] = RTT_UNREACHABLE; +#if NUMBER_CONNECTIONS == 1 +#define dnbd3_pl_socket_connect(dev, server) \ + dnbd3_socket_connect(dev, server) +#define dnbd3_pl_socket_disconnect(sock) \ + dnbd3_socket_disconnect(sock) + + +#else +#define dnbd3_pl_socket_connect(sock, server) \ + do {\ + int i; \ + for (i = 0 < NUMBER_PARALLEL_CONNECTIONS; i++) { \ + dnbd3_socket_connect(dev, server); \ + dnbd3_socket_connect((sock) + \ + (i * sizeof(struct dnbd3_sock)), \ + (server)); \ + } \ + } while (0) + + +#define dnbd3_pl_socket_disconnect(sock) \ + do { \ + int i; \ + for (i = 0 < NUMBER_PARALLEL_CONNECTIONS; i++) { \ + dnbd3_socket_disconnect((sock) + \ + (i * sizeof(struct dnbd3_sock))); \ + } \ + } while (0) + +#endif static int dnbd3_server_connect(struct dnbd3_device *dev, struct dnbd3_server *server); static int dnbd3_socket_connect(struct dnbd3_sock *sock, struct dnbd3_server * server); -static int dnbd3_socket_disconnect(struct dnbd3_device *dev, - struct dnbd3_server *server, struct dnbd3_sock *sock); +static int dnbd3_socket_disconnect(struct dnbd3_sock *sock); +static int dnbd3_server_disconnect(struct dnbd3_device *dev, + struct dnbd3_server *server); /* @@ -822,7 +847,7 @@ static void dnbd3_adjust_connections(struct dnbd3_device *dev) { server = dnbd3_find_best_alt_server(dev); existing_server = dev->socks[i].server; if (server && dnbd3_better_rtt(server, dev->socks[i].server)) { - dnbd3_socket_disconnect(dev, NULL, &dev->socks[i]); + dnbd3_socket_disconnect(&dev->socks[i]); /* if it fails reconnect to existing */ if (dnbd3_server_connect(dev, server) != 0) { @@ -849,7 +874,7 @@ static void dnbd3_adjust_connections(struct dnbd3_device *dev) { rtt = dnbd3_avg_rtt(dev->socks[i].server); if (rtt > RTT_THRESOULD_LIMIT(best_rtt)) { info_sock(&dev->socks[i], "removing connection with rtt %llu", rtt); - dnbd3_socket_disconnect(dev, NULL, &dev->socks[i]); + dnbd3_socket_disconnect(&dev->socks[i]); sock_alive--; } } @@ -911,7 +936,8 @@ static void dnbd3_panic_worker(struct work_struct *work) panicked_server = panicked_sock->server; new_server = dnbd3_find_best_alt_server(dev); - dnbd3_socket_disconnect(dev, panicked_server, panicked_sock); + dnbd3_socket_disconnect(panicked_sock); + dnbd3_set_rtt_unreachable(panicked_server); if (new_server != NULL && new_server != panicked_server) { info_server(dev, new_server, "found replacement"); @@ -1027,6 +1053,11 @@ error: } +/** + * dnbd3_merge_new_server - merge the new server into the alt server list + * @dev: the device + * @new_server: the new server list to merge + */ static void dnbd3_merge_new_server(struct dnbd3_device *dev, dnbd3_server_entry_t *new_server) { @@ -1057,7 +1088,7 @@ static void dnbd3_merge_new_server(struct dnbd3_device *dev, if (new_server->failures == 1) { /* remove is requested */ info_server(dev, new_server, "remove server is requested"); - dnbd3_socket_disconnect(dev, existing_server, NULL); + dnbd3_server_disconnect(dev, existing_server); existing_server->host.type = 0; } // existing_server->failures = 0; // reset failure count @@ -1329,32 +1360,22 @@ error: /** * dnbd3_socket_disconnect - disconnect a socket or server - * @dev: the device - * @server: optional the server to disconnect - * @sock: optional the socket to disconnect + * @sock: the socket to disconnect * * 1. update nr of mq queues * 2. if last socket remove timer * 3. disconnect socket */ -static int dnbd3_socket_disconnect(struct dnbd3_device *dev, - struct dnbd3_server *server, struct dnbd3_sock *sock) +static int dnbd3_socket_disconnect(struct dnbd3_sock *sock) { int i; + struct dnbd3_device *dev = sock->device; int sock_alive = 0; for (i = 0; i < NUMBER_CONNECTIONS; i++) { - if (sock == NULL && dev->socks[i].server == server) { - sock = &dev->socks[i]; - } if (dnbd3_is_sock_alive(dev->socks[i])) { sock_alive++; } } - if (!sock || !sock->sock) { - warn_dev(dev, "could not find socket to disconnect"); - return -EIO; - } - blk_mq_update_nr_hw_queues(&dev->tag_set, sock_alive - 1); if (sock_alive <= 1) { info_sock(sock, "shutting down last socket and stopping timer"); del_timer_sync(&dev->timer); @@ -1385,6 +1406,7 @@ static int dnbd3_socket_disconnect(struct dnbd3_device *dev, } mutex_unlock(&sock->tx_lock); mutex_destroy(&sock->tx_lock); + blk_mq_update_nr_hw_queues(&dev->tag_set, sock_alive - 1); cancel_work_sync(&sock->receive_worker); @@ -1397,6 +1419,29 @@ static int dnbd3_socket_disconnect(struct dnbd3_device *dev, return 0; } +/** + * dnbd3_server_disconnect - disconnect a server from a socket + * @dev: the device + * @server: the server to disconnect + */ +static int dnbd3_server_disconnect(struct dnbd3_device *dev, + struct dnbd3_server *server) +{ + int i; + struct dnbd3_sock *sock = NULL; + for (i = 0; i < NUMBER_CONNECTIONS; i++) { + if (dev->socks[i].server == server) { + sock = &dev->socks[i]; + } + } + if (!sock || !sock->sock) { + warn_dev(dev, "could not find socket to disconnect"); + return -EIO; + } + return dnbd3_socket_disconnect(sock); +} + + /** * dnbd3_net_connect - connect device * @dev: the device to connect @@ -1439,8 +1484,7 @@ int dnbd3_net_disconnect(struct dnbd3_device *dev) for (i = 0; i < NUMBER_CONNECTIONS; i++) { if (dev->socks[i].sock) { - if (dnbd3_socket_disconnect(dev, NULL, - &dev->socks[i])) { + if (dnbd3_socket_disconnect(&dev->socks[i])) { result = -EIO; } } -- cgit v1.2.3-55-g7522