summaryrefslogtreecommitdiffstats
path: root/src/kernel/net.c
diff options
context:
space:
mode:
authorFrederic Robra2019-07-30 12:15:38 +0200
committerFrederic Robra2019-07-30 12:15:38 +0200
commitbd1c4e2c84c25a945f61a66367ce8d0cf4551034 (patch)
treee71e5393f672ad9c9c1401396c428360c87cf4ae /src/kernel/net.c
parentadded some documentation (diff)
downloaddnbd3-ng-bd1c4e2c84c25a945f61a66367ce8d0cf4551034.tar.gz
dnbd3-ng-bd1c4e2c84c25a945f61a66367ce8d0cf4551034.tar.xz
dnbd3-ng-bd1c4e2c84c25a945f61a66367ce8d0cf4551034.zip
added documentation
Diffstat (limited to 'src/kernel/net.c')
-rw-r--r--src/kernel/net.c98
1 files changed, 71 insertions, 27 deletions
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);
@@ -1398,6 +1420,29 @@ static int dnbd3_socket_disconnect(struct dnbd3_device *dev,
}
/**
+ * 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;
}
}