[libvirt] [PATCH 2/5] qemu: simplify graphics port releasing
John Ferlan
jferlan at redhat.com
Tue Jul 17 20:15:19 UTC 2018
On 07/04/2018 07:03 AM, Nikolay Shirokovskiy wrote:
> Originally port allocator have 2 functions to release ports: one
> for for manually reserved ports and one for autoallocated ports. Thus
> a bit complicated code of port releasing. Now we have only one releasing
> function.
But there's a reason for the difference between manually allocated and
automatically allocated. This patch I believe will blur those lines.
Also "technically" it's not 2 functions it's different conditions during
qemuProcessStop which must be handled.
>
> Let's use *reserved flag whenever we manually/automatically allocate
> port so that we can use it later for releasing.
>
> Actually we set *reserved flag on autoallocation already on reconnection,
> which lead to uncleared flag on stop. So this step looks natural.
>
> qemuProcessGraphicsReservePorts is called on reconnect. As a result
> portReserved is set not only for manual ports but autoports too. Now
> due to the way port releasing is written in qemuProcessStop portReserved
> stays set for autoports after domain stop. Now imagine one redefine
>
^^^ This whole commit message is really difficult to read and you seem
to have lost your thought in the last sentence of the last paragraph.
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
> src/conf/domain_conf.h | 1 +
> src/qemu/qemu_process.c | 48 ++++++++++++++++++++++--------------------------
> 2 files changed, 23 insertions(+), 26 deletions(-)
>
NACK without a better explanation as to why this is important.
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 41d2748..1da6b8f 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1610,6 +1610,7 @@ struct _virDomainGraphicsDef {
> int port;
> bool portReserved;
> int websocket;
> + bool websocketReserved;
> bool websocketGenerated;
> bool autoport;
> char *keymap;
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index da5656d..de2e84b 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3628,12 +3628,14 @@ qemuProcessVNCAllocatePorts(virQEMUDriverPtr driver,
> if (virPortAllocatorAcquire(driver->remotePorts, &port) < 0)
> return -1;
> graphics->data.vnc.port = port;
> + graphics->data.vnc.portReserved = true;
Why? "autoport" says acquire some/any port not a specific port. So on
restart we can use anything and it's not a specifically reserved port.
So on reconnect IIUC we don't need to "block" usage of specific ports.
Keeping track of what port number got autoallocated is a different issue
I would think and if that's what you're after, then that would be a
different set of patches, wouldn't it?
> }
>
> if (graphics->data.vnc.websocket == -1) {
Recall from:
struct _virDomainGraphicsDef {
/* Port value discipline:
* Value -1 is legacy syntax indicating that it should be
auto-allocated.
* Value 0 means port wasn't specified in XML at all.
* Positive value is actual port number given in XML.
*/
> if (virPortAllocatorAcquire(driver->webSocketPorts, &port) < 0)
> return -1;
> graphics->data.vnc.websocket = port;
> + graphics->data.vnc.websocketReserved = true;
> graphics->data.vnc.websocketGenerated = true;
So again, why? Not sure I agree - the value was Generated, but not
Reserved ad infinatum.
> }
>
> @@ -3705,9 +3707,7 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver,
> goto cleanup;
>
> graphics->data.spice.port = port;
> -
> - if (!graphics->data.spice.autoport)
> - graphics->data.spice.portReserved = true;
> + graphics->data.spice.portReserved = true;
Same as before - autoport != reserved
> }
>
> if (needTLSPort || graphics->data.spice.tlsPort == -1) {
> @@ -3722,9 +3722,7 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver,
> goto cleanup;
>
> graphics->data.spice.tlsPort = tlsPort;
> -
> - if (!graphics->data.spice.autoport)
> - graphics->data.spice.tlsPortReserved = true;
> + graphics->data.spice.tlsPortReserved = true;
ditto
> }
>
> ret = 0;
> @@ -4328,9 +4326,11 @@ qemuProcessGraphicsReservePorts(virDomainGraphicsDefPtr 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;
This may have some merit, although for websocket, the
!websocketGenerated means the port was reserved so is there a real need?
It's just reverse logic from autoport and portReserved.
> + }
> break;
>
> case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
> @@ -6974,34 +6974,30 @@ void qemuProcessStop(virQEMUDriverPtr driver,
> for (i = 0; i < vm->def->ngraphics; ++i) {
> virDomainGraphicsDefPtr 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;
> }
> +
> + if (graphics->data.vnc.websocketReserved) {
> + virPortAllocatorRelease(graphics->data.vnc.websocket);
> + graphics->data.vnc.websocketReserved = false;
> + }
> +
> if (graphics->data.vnc.websocketGenerated) {
> - virPortAllocatorRelease(graphics->data.vnc.websocket);
> graphics->data.vnc.websocketGenerated = false;
> graphics->data.vnc.websocket = -1;
> - } else if (graphics->data.vnc.websocket) {
> - virPortAllocatorRelease(graphics->data.vnc.websocket);
> }
> }
> if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
> - if (graphics->data.spice.autoport) {
> + if (graphics->data.spice.portReserved) {
> virPortAllocatorRelease(graphics->data.spice.port);
> + graphics->data.spice.portReserved = false;
> + }
> +
> + if (graphics->data.spice.tlsPortReserved) {
> virPortAllocatorRelease(graphics->data.spice.tlsPort);
> - } else {
> - if (graphics->data.spice.portReserved) {
> - virPortAllocatorRelease(graphics->data.spice.port);
> - graphics->data.spice.portReserved = false;
> - }
> -
> - if (graphics->data.spice.tlsPortReserved) {
> - virPortAllocatorRelease(graphics->data.spice.tlsPort);
> - graphics->data.spice.tlsPortReserved = false;
> - }
> + graphics->data.spice.tlsPortReserved = false;
I think the existing code is fine until proven otherwise.
John
> }
> }
> }
>
More information about the libvir-list
mailing list