fix(host): kvm detect and iommu probe (#16245)

- use lsmod check kvm modules on /dev/kvm exist
- don't check grub params "intel_iommu=on" on kvm_intel not loaded

Signed-off-by: wanyaoqi <d3lx.yq@gmail.com>
This commit is contained in:
wanyaoqi
2023-03-16 22:21:10 +08:00
committed by GitHub
parent dd5b3083fd
commit 75b498f4e4
2 changed files with 28 additions and 13 deletions

View File

@@ -34,6 +34,7 @@ import (
"yunion.io/x/onecloud/pkg/util/fileutils2"
"yunion.io/x/onecloud/pkg/util/procutils"
"yunion.io/x/onecloud/pkg/util/regutils2"
"yunion.io/x/onecloud/pkg/util/sysutils"
)
const (
@@ -174,9 +175,11 @@ func (dev *sGPUBaseDevice) CustomProbe(idx int) error {
}
grubCmdline = strings.TrimSpace(grubCmdline)
params := sets.NewString(strings.Split(grubCmdline, " ")...)
if !params.IsSuperset(sets.NewString("intel_iommu=on",
"vfio_iommu_type1.allow_unsafe_interrupts=1")) {
return fmt.Errorf("Some GRUB_CMDLINE iommu parameters are missing")
if !params.IsSuperset(sets.NewString("vfio_iommu_type1.allow_unsafe_interrupts=1")) {
return fmt.Errorf("GRUB_CMDLINE iommu parameters vfio_iommu_type1.allow_unsafe_interrupts=1 missing")
}
if sysutils.IsProcessorIntel() && !params.IsSuperset(sets.NewString("intel_iommu=on")) {
return fmt.Errorf("GRUB_CMDLINE iommu parameters intel_iommu=on missing")
}
isNouveauBlacklisted := false
if params.IsSuperset(sets.NewString("rdblacklist=nouveau", "nouveau.modeset=0")) ||

View File

@@ -82,19 +82,31 @@ func isDevKVMExists() bool {
func detectKVMModuleSupport() string {
var km = KVM_MODULE_UNSUPPORT
if ModprobeKvmModule(KVM_MODULE_INTEL, false, false) {
km = KVM_MODULE_INTEL
} else if ModprobeKvmModule(KVM_MODULE_AMD, false, false) {
km = KVM_MODULE_AMD
} else if ModprobeKvmModule(KVM_MODULE, false, false) {
if isDevKVMExists() {
if isDevKVMExists() {
if IsKernelModuleLoaded(KVM_MODULE_INTEL) {
km = KVM_MODULE_INTEL
} else if IsKernelModuleLoaded(KVM_MODULE_AMD) {
km = KVM_MODULE_AMD
} else if IsKernelModuleLoaded(KVM_MODULE) {
km = KVM_MODULE
}
}
if km == KVM_MODULE_UNSUPPORT {
if isDevKVMExists() {
} else {
km = KVM_MODULE_BUILDIN
}
} else {
if ModprobeKvmModule(KVM_MODULE_INTEL, false, false) {
km = KVM_MODULE_INTEL
} else if ModprobeKvmModule(KVM_MODULE_AMD, false, false) {
km = KVM_MODULE_AMD
} else if ModprobeKvmModule(KVM_MODULE, false, false) {
if isDevKVMExists() {
km = KVM_MODULE
}
}
if km == KVM_MODULE_UNSUPPORT {
if isDevKVMExists() {
km = KVM_MODULE_BUILDIN
}
}
}
return km
}