qemu: Honour 'virtlogd' use when hotplugging chardevs

Setup the chardev similarly to how we do it on startup so that virtlogd
is properly used with chardevs which are hotplugged to a VM.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2022-02-09 15:43:03 +01:00
parent d86bfa631e
commit ad81aa8ad0
5 changed files with 36 additions and 7 deletions

View File

@ -6730,8 +6730,7 @@ qemuDomainAttachDeviceLive(virDomainObj *vm,
break; break;
case VIR_DOMAIN_DEVICE_CHR: case VIR_DOMAIN_DEVICE_CHR:
ret = qemuDomainAttachChrDevice(driver, vm, ret = qemuDomainAttachChrDevice(driver, vm, dev);
dev->data.chr);
if (!ret) { if (!ret) {
alias = dev->data.chr->info.alias; alias = dev->data.chr->info.alias;
dev->data.chr = NULL; dev->data.chr = NULL;

View File

@ -2180,10 +2180,14 @@ qemuDomainAttachChrDeviceAssignAddr(virDomainObj *vm,
return 0; return 0;
} }
int qemuDomainAttachChrDevice(virQEMUDriver *driver,
virDomainObj *vm, int
virDomainChrDef *chr) qemuDomainAttachChrDevice(virQEMUDriver *driver,
virDomainObj *vm,
virDomainDeviceDef *dev)
{ {
virDomainChrDef *chr = dev->data.chr;
qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chr->source);
int ret = -1; int ret = -1;
qemuDomainObjPrivate *priv = vm->privateData; qemuDomainObjPrivate *priv = vm->privateData;
virErrorPtr orig_err; virErrorPtr orig_err;
@ -2224,6 +2228,19 @@ int qemuDomainAttachChrDevice(virQEMUDriver *driver,
goto cleanup; goto cleanup;
teardowncgroup = true; teardowncgroup = true;
if (qemuProcessPrepareHostBackendChardevHotplug(vm, dev) < 0)
goto cleanup;
if (charpriv->sourcefd || charpriv->logfd) {
qemuDomainObjEnterMonitor(driver, vm);
if (qemuFDPassTransferMonitor(charpriv->sourcefd, priv->mon) < 0 ||
qemuFDPassTransferMonitor(charpriv->logfd, priv->mon) < 0)
goto exit_monitor;
qemuDomainObjExitMonitor(driver, vm);
}
if (guestfwd) { if (guestfwd) {
if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(chr))) if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(chr)))
goto cleanup; goto cleanup;
@ -2286,6 +2303,8 @@ int qemuDomainAttachChrDevice(virQEMUDriver *driver,
/* detach associated chardev on error */ /* detach associated chardev on error */
if (chardevAttached) if (chardevAttached)
qemuMonitorDetachCharDev(priv->mon, charAlias); qemuMonitorDetachCharDev(priv->mon, charAlias);
qemuFDPassTransferMonitorRollback(charpriv->sourcefd, priv->mon);
qemuFDPassTransferMonitorRollback(charpriv->logfd, priv->mon);
qemuDomainObjExitMonitor(driver, vm); qemuDomainObjExitMonitor(driver, vm);
virErrorRestore(&orig_err); virErrorRestore(&orig_err);

View File

@ -117,7 +117,7 @@ int qemuDomainAttachLease(virQEMUDriver *driver,
virDomainLeaseDef *lease); virDomainLeaseDef *lease);
int qemuDomainAttachChrDevice(virQEMUDriver *driver, int qemuDomainAttachChrDevice(virQEMUDriver *driver,
virDomainObj *vm, virDomainObj *vm,
virDomainChrDef *chr); virDomainDeviceDef *dev);
int qemuDomainAttachRNGDevice(virQEMUDriver *driver, int qemuDomainAttachRNGDevice(virQEMUDriver *driver,
virDomainObj *vm, virDomainObj *vm,
virDomainRNGDef *rng); virDomainRNGDef *rng);

View File

@ -21,6 +21,7 @@
#include "qemu/qemu_hotplug.h" #include "qemu/qemu_hotplug.h"
#include "qemu/qemu_interface.h" #include "qemu/qemu_interface.h"
#include "qemu/qemu_process.h" #include "qemu/qemu_process.h"
#include "testutilsqemu.h"
#include "conf/domain_conf.h" #include "conf/domain_conf.h"
#include "virdevmapper.h" #include "virdevmapper.h"
#include "virutil.h" #include "virutil.h"
@ -96,3 +97,13 @@ qemuInterfaceVDPAConnect(virDomainNetDef *net G_GNUC_UNUSED)
/* need a valid fd or sendmsg won't work. Just open /dev/null */ /* need a valid fd or sendmsg won't work. Just open /dev/null */
return open("/dev/null", O_RDONLY); return open("/dev/null", O_RDONLY);
} }
int
qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm,
virDomainDeviceDef *dev)
{
return qemuDomainDeviceBackendChardevForeachOne(dev,
testQemuPrepareHostBackendChardevOne,
vm);
}

View File

@ -135,7 +135,7 @@ testQemuHotplugAttach(virDomainObj *vm,
ret = qemuDomainAttachDeviceDiskLive(&driver, vm, dev); ret = qemuDomainAttachDeviceDiskLive(&driver, vm, dev);
break; break;
case VIR_DOMAIN_DEVICE_CHR: case VIR_DOMAIN_DEVICE_CHR:
ret = qemuDomainAttachChrDevice(&driver, vm, dev->data.chr); ret = qemuDomainAttachChrDevice(&driver, vm, dev);
break; break;
case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_SHMEM:
ret = qemuDomainAttachShmemDevice(&driver, vm, dev->data.shmem); ret = qemuDomainAttachShmemDevice(&driver, vm, dev->data.shmem);