From 6c509e7a6e90c2e8e55613e29cb08dc2674e30de Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 23 Mar 2021 16:15:43 +0100 Subject: [KERNEL] Set fake low RTT after manual server switch This avoids automatically switching back right after adding and switching to a server. --- src/kernel/blk.c | 7 +++++++ src/kernel/dnbd3_main.c | 1 + 2 files changed, 8 insertions(+) diff --git a/src/kernel/blk.c b/src/kernel/blk.c index 661bc2e..90e9b34 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -247,6 +247,13 @@ static int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int /* switching didn't work but we are back to the old server */ result = -EAGAIN; } + } else { + /* switch succeeded, fake very low RTT so we don't switch away again soon */ + mutex_lock(&dev->alt_servers_lock); + if (is_same_server(alt_server, &new_server)) { + alt_server->rtts[0] = alt_server->rtts[1] = alt_server->rtts[2] = alt_server->rtts[3] = 4; + } + mutex_unlock(&dev->alt_servers_lock); } } else { /* specified server is already working, so do not switch */ diff --git a/src/kernel/dnbd3_main.c b/src/kernel/dnbd3_main.c index 17d553e..7a3b1d5 100644 --- a/src/kernel/dnbd3_main.c +++ b/src/kernel/dnbd3_main.c @@ -66,6 +66,7 @@ static inline dnbd3_server_t *get_free_alt_server(dnbd3_device_t *const dev) /** * Returns pointer to existing entry in alt_servers that matches the given * alt server, or NULL if not found. + * The caller has to hold dev->alt_servers_lock. */ dnbd3_server_t *get_existing_server(const dnbd3_host_t *const newserver, dnbd3_device_t *const dev) { -- cgit v1.2.3-55-g7522