qemu: don't strip audio elements with user config present

To support backwards live migration we must strip the default added
audio element, however, we are too aggressive in doing so. We are only
comparing a couple of attributes for equality, so risk stripping config
that was user customized. To improve this we need to a deep comparison
of the audio config.

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2021-11-10 17:58:48 +00:00
parent 557f96d224
commit 9b43ec60af

View File

@ -3507,55 +3507,15 @@ qemuDomainDefSuggestDefaultAudioBackend(virQEMUDriver *driver,
}
static int
qemuDomainDefClearDefaultAudioBackend(virQEMUDriver *driver,
virDomainDef *def)
{
bool addAudio;
int audioBackend;
int audioSDLDriver;
virDomainAudioDef *audio;
if (def->naudios != 1) {
return 0;
}
if (qemuDomainDefSuggestDefaultAudioBackend(driver,
def,
&addAudio,
&audioBackend,
&audioSDLDriver) < 0)
return -1;
if (!addAudio)
return 0;
audio = def->audios[0];
if (audio->type != audioBackend)
return 0;
if (audio->type == VIR_DOMAIN_AUDIO_TYPE_SDL &&
audio->backend.sdl.driver != audioSDLDriver)
return 0;
virDomainAudioDefFree(audio);
g_free(def->audios);
def->naudios = 0;
def->audios = NULL;
return 0;
}
static int
qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver,
virDomainDef *def)
qemuDomainDefCreateDefaultAudioBackend(virQEMUDriver *driver,
virDomainDef *def,
virDomainAudioDef **audioout)
{
bool addAudio;
int audioBackend;
int audioSDLDriver;
if (def->naudios > 0) {
return 0;
}
*audioout = NULL;
if (qemuDomainDefSuggestDefaultAudioBackend(driver,
def,
@ -3570,12 +3530,60 @@ qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver,
audio->type = audioBackend;
audio->id = 1;
if (audioBackend == VIR_DOMAIN_AUDIO_TYPE_SDL)
audio->backend.sdl.driver = audioSDLDriver;
*audioout = audio;
}
return 0;
}
static int
qemuDomainDefClearDefaultAudioBackend(virQEMUDriver *driver,
virDomainDef *def)
{
virDomainAudioDef *audio = NULL;
if (def->naudios != 1) {
return 0;
}
if (qemuDomainDefCreateDefaultAudioBackend(driver, def, &audio) < 0)
return -1;
if (!audio)
return 0;
if (virDomainAudioIsEqual(def->audios[0], audio)) {
virDomainAudioDefFree(def->audios[0]);
g_free(def->audios);
def->naudios = 0;
def->audios = NULL;
}
virDomainAudioDefFree(audio);
return 0;
}
static int
qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver,
virDomainDef *def)
{
virDomainAudioDef *audio;
if (def->naudios > 0) {
return 0;
}
if (qemuDomainDefCreateDefaultAudioBackend(driver, def, &audio) < 0)
return -1;
if (audio) {
def->naudios = 1;
def->audios = g_new0(virDomainAudioDef *, def->naudios);
def->audios[0] = audio;
if (audioBackend == VIR_DOMAIN_AUDIO_TYPE_SDL)
audio->backend.sdl.driver = audioSDLDriver;
}
return 0;