[PATCH 0/4] qemu: a bugfix and a few cleanups of graphics port releasing

Nikolay Shirokovskiy (4): qemu: cleanup code to release VNC port qemu: fix releasing VNC websocket port domain does not own qemu: cleanup code to release VNC websocket port qemu: cleanup code to relece SPICE ports src/conf/domain_conf.h | 1 + src/qemu/qemu_process.c | 46 ++++++++++++++++++----------------------- 2 files changed, 21 insertions(+), 26 deletions(-) -- 2.35.1

Code to release VNC port looks repetitive. The reason is there were originally 2 functions to release ports - for auto and non-auto cases. Also portReserved flag is not cleared on stop in case of reconnect with auto port (flags is set on reconnect in qemuProcessGraphicsReservePorts call). Yeah config is freed in the end of stopping domain but still. Let's use this flag whenever we reserve port (auto or not). This makes things clearer. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@openvz.org> --- src/qemu/qemu_process.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 2e11d24be2..cae87cdeca 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3994,6 +3994,7 @@ qemuProcessVNCAllocatePorts(virQEMUDriver *driver, if (virPortAllocatorAcquire(driver->remotePorts, &port) < 0) return -1; graphics->data.vnc.port = port; + graphics->data.vnc.portReserved = true; } if (graphics->data.vnc.websocket == -1) { @@ -8261,9 +8262,7 @@ void qemuProcessStop(virQEMUDriver *driver, for (i = 0; i < vm->def->ngraphics; ++i) { virDomainGraphicsDef *graphics = vm->def->graphics[i]; if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) { - if (graphics->data.vnc.autoport) { - virPortAllocatorRelease(graphics->data.vnc.port); - } else if (graphics->data.vnc.portReserved) { + if (graphics->data.vnc.portReserved) { virPortAllocatorRelease(graphics->data.vnc.port); graphics->data.vnc.portReserved = false; } -- 2.35.1

Scenario is with two domains with same VNC websocket port. - start first domain - start second, it will fail as port is occupied As a result port will be released which breaks port reservation logic. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@openvz.org> --- src/conf/domain_conf.h | 1 + src/qemu/qemu_process.c | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 694491cd63..88a411d00c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1901,6 +1901,7 @@ struct _virDomainGraphicsDef { bool portReserved; int websocket; bool websocketGenerated; + bool websocketReserved; bool autoport; char *keymap; virDomainGraphicsAuthDef auth; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index cae87cdeca..9c7583a10b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4678,9 +4678,11 @@ qemuProcessGraphicsReservePorts(virDomainGraphicsDef *graphics, return -1; graphics->data.vnc.portReserved = true; } - if (graphics->data.vnc.websocket > 0 && - virPortAllocatorSetUsed(graphics->data.vnc.websocket) < 0) - return -1; + if (graphics->data.vnc.websocket > 0) { + if (virPortAllocatorSetUsed(graphics->data.vnc.websocket) < 0) + return -1; + graphics->data.vnc.websocketReserved = true; + } break; case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: @@ -8270,7 +8272,7 @@ void qemuProcessStop(virQEMUDriver *driver, virPortAllocatorRelease(graphics->data.vnc.websocket); graphics->data.vnc.websocketGenerated = false; graphics->data.vnc.websocket = -1; - } else if (graphics->data.vnc.websocket) { + } else if (graphics->data.vnc.websocketReserved) { virPortAllocatorRelease(graphics->data.vnc.websocket); } } -- 2.35.1

VNC websocket port cleanup looks a bit repetetive. Let's set websocketReserved flag whenever we reserve port (auto or not). Also websocketReserved flag is not cleared on stop in case of reconnect with auto port (flags is set on reconnect in qemuProcessGraphicsReservePorts call). Yeah config is freed in the end of stopping domain but still. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@openvz.org> --- src/qemu/qemu_process.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9c7583a10b..6db8bbc421 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4002,6 +4002,7 @@ qemuProcessVNCAllocatePorts(virQEMUDriver *driver, return -1; graphics->data.vnc.websocket = port; graphics->data.vnc.websocketGenerated = true; + graphics->data.vnc.websocketReserved = true; } return 0; @@ -8268,12 +8269,13 @@ void qemuProcessStop(virQEMUDriver *driver, virPortAllocatorRelease(graphics->data.vnc.port); graphics->data.vnc.portReserved = false; } - if (graphics->data.vnc.websocketGenerated) { + if (graphics->data.vnc.websocketReserved) { virPortAllocatorRelease(graphics->data.vnc.websocket); + graphics->data.vnc.websocketReserved = false; + } + if (graphics->data.vnc.websocketGenerated) { graphics->data.vnc.websocketGenerated = false; graphics->data.vnc.websocket = -1; - } else if (graphics->data.vnc.websocketReserved) { - virPortAllocatorRelease(graphics->data.vnc.websocket); } } if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { -- 2.35.1

SPICE ports cleanup looks overly complicated. We can just set *reserved flags whenever port is reserved (auto or non auto). Also *Reserved flags are not cleared on stop in case of reconnect with autoport (flags are set on reconnect in qemuProcessGraphicsReservePorts call). Yeah config is freed in the end of stopping domain but still. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@openvz.org> --- src/qemu/qemu_process.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 6db8bbc421..08a38edfb6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4071,9 +4071,7 @@ qemuProcessSPICEAllocatePorts(virQEMUDriver *driver, return -1; graphics->data.spice.port = port; - - if (!graphics->data.spice.autoport) - graphics->data.spice.portReserved = true; + graphics->data.spice.portReserved = true; } if (needTLSPort || graphics->data.spice.tlsPort == -1) { @@ -4088,9 +4086,7 @@ qemuProcessSPICEAllocatePorts(virQEMUDriver *driver, return -1; graphics->data.spice.tlsPort = tlsPort; - - if (!graphics->data.spice.autoport) - graphics->data.spice.tlsPortReserved = true; + graphics->data.spice.tlsPortReserved = true; } return 0; @@ -8279,19 +8275,14 @@ void qemuProcessStop(virQEMUDriver *driver, } } if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { - if (graphics->data.spice.autoport) { + if (graphics->data.spice.portReserved) { virPortAllocatorRelease(graphics->data.spice.port); - virPortAllocatorRelease(graphics->data.spice.tlsPort); - } else { - if (graphics->data.spice.portReserved) { - virPortAllocatorRelease(graphics->data.spice.port); - graphics->data.spice.portReserved = false; - } + graphics->data.spice.portReserved = false; + } - if (graphics->data.spice.tlsPortReserved) { - virPortAllocatorRelease(graphics->data.spice.tlsPort); - graphics->data.spice.tlsPortReserved = false; - } + if (graphics->data.spice.tlsPortReserved) { + virPortAllocatorRelease(graphics->data.spice.tlsPort); + graphics->data.spice.tlsPortReserved = false; } } } -- 2.35.1

On Tue, Apr 12, 2022 at 10:31:26AM +0300, Nikolay Shirokovskiy wrote:
Nikolay Shirokovskiy (4): qemu: cleanup code to release VNC port qemu: fix releasing VNC websocket port domain does not own qemu: cleanup code to release VNC websocket port qemu: cleanup code to relece SPICE ports
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/conf/domain_conf.h | 1 + src/qemu/qemu_process.c | 46 ++++++++++++++++++----------------------- 2 files changed, 21 insertions(+), 26 deletions(-)
-- 2.35.1
participants (2)
-
Martin Kletzander
-
Nikolay Shirokovskiy