Commit 7fb4f392 authored by Konstantin Ozerkov's avatar Konstantin Ozerkov Committed by Takashi Iwai

ALSA: intel8x0: improve virtual environment detection

Detection code improved by PCI SSID usage. VM optimization
now enabled only for known devcices (skip host devices forwarded
to VM by VT-d or same kind of technology).
For debug/troubleshooting purposes optimization can be
forced (on/off) by module parameter: "inside_vm" (boolean).

Known devices (PCI SSID):
1af4:1100: Reserved for KVM devices. Note this is not yet
           implemented for KVM's ICH/AC'97 emulation.
1ab8:xxxx: Parallels ICH/AC'97 emulated sound.

[ fixed a minor coding-style issue by tiwai]
Signed-off-by: default avatarKonstantin Ozerkov <kozerkov@parallels.com>
Signed-off-by: default avatarDenis V. Lunev <den@openvz.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 65c397d6
...@@ -2937,20 +2937,41 @@ static unsigned int sis_codec_bits[3] = { ...@@ -2937,20 +2937,41 @@ static unsigned int sis_codec_bits[3] = {
ICH_PCR, ICH_SCR, ICH_SIS_TCR ICH_PCR, ICH_SCR, ICH_SIS_TCR
}; };
static int __devinit snd_intel8x0_inside_vm(void) static int __devinit snd_intel8x0_inside_vm(struct pci_dev *pci)
{ {
int result = inside_vm; int result = inside_vm;
char *msg = NULL;
if (result < 0) { /* check module parameter first (override detection) */
/* detect KVM and Parallels virtual environments */ if (result >= 0) {
result = kvm_para_available(); msg = result ? "enable (forced) VM" : "disable (forced) VM";
#if defined(__i386__) || defined(__x86_64__) goto fini;
result = result || boot_cpu_has(X86_FEATURE_HYPERVISOR); }
/* detect KVM and Parallels virtual environments */
result = kvm_para_available();
#ifdef X86_FEATURE_HYPERVISOR
result = result || boot_cpu_has(X86_FEATURE_HYPERVISOR);
#endif #endif
if (!result)
goto fini;
/* check for known (emulated) devices */
if (pci->subsystem_vendor == 0x1af4 &&
pci->subsystem_device == 0x1100) {
/* KVM emulated sound, PCI SSID: 1af4:1100 */
msg = "enable KVM";
} else if (pci->subsystem_vendor == 0x1ab8) {
/* Parallels VM emulated sound, PCI SSID: 1ab8:xxxx */
msg = "enable Parallels VM";
} else {
msg = "disable (unknown or VT-d) VM";
result = 0;
} }
if (result) fini:
printk(KERN_INFO "intel8x0: enable KVM optimization\n"); if (msg != NULL)
printk(KERN_INFO "intel8x0: %s optimization\n", msg);
return result; return result;
} }
...@@ -3022,7 +3043,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card, ...@@ -3022,7 +3043,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,
if (xbox) if (xbox)
chip->xbox = 1; chip->xbox = 1;
chip->inside_vm = snd_intel8x0_inside_vm(); chip->inside_vm = snd_intel8x0_inside_vm(pci);
if (pci->vendor == PCI_VENDOR_ID_INTEL && if (pci->vendor == PCI_VENDOR_ID_INTEL &&
pci->device == PCI_DEVICE_ID_INTEL_440MX) pci->device == PCI_DEVICE_ID_INTEL_440MX)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment