[alsa-devel] Wierd hack to sound/pci/intel8x0.c
Takashi Iwai
tiwai at suse.de
Sun Nov 6 17:33:57 CET 2011
At Sun, 6 Nov 2011 20:15:01 +0400,
Denis V. Lunev wrote:
>
> On 11/6/11 6:51 PM, Avi Kivity wrote:
> > The recently merged 228cf79376f1 ("ALSA: intel8x0: Improve performance
> > in virtual environment") is hacky and somewhat wrong.
> >
> > First, the detection code
> >
> > + if (inside_vm< 0) {
> > + /* detect KVM and Parallels virtual environments */
> > + inside_vm = kvm_para_available();
> > +#if defined(__i386__) || defined(__x86_64__)
> > + inside_vm = inside_vm ||
> > boot_cpu_has(X86_FEATURE_HYPERVISOR);
> > +#endif
> > + }
> > +
> >
> > is incorrect. It detects that you're running in a guest, but that
> > doesn't imply that the device you're accessing is emulated. It may be a
> > host device assigned to the guest; presumably the optimization you apply
> > doesn't work for real devices.
> >
> > Second, the optimization itself looks fishy:
> >
> > spin_lock(&chip->reg_lock);
> > do {
> > civ = igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV);
> > ptr1 = igetword(chip, ichdev->reg_offset +
> > ichdev->roff_picb);
> > position = ichdev->position;
> > if (ptr1 == 0) {
> > udelay(10);
> > continue;
> > }
> > - if (civ == igetbyte(chip, ichdev->reg_offset +
> > ICH_REG_OFF_CIV)&&
> > - ptr1 == igetword(chip, ichdev->reg_offset +
> > ichdev->roff_picb))
> > + if (civ != igetbyte(chip, ichdev->reg_offset +
> > ICH_REG_OFF_CIV))
> > + continue;
> > + if (chip->inside_vm)
> > + break;
> > + if (ptr1 == igetword(chip, ichdev->reg_offset +
> > ichdev->roff_picb))
> > break;
> > } while (timeout--);
> >
> >
> > Why is the emulated device timing out? Can't the emulation be fixed to
> > behave like real hardware?
> >
> > Last, please copy kvm at vger.kernel.org on such issues.
> >
> The problem is that emulation can not be fixed.
>
> How this is working for real hardware? You get data from real sound card
> register.
> The scheduling is off at the moment thus you can not be re-scheduled.
>
> In the virtual environment the situation is different. Any IO emulation
> is expensive.
> The processor is switched from guest to hypervisor and further to
> emulation process
> takes a lot of time. This time is enough to obtain different value on
> next register read.
> That's why this code is really timed out. Please also note that host
> scheduler also
> plays his games and could schedule out VCPU thread.
>
> The problem could be potentially fixed reducing precision of PICB emulation,
> but this results in lower sound quality.
>
> This kludge has been written this way in order not to break legacy card
> for which we
> do not have an access. The code reading PICB/CIV registers second time
> was added
> to fix issues on unknown for now platform and it looks not possible how
> to find/test
> against this platform now. We have checked Windows drivers written by
> Intel/AMD
> (32/64 bit) and MacOS ones. There is no second reading of CIV/PICB
> inside. We
> hope that this is relay needed only for some rare hadware devices.
>
> The only thing we can is to improve detection code. Suggestions are welcome.
Agreed. If we can know the virtual device for KVM in a better way
(e.g. any specific PCI SSID or such), we can narrow the condition more
safely.
thanks,
Takashi
More information about the Alsa-devel
mailing list