From nobody Sun Feb 8 22:57:54 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1644422706; cv=none; d=zohomail.com; s=zohoarc; b=cLX41/OFuY86ev3gVOMYHXUE5B/IOXDjZmV7CiHJujvwMhw0AMkVqoRzsVDjXv7I6C57Wu21nwCpkv55oQ8Lq0ToKZeQm0qR3cqnDR4RFQFgcysvAcLPEhHWqyZBPeepNrA380oIxhxvXEL88Robhd5jOqh/tPpJyrKlpwxzF8s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1644422706; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JVOx/GakIblTkr1Moph6GjkXXR/nMSwHIz0x7evkJTE=; b=mmGSPWIWxS7j2Wz2y6Cx+FZGuqSDZGOLH30zYniFCt/VCvXcmLiEbnk/zdjV62RHUxbBZ7ppCNYxdCoGstsIkgz3sXqk9D3dcGMTJfSHizQoH31Wo8tjAnXQK8GxRzIJkRq+qq2cSwly+gIa75oVDnlcQrztqu82hv4HriUfLYE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 16444227066931001.1874893974197; Wed, 9 Feb 2022 08:05:06 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-646-aWW_VzoTNia222gETiZTXw-1; Wed, 09 Feb 2022 11:03:49 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AC1DC86A8C5; Wed, 9 Feb 2022 16:03:14 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6D4C17DE5C; Wed, 9 Feb 2022 16:03:14 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 3828C18218AF; Wed, 9 Feb 2022 16:03:14 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 219G2m91012340 for ; Wed, 9 Feb 2022 11:02:48 -0500 Received: by smtp.corp.redhat.com (Postfix) id 573987DE42; Wed, 9 Feb 2022 16:02:48 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.40.208.41]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8F36B7DE40 for ; Wed, 9 Feb 2022 16:02:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1644422705; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=JVOx/GakIblTkr1Moph6GjkXXR/nMSwHIz0x7evkJTE=; b=Yh+1FyVrsIgPyo3rKnUHl/kNFzaR9uHXR//1Ik9USU8LJsX63wO/n6qt1PcMeKakeyJLaW W6uEWoYlUE5sB4XhKx3jQ0YrBp6bIfIwjUT6bSV17cchMne71/5K6JiPAZRIz7JKZh5M6P kCybL2y172nx/JQeEP4SggE2xOYxvG0= X-MC-Unique: aWW_VzoTNia222gETiZTXw-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 14/27] qemu: Rewrite chardev startup code to use qemuFDPass Date: Wed, 9 Feb 2022 17:02:06 +0100 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1644422708072100003 Content-Type: text/plain; charset="utf-8" Rewrite the parts which already pass FDs via fdset or directly to use the new infrastructure. Apart from simpler code this also adds the appropriate names to the fds in the fdsets which will allow us to properly remove the fdsets won hot-unplug of chardevs, which we didn't do for now and resulted in leaking the FDs. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_command.c | 74 ++++--------------- src/qemu/qemu_domain.c | 11 +-- src/qemu/qemu_domain.h | 8 +- src/qemu/qemu_process.c | 42 +++++++++-- .../qemuxml2argvdata/aarch64-pci-serial.args | 4 +- .../name-escape.x86_64-2.11.0.args | 4 +- .../name-escape.x86_64-latest.args | 4 +- .../qemuxml2argvdata/serial-file-chardev.args | 4 +- .../serial-file-chardev.x86_64-latest.args | 4 +- tests/qemuxml2argvdata/serial-file-log.args | 6 +- .../serial-file-log.x86_64-latest.args | 6 +- .../qemuxml2argvdata/serial-many-chardev.args | 4 +- .../serial-many-chardev.x86_64-latest.args | 4 +- tests/qemuxml2argvtest.c | 56 ++++++++------ 14 files changed, 108 insertions(+), 123 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6667433616..9a51a373b0 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -301,23 +301,6 @@ qemuBuildMasterKeyCommandLine(virCommand *cmd, } -/** - * qemuBuildFDSet: - * @fd: fd to reassign to the child - * @idx: index in the fd set - * - * Format the parameters for the -add-fd command line option - * for the given file descriptor. The file descriptor must previously - * have been 'transferred' in a virCommandPassFDIndex() call, - * and @idx is the value returned by that call. - */ -static char * -qemuBuildFDSet(int fd, size_t idx) -{ - return g_strdup_printf("set=3D%zu,fd=3D%d", idx, fd); -} - - /** * qemuVirCommandGetFDSet: * @cmd: the command to modify @@ -1362,8 +1345,8 @@ qemuBuildChardevStr(const virDomainChrSourceDef *dev, path =3D dev->data.file.path; append =3D dev->data.file.append; - if (chrSourcePriv->fdset) { - path =3D chrSourcePriv->fdset; + if (chrSourcePriv->sourcefd) { + path =3D qemuFDPassGetPath(chrSourcePriv->sourcefd); append =3D VIR_TRISTATE_SWITCH_ON; } @@ -1430,8 +1413,8 @@ qemuBuildChardevStr(const virDomainChrSourceDef *dev, case VIR_DOMAIN_CHR_TYPE_UNIX: virBufferAsprintf(&buf, "socket,id=3D%s", charAlias); - if (chrSourcePriv->passedFD !=3D -1) { - virBufferAsprintf(&buf, ",fd=3D%d", chrSourcePriv->passedFD); + if (chrSourcePriv->sourcefd) { + virBufferAsprintf(&buf, ",fd=3D%s", qemuFDPassGetPath(chrSourc= ePriv->sourcefd)); } else { virBufferAddLit(&buf, ",path=3D"); virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); @@ -1466,8 +1449,8 @@ qemuBuildChardevStr(const virDomainChrSourceDef *dev, path =3D dev->logfile; append =3D dev->logappend; - if (chrSourcePriv->logFdset) { - path =3D chrSourcePriv->logFdset; + if (chrSourcePriv->logfd) { + path =3D qemuFDPassGetPath(chrSourcePriv->logfd); append =3D VIR_TRISTATE_SWITCH_ON; } @@ -1527,28 +1510,8 @@ qemuBuildChardevCommand(virCommand *cmd, break; case VIR_DOMAIN_CHR_TYPE_FILE: - if (chrSourcePriv->fd !=3D -1) { - g_autofree char *fdset =3D NULL; - size_t idx; - - virCommandPassFDIndex(cmd, chrSourcePriv->fd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset =3D qemuBuildFDSet(chrSourcePriv->fd, idx); - chrSourcePriv->fd =3D -1; - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); - - chrSourcePriv->fdset =3D g_strdup_printf("/dev/fdset/%zu", idx= ); - } - break; - case VIR_DOMAIN_CHR_TYPE_UNIX: - if (chrSourcePriv->fd !=3D -1) { - virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_C= LOSE_PARENT); - chrSourcePriv->passedFD =3D chrSourcePriv->fd; - chrSourcePriv->fd =3D -1; - } + qemuFDPassTransferCommand(chrSourcePriv->sourcefd, cmd); break; case VIR_DOMAIN_CHR_TYPE_NULL: @@ -1571,20 +1534,7 @@ qemuBuildChardevCommand(virCommand *cmd, return -1; } - if (chrSourcePriv->logfd !=3D -1) { - g_autofree char *fdset =3D NULL; - size_t idx; - - virCommandPassFDIndex(cmd, chrSourcePriv->logfd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset =3D qemuBuildFDSet(chrSourcePriv->logfd, idx); - chrSourcePriv->logfd =3D -1; - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); - - chrSourcePriv->logFdset =3D g_strdup_printf("/dev/fdset/%zu", idx); - } + qemuFDPassTransferCommand(chrSourcePriv->logfd, cmd); if (!(charstr =3D qemuBuildChardevStr(dev, charAlias))) return -1; @@ -5001,8 +4951,12 @@ qemuBuildVideoCommandLine(virCommand *cmd, qemuDomainChrSourcePrivate *chrsrcpriv =3D QEMU_DOMAIN_CHR_SOU= RCE_PRIVATE(chrsrc); chrsrc->type =3D VIR_DOMAIN_CHR_TYPE_UNIX; - chrsrcpriv->fd =3D videopriv->vhost_user_fd; - videopriv->vhost_user_fd =3D -1; + chrsrcpriv->sourcefd =3D qemuFDPassNew(video->info.alias, priv= , false); + + if (qemuFDPassAddFD(chrsrcpriv->sourcefd, + &videopriv->vhost_user_fd, + "-vhost-user") < 0) + return -1; if (qemuBuildChardevCommand(cmd, chrsrc, chrAlias, priv->qemuC= aps) < 0) return -1; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d0abf76e4a..5483e0720f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -904,11 +904,6 @@ qemuDomainChrSourcePrivateNew(void) if (!(priv =3D virObjectNew(qemuDomainChrSourcePrivateClass))) return NULL; - priv->fd =3D -1; - priv->logfd =3D -1; - - priv->passedFD =3D -1; - return (virObject *) priv; } @@ -918,13 +913,11 @@ qemuDomainChrSourcePrivateDispose(void *obj) { qemuDomainChrSourcePrivate *priv =3D obj; - VIR_FORCE_CLOSE(priv->fd); - VIR_FORCE_CLOSE(priv->logfd); + qemuFDPassFree(priv->sourcefd); + qemuFDPassFree(priv->logfd); g_free(priv->tlsCertPath); - g_free(priv->fdset); - g_free(priv->logFdset); g_free(priv->tlsCredsAlias); g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index b7d0f5d2d5..e9901cb5c3 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -36,6 +36,7 @@ #include "qemu_capabilities.h" #include "qemu_migration_params.h" #include "qemu_slirp.h" +#include "qemu_fd.h" #include "virmdev.h" #include "virchrdev.h" #include "virobject.h" @@ -347,16 +348,13 @@ struct _qemuDomainChrSourcePrivate { * NB: *not* to be written to qemu domain object XML */ qemuDomainSecretInfo *secinfo; - int fd; /* file descriptor of the chardev source */ - int logfd; /* file descriptor of the logging source */ + qemuFDPass *sourcefd; + qemuFDPass *logfd; bool wait; /* wait for incoming connections on chardev */ char *tlsCertPath; /* path to certificates if TLS is requested */ bool tlsVerify; /* whether server should verify client certificates */ - char *fdset; /* fdset path corresponding to the passed filedescriptor = */ - char *logFdset; /* fdset path corresponding to the passed filedescript= or for logfile */ - int passedFD; /* filedescriptor number when fdset passing it directly = */ char *tlsCredsAlias; /* alias of the x509 tls credentials object */ }; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0e17e1bf94..b44e684589 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6809,6 +6809,7 @@ struct qemuProcessPrepareHostBackendChardevData { virLogManager *logManager; virQEMUDriverConfig *cfg; virDomainDef *def; + const char *fdprefix; }; @@ -6819,10 +6820,14 @@ qemuProcessPrepareHostBackendChardevOne(virDomainDe= viceDef *dev, { struct qemuProcessPrepareHostBackendChardevData *data =3D opaque; qemuDomainChrSourcePrivate *charpriv =3D QEMU_DOMAIN_CHR_SOURCE_PRIVAT= E(chardev); + const char *devalias =3D NULL; /* this function is also called for the monitor backend which doesn't = have * a 'dev' */ if (dev) { + virDomainDeviceInfo *info =3D virDomainDeviceGetInfo(dev); + devalias =3D info->alias; + /* vhost-user disk doesn't use FD passing */ if (dev->type =3D=3D VIR_DOMAIN_DEVICE_DISK) return 0; @@ -6836,6 +6841,8 @@ qemuProcessPrepareHostBackendChardevOne(virDomainDevi= ceDef *dev, /* TPMs FD passing setup is special and handled separately */ if (dev->type =3D=3D VIR_DOMAIN_DEVICE_TPM) return 0; + } else { + devalias =3D data->fdprefix; } switch ((virDomainChrType) chardev->type) { @@ -6851,33 +6858,43 @@ qemuProcessPrepareHostBackendChardevOne(virDomainDe= viceDef *dev, case VIR_DOMAIN_CHR_TYPE_SPICEPORT: break; - case VIR_DOMAIN_CHR_TYPE_FILE: + case VIR_DOMAIN_CHR_TYPE_FILE: { + VIR_AUTOCLOSE sourcefd =3D -1; + if (qemuProcessPrepareHostBackendChardevFileHelper(chardev->data.f= ile.path, chardev->data.f= ile.append, - &charpriv->fd, + &sourcefd, data->logManage= r, data->priv->dri= ver->securityManager, data->cfg, data->def) < 0) return -1; + charpriv->sourcefd =3D qemuFDPassNew(devalias, data->priv, true); + + if (qemuFDPassAddFD(charpriv->sourcefd, &sourcefd, "-source") < 0) + return -1; + } break; case VIR_DOMAIN_CHR_TYPE_UNIX: if (chardev->data.nix.listen && virQEMUCapsGet(data->priv->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS= _COMMANDLINE)) { + VIR_AUTOCLOSE sourcefd =3D -1; if (qemuSecuritySetSocketLabel(data->priv->driver->securityMan= ager, data->def) < 0) return -1; - charpriv->fd =3D qemuOpenChrChardevUNIXSocket(chardev); + sourcefd =3D qemuOpenChrChardevUNIXSocket(chardev); - if (qemuSecurityClearSocketLabel(data->priv->driver->securityM= anager, data->def) < 0) { - VIR_FORCE_CLOSE(charpriv->fd); + if (qemuSecurityClearSocketLabel(data->priv->driver->securityM= anager, data->def) < 0 || + sourcefd < 0) return -1; - } - if (charpriv->fd < 0) + /* UNIX socket use direct FD passing */ + charpriv->sourcefd =3D qemuFDPassNew(devalias, data->priv, fal= se); + + if (qemuFDPassAddFD(charpriv->sourcefd, &sourcefd, "-source") = < 0) return -1; } break; @@ -6892,14 +6909,21 @@ qemuProcessPrepareHostBackendChardevOne(virDomainDe= viceDef *dev, } if (chardev->logfile) { + VIR_AUTOCLOSE logfd =3D -1; + if (qemuProcessPrepareHostBackendChardevFileHelper(chardev->logfil= e, chardev->logapp= end, - &charpriv->logf= d, + &logfd, data->logManage= r, data->priv->dri= ver->securityManager, data->cfg, data->def) < 0) return -1; + + charpriv->logfd =3D qemuFDPassNew(devalias, data->priv, true); + + if (qemuFDPassAddFD(charpriv->logfd, &logfd, "-log") < 0) + return -1; } return 0; @@ -6932,6 +6956,8 @@ qemuProcessPrepareHostBackendChardev(virDomainObj *vm) &data) < 0) return -1; + data.fdprefix =3D "monitor"; + if (qemuProcessPrepareHostBackendChardevOne(NULL, priv->monConfig, &da= ta) < 0) return -1; diff --git a/tests/qemuxml2argvdata/aarch64-pci-serial.args b/tests/qemuxml= 2argvdata/aarch64-pci-serial.args index aca88e8e60..e012ea24dd 100644 --- a/tests/qemuxml2argvdata/aarch64-pci-serial.args +++ b/tests/qemuxml2argvdata/aarch64-pci-serial.args @@ -29,7 +29,7 @@ QEMU_AUDIO_DRV=3Dnone \ -device i82801b11-bridge,id=3Dpci.1,bus=3Dpcie.0,addr=3D0x1 \ -device pci-bridge,chassis_nr=3D2,id=3Dpci.2,bus=3Dpci.1,addr=3D0x0 \ -device pcie-root-port,port=3D16,chassis=3D3,id=3Dpci.3,bus=3Dpcie.0,addr= =3D0x2 \ --add-fd set=3D0,fd=3D1751 \ --chardev pty,id=3Dcharserial0,logfile=3D/dev/fdset/0,logappend=3Don \ +-add-fd set=3D1,fd=3D1751,opaque=3Dserial0-log \ +-chardev pty,id=3Dcharserial0,logfile=3D/dev/fdset/1,logappend=3Don \ -device pci-serial,chardev=3Dcharserial0,id=3Dserial0,bus=3Dpci.2,addr=3D0= x1 \ -msg timestamp=3Don diff --git a/tests/qemuxml2argvdata/name-escape.x86_64-2.11.0.args b/tests/= qemuxml2argvdata/name-escape.x86_64-2.11.0.args index 6d4c5bff6e..7f9677abb6 100644 --- a/tests/qemuxml2argvdata/name-escape.x86_64-2.11.0.args +++ b/tests/qemuxml2argvdata/name-escape.x86_64-2.11.0.args @@ -33,8 +33,8 @@ QEMU_AUDIO_DRV=3Dspice \ -device ccid-card-emulated,backend=3Dcertificates,cert1=3Dcert1,,foo,cert2= =3Dcert2,cert3=3Dcert3,db=3D/etc/pki/nssdb,,foo,id=3Dsmartcard0,bus=3Dccid0= .0 \ -chardev tty,id=3Dcharserial0,path=3D/dev/ttyS2,,foo \ -device isa-serial,chardev=3Dcharserial0,id=3Dserial0,index=3D1 \ --add-fd set=3D0,fd=3D1750 \ --chardev file,id=3Dcharserial1,path=3D/dev/fdset/0,append=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial1-source \ +-chardev file,id=3Dcharserial1,path=3D/dev/fdset/1,append=3Don \ -device isa-serial,chardev=3Dcharserial1,id=3Dserial1,index=3D0 \ -chardev pipe,id=3Dcharchannel0,path=3D/tmp/guestfwd,,foo \ -netdev user,guestfwd=3Dtcp:10.0.2.1:4600-chardev:charchannel0,id=3Dchanne= l0 \ diff --git a/tests/qemuxml2argvdata/name-escape.x86_64-latest.args b/tests/= qemuxml2argvdata/name-escape.x86_64-latest.args index 0b3247b6bd..665a016a40 100644 --- a/tests/qemuxml2argvdata/name-escape.x86_64-latest.args +++ b/tests/qemuxml2argvdata/name-escape.x86_64-latest.args @@ -35,8 +35,8 @@ XDG_CONFIG_HOME=3D/tmp/lib/domain--1-foo=3D1,bar=3D2/.con= fig \ -device '{"driver":"ccid-card-emulated","backend":"certificates","cert1":"= cert1,foo","cert2":"cert2","cert3":"cert3","db":"/etc/pki/nssdb,foo","id":"= smartcard0","bus":"ccid0.0"}' \ -chardev tty,id=3Dcharserial0,path=3D/dev/ttyS2,,foo \ -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","in= dex":1}' \ --add-fd set=3D0,fd=3D1750 \ --chardev file,id=3Dcharserial1,path=3D/dev/fdset/0,append=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial1-source \ +-chardev file,id=3Dcharserial1,path=3D/dev/fdset/1,append=3Don \ -device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1","in= dex":0}' \ -chardev pipe,id=3Dcharchannel0,path=3D/tmp/guestfwd,,foo \ -netdev user,guestfwd=3Dtcp:10.0.2.1:4600-chardev:charchannel0,id=3Dchanne= l0 \ diff --git a/tests/qemuxml2argvdata/serial-file-chardev.args b/tests/qemuxm= l2argvdata/serial-file-chardev.args index 7df5c2a115..e4dee0033c 100644 --- a/tests/qemuxml2argvdata/serial-file-chardev.args +++ b/tests/qemuxml2argvdata/serial-file-chardev.args @@ -29,8 +29,8 @@ QEMU_AUDIO_DRV=3Dnone \ -usb \ -drive file=3D/dev/HostVG/QEMUGuest1,format=3Draw,if=3Dnone,id=3Ddrive-ide= 0-0-0 \ -device ide-hd,bus=3Dide.0,unit=3D0,drive=3Ddrive-ide0-0-0,id=3Dide0-0-0,b= ootindex=3D1 \ --add-fd set=3D0,fd=3D1750 \ --chardev file,id=3Dcharserial0,path=3D/dev/fdset/0,append=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial0-source \ +-chardev file,id=3Dcharserial0,path=3D/dev/fdset/1,append=3Don \ -device isa-serial,chardev=3Dcharserial0,id=3Dserial0,index=3D0 \ -device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x2 \ -msg timestamp=3Don diff --git a/tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args = b/tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args index 6a28170503..568a1aaf76 100644 --- a/tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args +++ b/tests/qemuxml2argvdata/serial-file-chardev.x86_64-latest.args @@ -31,8 +31,8 @@ XDG_CONFIG_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.config \ -blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","no= de-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ -blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw= ","file":"libvirt-1-storage"}' \ -device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-form= at","id":"ide0-0-0","bootindex":1}' \ --add-fd set=3D0,fd=3D1750 \ --chardev file,id=3Dcharserial0,path=3D/dev/fdset/0,append=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial0-source \ +-chardev file,id=3Dcharserial0,path=3D/dev/fdset/1,append=3Don \ -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","in= dex":0}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","add= r":"0x2"}' \ diff --git a/tests/qemuxml2argvdata/serial-file-log.args b/tests/qemuxml2ar= gvdata/serial-file-log.args index 72d7c49298..1d237ca7c7 100644 --- a/tests/qemuxml2argvdata/serial-file-log.args +++ b/tests/qemuxml2argvdata/serial-file-log.args @@ -29,8 +29,8 @@ QEMU_AUDIO_DRV=3Dnone \ -usb \ -drive file=3D/dev/HostVG/QEMUGuest1,format=3Draw,if=3Dnone,id=3Ddrive-ide= 0-0-0 \ -device ide-hd,bus=3Dide.0,unit=3D0,drive=3Ddrive-ide0-0-0,id=3Dide0-0-0,b= ootindex=3D1 \ --add-fd set=3D0,fd=3D1750 \ --add-fd set=3D1,fd=3D1751 \ --chardev file,id=3Dcharserial0,path=3D/dev/fdset/0,append=3Don,logfile=3D/= dev/fdset/1,logappend=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial0-source \ +-add-fd set=3D2,fd=3D1751,opaque=3Dserial0-log \ +-chardev file,id=3Dcharserial0,path=3D/dev/fdset/1,append=3Don,logfile=3D/= dev/fdset/2,logappend=3Don \ -device isa-serial,chardev=3Dcharserial0,id=3Dserial0,index=3D0 \ -msg timestamp=3Don diff --git a/tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args b/te= sts/qemuxml2argvdata/serial-file-log.x86_64-latest.args index c12b4b3a60..de47bad812 100644 --- a/tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args +++ b/tests/qemuxml2argvdata/serial-file-log.x86_64-latest.args @@ -31,9 +31,9 @@ XDG_CONFIG_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.config \ -blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","no= de-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ -blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw= ","file":"libvirt-1-storage"}' \ -device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-form= at","id":"ide0-0-0","bootindex":1}' \ --add-fd set=3D0,fd=3D1750 \ --add-fd set=3D1,fd=3D1751 \ --chardev file,id=3Dcharserial0,path=3D/dev/fdset/0,append=3Don,logfile=3D/= dev/fdset/1,logappend=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial0-source \ +-add-fd set=3D2,fd=3D1751,opaque=3Dserial0-log \ +-chardev file,id=3Dcharserial0,path=3D/dev/fdset/1,append=3Don,logfile=3D/= dev/fdset/2,logappend=3Don \ -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","in= dex":0}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ diff --git a/tests/qemuxml2argvdata/serial-many-chardev.args b/tests/qemuxm= l2argvdata/serial-many-chardev.args index 5e80348d11..95a828e606 100644 --- a/tests/qemuxml2argvdata/serial-many-chardev.args +++ b/tests/qemuxml2argvdata/serial-many-chardev.args @@ -31,8 +31,8 @@ QEMU_AUDIO_DRV=3Dnone \ -device ide-hd,bus=3Dide.0,unit=3D0,drive=3Ddrive-ide0-0-0,id=3Dide0-0-0,b= ootindex=3D1 \ -chardev pty,id=3Dcharserial0 \ -device isa-serial,chardev=3Dcharserial0,id=3Dserial0,index=3D0 \ --add-fd set=3D0,fd=3D1750 \ --chardev file,id=3Dcharserial1,path=3D/dev/fdset/0,append=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial1-source \ +-chardev file,id=3Dcharserial1,path=3D/dev/fdset/1,append=3Don \ -device isa-serial,chardev=3Dcharserial1,id=3Dserial1,index=3D1 \ -device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x2 \ -msg timestamp=3Don diff --git a/tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args = b/tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args index cbdcc82052..0e5ebaf9e9 100644 --- a/tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args +++ b/tests/qemuxml2argvdata/serial-many-chardev.x86_64-latest.args @@ -33,8 +33,8 @@ XDG_CONFIG_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.config \ -device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-form= at","id":"ide0-0-0","bootindex":1}' \ -chardev pty,id=3Dcharserial0 \ -device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","in= dex":0}' \ --add-fd set=3D0,fd=3D1750 \ --chardev file,id=3Dcharserial1,path=3D/dev/fdset/0,append=3Don \ +-add-fd set=3D1,fd=3D1750,opaque=3Dserial1-source \ +-chardev file,id=3Dcharserial1,path=3D/dev/fdset/1,append=3Don \ -device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1","in= dex":1}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","add= r":"0x2"}' \ diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index b2d6606d6e..d4e518e3a1 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -383,10 +383,17 @@ testPrepareHostBackendChardevOne(virDomainDeviceDef *= dev, virDomainChrSourceDef *chardev, void *opaque) { - virQEMUCaps *qemuCaps =3D opaque; + virDomainObj *vm =3D opaque; + qemuDomainObjPrivate *priv =3D vm->privateData; qemuDomainChrSourcePrivate *charpriv =3D QEMU_DOMAIN_CHR_SOURCE_PRIVAT= E(chardev); + int fakesourcefd =3D -1; + const char *devalias =3D NULL; + bool usefdset =3D true; if (dev) { + virDomainDeviceInfo *info =3D virDomainDeviceGetInfo(dev); + devalias =3D info->alias; + /* vhost-user disk doesn't use FD passing */ if (dev->type =3D=3D VIR_DOMAIN_DEVICE_DISK) return 0; @@ -400,6 +407,8 @@ testPrepareHostBackendChardevOne(virDomainDeviceDef *de= v, /* TPMs FD passing setup is special and handled separately */ if (dev->type =3D=3D VIR_DOMAIN_DEVICE_TPM) return 0; + } else { + devalias =3D "monitor"; } switch ((virDomainChrType) chardev->type) { @@ -416,20 +425,15 @@ testPrepareHostBackendChardevOne(virDomainDeviceDef *= dev, break; case VIR_DOMAIN_CHR_TYPE_FILE: - if (fcntl(1750, F_GETFD) !=3D -1) - abort(); - charpriv->fd =3D 1750; + fakesourcefd =3D 1750; break; case VIR_DOMAIN_CHR_TYPE_UNIX: if (chardev->data.nix.listen && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLINE= )) { + virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMA= NDLINE)) + fakesourcefd =3D 1729; - if (fcntl(1729, F_GETFD) !=3D -1) - abort(); - - charpriv->fd =3D 1729; - } + usefdset =3D false; break; case VIR_DOMAIN_CHR_TYPE_NMDM: @@ -437,10 +441,26 @@ testPrepareHostBackendChardevOne(virDomainDeviceDef *= dev, break; } + if (fakesourcefd !=3D -1) { + if (fcntl(fakesourcefd, F_GETFD) !=3D -1) + abort(); + + charpriv->sourcefd =3D qemuFDPassNew(devalias, priv, usefdset); + + if (qemuFDPassAddFD(charpriv->sourcefd, &fakesourcefd, "-source") = < 0) + return -1; + } + if (chardev->logfile) { - if (fcntl(1751, F_GETFD) !=3D -1) + int fd =3D 1751; + + if (fcntl(fd, F_GETFD) !=3D -1) abort(); - charpriv->logfd =3D 1751; + + charpriv->logfd =3D qemuFDPassNew(devalias, priv, true); + + if (qemuFDPassAddFD(charpriv->logfd, &fd, "-log") < 0) + return -1; } return 0; @@ -464,17 +484,11 @@ testCompareXMLToArgvCreateArgs(virQEMUDriver *drv, if (qemuDomainDeviceBackendChardevForeach(vm->def, testPrepareHostBackendCharde= vOne, - info->qemuCaps) < 0) + vm) < 0) return NULL; - if (virQEMUCapsGet(info->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS_COMMANDLI= NE)) { - qemuDomainChrSourcePrivate *monpriv =3D QEMU_DOMAIN_CHR_SOURCE_PRI= VATE(priv->monConfig); - - if (fcntl(1729, F_GETFD) !=3D -1) - abort(); - - monpriv->fd =3D 1729; - } + if (testPrepareHostBackendChardevOne(NULL, priv->monConfig, vm) < 0) + return NULL; for (i =3D 0; i < vm->def->ndisks; i++) { virDomainDiskDef *disk =3D vm->def->disks[i]; --=20 2.34.1