From nobody Thu May 2 15:34:31 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.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 216.205.24.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=1625738588; cv=none; d=zohomail.com; s=zohoarc; b=IFT7vYaUeK4n3aCMlwp6ENZZC1L0n6r3UhQO+uJ6s5jxZMHPD+OoHsyB4QtnJRXu7ll46fiAcUHfHSpPyXqXtkzrC4qlgrnDy9LWUzdZRbkgCJ1/bbK2+jgXGePa+3+uIZ5LtEAzD1dCIMV4gD/yWZOwcVhrJfV3FNsWy3/bbEc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1625738588; h=Content-Type:Content-Transfer-Encoding:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=AxmUQ/cSF46Lb6+v8xlUaxJElA3ttmQeF7twzPQJ0+c=; b=TLPmAWdJbeJem97XV/sPSX6VUdG3HQUqblA8V6G5yx2dbBZToyvBfB8bISclwA/mFy8xPAbEwhDsd2FRZQOvOh/amhO6RmcxjTXCjabJNKMV+H21wSNFxtTUGxjTPUKPjwp3O9yvBjI41xOiA1iWuFmih8Ii0iMEFeoORwcGzkQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.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 [216.205.24.124]) by mx.zohomail.com with SMTPS id 1625738588765408.6481568465048; Thu, 8 Jul 2021 03:03:08 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-379-cuLBd_zqOWuFfUhNvGFtNA-1; Thu, 08 Jul 2021 06:03:06 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5742D1084F54; Thu, 8 Jul 2021 10:03:00 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0C07810016FD; Thu, 8 Jul 2021 10:02:58 +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 ED8DC4EA29; Thu, 8 Jul 2021 10:02:54 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 168A21MP021757 for ; Thu, 8 Jul 2021 06:02:01 -0400 Received: by smtp.corp.redhat.com (Postfix) id 0C9C1E2F4; Thu, 8 Jul 2021 10:02:01 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-113-81.ams2.redhat.com [10.36.113.81]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2F545E2F2; Thu, 8 Jul 2021 10:01:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1625738587; 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:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=AxmUQ/cSF46Lb6+v8xlUaxJElA3ttmQeF7twzPQJ0+c=; b=EbgDzPl7G2JzxCq7lam3qHqSkt9Ak4bbbaUunuadj4GvXG0QweB3Iqg0SFNCXVF4L8UDoh 3aKWrwzGJJAYJxfDy5ox3KDxrP3LkOVVhpCesq/YVNokROorrp7QsseZtzxXpiF2JYPLwY Z7Xiu8YHMgRlRADBLcazDqyZRA/3KNE= X-MC-Unique: cuLBd_zqOWuFfUhNvGFtNA-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH] qemu: remove default audio backend for migratable XML Date: Thu, 8 Jul 2021 11:01:54 +0100 Message-Id: <20210708100154.1453894-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 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.84 on 10.5.11.22 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1625738591028100001 When seeing a guest with a sound device, and no audio backend, we automatically add an audio backend XML element based on the historical QEMU driver behaviour. Unfortunately when we live migrate back to an old libvirt, it may not understand the audio driver type we configured. We thus need to strip the default audio backend when migrating. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/libvirt_private.syms | 1 + src/qemu/qemu_domain.c | 128 ++++++++++++++++++++++++++++++--------- 2 files changed, 101 insertions(+), 28 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 43e6398ae5..cc7533a707 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -226,6 +226,7 @@ virDiskNameParse; virDiskNameToBusDeviceIndex; virDiskNameToIndex; virDomainActualNetDefFree; +virDomainAudioDefFree; virDomainAudioFormatTypeFromString; virDomainAudioFormatTypeToString; virDomainAudioIOCommonIsSet; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 8488f58e09..3af678a283 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3587,18 +3587,19 @@ qemuDomainDefAddImplicitInputDevice(virDomainDef *d= ef) } =20 static int -qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver, - virDomainDef *def) +qemuDomainDefSuggestDefaultAudioBackend(virQEMUDriver *driver, + virDomainDef *def, + bool *addAudio, + int *audioBackend, + int *audioSDLDriver) { size_t i; - bool addAudio =3D false; bool audioPassthrough =3D false; - int audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_NONE; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); =20 - if (def->naudios > 0) { - return 0; - } + *addAudio =3D false; + *audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_NONE; + *audioSDLDriver =3D VIR_DOMAIN_AUDIO_SDL_DRIVER_DEFAULT; =20 for (i =3D 0; i < def->ngraphics; i++) { virDomainGraphicsDef *graph =3D def->graphics[i]; @@ -3609,18 +3610,18 @@ qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *= driver, audioPassthrough =3D true; } else { audioPassthrough =3D false; - audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_NONE; + *audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_NONE; } - addAudio =3D true; + *addAudio =3D true; break; case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: audioPassthrough =3D false; - audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_SPICE; - addAudio =3D true; + *audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_SPICE; + *addAudio =3D true; break; case VIR_DOMAIN_GRAPHICS_TYPE_SDL: audioPassthrough =3D true; - addAudio =3D true; + *addAudio =3D true; break; =20 case VIR_DOMAIN_GRAPHICS_TYPE_RDP: @@ -3639,24 +3640,24 @@ qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *= driver, audioPassthrough =3D true; } else { audioPassthrough =3D false; - audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_NONE; + *audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_NONE; } - addAudio =3D true; + *addAudio =3D true; } =20 - if (addAudio && audioPassthrough) { + if (*addAudio && audioPassthrough) { const char *audioenv =3D g_getenv("QEMU_AUDIO_DRV"); if (audioenv =3D=3D NULL) { - addAudio =3D false; + *addAudio =3D false; } else { /* * QEMU audio driver names are mostly the same as * libvirt XML audio backend names */ if (STREQ(audioenv, "pa")) { - audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_PULSEAUDIO; + *audioBackend =3D VIR_DOMAIN_AUDIO_TYPE_PULSEAUDIO; } else { - if ((audioBackend =3D virDomainAudioTypeTypeFromString(aud= ioenv)) < 0) { + if (((*audioBackend) =3D virDomainAudioTypeTypeFromString(= audioenv)) < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unknown QEMU_AUDIO_DRV setting %s"),= audioenv); return -1; @@ -3664,6 +3665,79 @@ qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *d= river, } } } + + if (*addAudio && *audioBackend =3D=3D VIR_DOMAIN_AUDIO_TYPE_SDL) { + const char *sdldriver =3D g_getenv("SDL_AUDIODRIVER"); + if (sdldriver !=3D NULL && + (((*audioSDLDriver) =3D + virDomainAudioSDLDriverTypeFromString(sdldriver)) <=3D 0)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown SDL_AUDIODRIVER setting %s"), sdldri= ver); + return -1; + } + } + + return 0; +} + +static int +qemuDomainDefClearDefaultAudioBackend(virQEMUDriver *driver, + virDomainDef *def) +{ + bool addAudio; + int audioBackend; + int audioSDLDriver; + virDomainAudioDef *audio; + + if (def->naudios !=3D 1) { + return 0; + } + + if (qemuDomainDefSuggestDefaultAudioBackend(driver, + def, + &addAudio, + &audioBackend, + &audioSDLDriver) < 0) + return -1; + + if (!addAudio) + return 0; + + audio =3D def->audios[0]; + if (audio->type !=3D audioBackend) + return 0; + + if (audio->type =3D=3D VIR_DOMAIN_AUDIO_TYPE_SDL && + audio->backend.sdl.driver !=3D audioSDLDriver) + return 0; + + virDomainAudioDefFree(audio); + g_free(def->audios); + def->naudios =3D 0; + def->audios =3D NULL; + + return 0; +} + +static int +qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver, + virDomainDef *def) +{ + bool addAudio; + int audioBackend; + int audioSDLDriver; + + if (def->naudios > 0) { + return 0; + } + + if (qemuDomainDefSuggestDefaultAudioBackend(driver, + def, + &addAudio, + &audioBackend, + &audioSDLDriver) < 0) + return -1; + if (addAudio) { virDomainAudioDef *audio =3D g_new0(virDomainAudioDef, 1); =20 @@ -3674,16 +3748,8 @@ qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *d= river, def->audios =3D g_new0(virDomainAudioDef *, def->naudios); def->audios[0] =3D audio; =20 - if (audioBackend =3D=3D VIR_DOMAIN_AUDIO_TYPE_SDL) { - const char *sdldriver =3D g_getenv("SDL_AUDIODRIVER"); - if (sdldriver !=3D NULL && - ((audio->backend.sdl.driver =3D - virDomainAudioSDLDriverTypeFromString(sdldriver)) <=3D 0= )) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown SDL_AUDIODRIVER setting %s"), sd= ldriver); - return -1; - } - } + if (audioBackend =3D=3D VIR_DOMAIN_AUDIO_TYPE_SDL) + audio->backend.sdl.driver =3D audioSDLDriver; } =20 return 0; @@ -6298,6 +6364,12 @@ qemuDomainDefFormatBufInternal(virQEMUDriver *driver, =20 if (def->cpu && qemuDomainMakeCPUMigratable(def->cpu) < 0) return -1; + + /* Old libvirt doesn't understand