qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@gmail.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel <qemu-devel@nongnu.org>
Subject: [Qemu-devel] Intel HDA and ALSA audio driver hogging event loop
Date: Thu, 20 Oct 2016 09:40:42 +0100	[thread overview]
Message-ID: <CAJSP0QUSdfBXMwUL4R2TbtSAXr+jaPUOcnhU4WEPf2AyOKygYg@mail.gmail.com> (raw)

Hi Gerd,
A RHEL 7.2 guest sometimes hangs when I play back a wav file on the
Intel HDA emulated sound card using the QEMU ALSA audio driver.

I can only trigger this with the GTK UI but I think that may be a
timing issue.  The GTK UI has a GSource .prepare() function that calls
recvmsg(2) on a non-blocking UNIX domain socket for X11.  I think this
affects the timing and increases the chance of hanging the guest.

Note that this problem occurs both with the default ALSA->PulseAudio
software device and the physical soundcard (PulseAudio disabled on
host):
QEMU_AUDIO_DRV=alsa QEMU_ALSA_DAC_DEV=sysdefault:CARD=PCH
QEMU_ALSA_ADC_DEV=sysdefault:CARD=PCH
x86_64-softmmu/qemu-system-x86_64 -net none -enable-kvm -m 1024 -cpu
host -drive if=virtio,file=test.img,format=raw -soundhw hda

intel_hda_xfer() transfers samples between the emulated card and the
QEMU audio subsystem.  The following case causes a problem:
    if (st->ctl & (1 << 26)) {
        /*
         * Wait with the next DMA xfer until the guest
         * has acked the buffer completion interrupt
         */
        return false;
    }

If the guest hasn't acked the interrupt yet then Intel HDA returns
without providing any samples.  The QEMU ALSA driver keeps monitoring
the file descriptor so the next event loop iteration will try to
transfer samples again.

If the guest hasn't acked the interrupt then the QEMU main loop spins.
Depending on whether the main loop drops the global mutex and how long
it executes for, we can starve the vcpu thread.  The result is that
performance is terrible and the guest appears hung.

I think the QEMU ALSA sound driver should not be monitoring the
playback file descriptor if the emulated sound card decides it needs
to wait for the guest.

Any thoughts on this issue?

Should we add an AUD_plug_out()/AUD_unplug_out() interface to the QEMU
audio subsystem so soundcards can suspend file descriptor monitoring?

Stefan

             reply	other threads:[~2016-10-20  8:40 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-20  8:40 Stefan Hajnoczi [this message]
2016-10-20  9:08 ` [Qemu-devel] Intel HDA and ALSA audio driver hogging event loop P J P
2016-10-20  9:38   ` Stefan Hajnoczi
2016-11-04 10:35 ` Stefan Hajnoczi
2016-11-04 12:55   ` Gerd Hoffmann
2016-11-04 13:01     ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAJSP0QUSdfBXMwUL4R2TbtSAXr+jaPUOcnhU4WEPf2AyOKygYg@mail.gmail.com \
    --to=stefanha@gmail.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).