mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-05 05:45:46 +00:00
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:
parent
d86bfa631e
commit
ad81aa8ad0
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user