From 5f046e9a0ccc3073db35ec8a7dc2d9c1f74498cd Mon Sep 17 00:00:00 2001 From: Ruoqing He Date: Thu, 24 Oct 2024 15:14:26 +0800 Subject: [PATCH 1/2] deps: Update kvm-bindings and kvm-ioctls Update kvm-bindings from 0.7.0 to 0.10.0. Update kvm-ioctls from 0.16.0 to 0.19.0. Signed-off-by: Ruoqing He --- Cargo.lock | 8 ++++---- boot_loader/Cargo.toml | 2 +- cpu/Cargo.toml | 2 +- hypervisor/Cargo.toml | 4 ++-- migration/Cargo.toml | 2 +- util/Cargo.toml | 2 +- vfio/Cargo.toml | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36c8f8418..dd77c052c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -839,18 +839,18 @@ dependencies = [ [[package]] name = "kvm-bindings" -version = "0.7.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081fbd8164229a990fbf24a1f35d287740db110c2b5d42addf460165f1b0e032" +checksum = "fa4933174d0cc4b77b958578cd45784071cc5ae212c2d78fbd755aaaa6dfa71a" dependencies = [ "vmm-sys-util", ] [[package]] name = "kvm-ioctls" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9002dff009755414f22b962ec6ae6980b07d6d8b06e5297b1062019d72bd6a8c" +checksum = "337d1afa126368bbd6a5c328048f71a69a737e9afe7e436b392a8f8d770c9171" dependencies = [ "bitflags 2.5.0", "kvm-bindings", diff --git a/boot_loader/Cargo.toml b/boot_loader/Cargo.toml index e2c9c45f6..cbd22873f 100644 --- a/boot_loader/Cargo.toml +++ b/boot_loader/Cargo.toml @@ -8,7 +8,7 @@ license = "Mulan PSL v2" [dependencies] thiserror = "1.0" anyhow = "1.0" -kvm-bindings = { version = "0.7.0", features = ["fam-wrappers"] } +kvm-bindings = { version = "0.10.0", features = ["fam-wrappers"] } log = "0.4" address_space = { path = "../address_space" } devices = { path = "../devices" } diff --git a/cpu/Cargo.toml b/cpu/Cargo.toml index 57e4d7e26..1be3d7b8c 100644 --- a/cpu/Cargo.toml +++ b/cpu/Cargo.toml @@ -9,7 +9,7 @@ description = "CPU emulation" [dependencies] thiserror = "1.0" anyhow = "1.0" -kvm-bindings = { version = "0.7.0", features = ["fam-wrappers"] } +kvm-bindings = { version = "0.10.0", features = ["fam-wrappers"] } nix = { version = "0.26.2", default-features = false, features = ["fs", "feature"] } log = "0.4" libc = "0.2" diff --git a/hypervisor/Cargo.toml b/hypervisor/Cargo.toml index 44308ef49..36f297f8c 100644 --- a/hypervisor/Cargo.toml +++ b/hypervisor/Cargo.toml @@ -8,8 +8,8 @@ license = "Mulan PSL v2" [dependencies] anyhow = "1.0" thiserror = "1.0" -kvm-bindings = { version = "0.7.0", features = ["fam-wrappers"] } -kvm-ioctls = "0.16.0" +kvm-bindings = { version = "0.10.0", features = ["fam-wrappers"] } +kvm-ioctls = "0.19.0" libc = "0.2" log = "0.4" vmm-sys-util = "0.12.1" diff --git a/migration/Cargo.toml b/migration/Cargo.toml index f0d10681b..ecbf66a4e 100644 --- a/migration/Cargo.toml +++ b/migration/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Huawei StratoVirt Team"] edition = "2021" [dependencies] -kvm-ioctls = "0.16.0" +kvm-ioctls = "0.19.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" once_cell = "1.18.0" diff --git a/util/Cargo.toml b/util/Cargo.toml index 806fe935e..771512681 100644 --- a/util/Cargo.toml +++ b/util/Cargo.toml @@ -11,7 +11,7 @@ license = "Mulan PSL v2" arc-swap = "1.6.0" thiserror = "1.0" anyhow = "1.0" -kvm-bindings = { version = "0.7.0", features = ["fam-wrappers"] } +kvm-bindings = { version = "0.10.0", features = ["fam-wrappers"] } nix = { version = "0.26.2", default-features = false, features = ["poll", "term", "time", "signal", "fs", "feature"] } libc = "0.2" libloading = "0.7.4" diff --git a/vfio/Cargo.toml b/vfio/Cargo.toml index 6b3e135ad..218407980 100644 --- a/vfio/Cargo.toml +++ b/vfio/Cargo.toml @@ -10,8 +10,8 @@ description = "Virtual function I/O" byteorder = "1.4.3" thiserror = "1.0" anyhow = "1.0" -kvm-bindings = { version = "0.7.0", features = ["fam-wrappers"] } -kvm-ioctls = "0.16.0" +kvm-bindings = { version = "0.10.0", features = ["fam-wrappers"] } +kvm-ioctls = "0.19.0" libc = "0.2" log = "0.4" vmm-sys-util = "0.12.1" -- Gitee From 6de2cbab11ed708d34e27454868a757627534102 Mon Sep 17 00:00:00 2001 From: Ruoqing He Date: Thu, 24 Oct 2024 15:14:26 +0800 Subject: [PATCH 2/2] hypervisor: Wrap VcpuFd with Mutex The interface changed since 0.19.0 kvm-ioctls, `run` method on `VcpuFd` now requires a mutable reference which breaks the code. Wrapping `VcpuFd` behind `Arc` with `Mutex` to fix the broken build. Signed-off-by: Ruoqing He --- hypervisor/src/kvm/aarch64/mod.rs | 6 ++- hypervisor/src/kvm/mod.rs | 16 ++++---- hypervisor/src/kvm/x86_64/mod.rs | 66 ++++++++++++++++++++++++++----- 3 files changed, 68 insertions(+), 20 deletions(-) diff --git a/hypervisor/src/kvm/aarch64/mod.rs b/hypervisor/src/kvm/aarch64/mod.rs index 7e42f61a6..985b37ffe 100644 --- a/hypervisor/src/kvm/aarch64/mod.rs +++ b/hypervisor/src/kvm/aarch64/mod.rs @@ -77,8 +77,10 @@ impl KvmDevice { .with_context(|| "Failed to set device attributes.")?; } else { let mut attr = attr; - fd.get_device_attr(&mut attr) - .with_context(|| "Failed to get device attributes.")?; + unsafe { + fd.get_device_attr(&mut attr) + .with_context(|| "Failed to get device attributes.")? + }; }; Ok(()) diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index 16e7a479a..ae5a1cf61 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -367,7 +367,7 @@ pub struct KvmCpu { id: u8, #[cfg(target_arch = "aarch64")] vm_fd: Option>, - fd: Arc, + fd: Arc>, /// The capability of VCPU. caps: CPUCaps, #[cfg(target_arch = "aarch64")] @@ -385,7 +385,7 @@ impl KvmCpu { id, #[cfg(target_arch = "aarch64")] vm_fd, - fd: Arc::new(vcpu_fd), + fd: Arc::new(Mutex::new(vcpu_fd)), caps: CPUCaps::init_capabilities(), #[cfg(target_arch = "aarch64")] kvi: Mutex::new(kvm_vcpu_init::default()), @@ -415,7 +415,7 @@ impl KvmCpu { .upgrade() .with_context(|| CpuError::NoMachineInterface)?; - match self.fd.run() { + match self.fd.lock().unwrap().run() { Ok(run) => { trace::kvm_vcpu_run_exit(cpu.id, &run); match run { @@ -499,7 +499,7 @@ impl KvmCpu { match e.errno() { libc::EAGAIN => {} libc::EINTR => { - self.fd.set_kvm_immediate_exit(0); + self.fd.lock().unwrap().set_kvm_immediate_exit(0); } _ => { return Err(anyhow!(CpuError::UnhandledHypervisorExit( @@ -631,7 +631,7 @@ impl CPUHypervisorOps for KvmCpu { } fn set_hypervisor_exit(&self) -> Result<()> { - self.fd.set_kvm_immediate_exit(1); + self.fd.lock().unwrap().set_kvm_immediate_exit(1); Ok(()) } @@ -1077,7 +1077,7 @@ mod test { // test setup special registers let cpu_caps = CPUCaps::init_capabilities(); assert!(hypervisor_cpu.put_register(Arc::new(cpu)).is_ok()); - let x86_sregs = hypervisor_cpu.fd.get_sregs().unwrap(); + let x86_sregs = hypervisor_cpu.fd.lock().unwrap().get_sregs().unwrap(); assert_eq!(x86_sregs.cs, code_seg); assert_eq!(x86_sregs.ds, data_seg); assert_eq!(x86_sregs.es, data_seg); @@ -1095,7 +1095,7 @@ mod test { assert_eq!((x86_sregs.efer & 0x700) >> 8, 5); // test setup_regs function - let x86_regs = hypervisor_cpu.fd.get_regs().unwrap(); + let x86_regs = hypervisor_cpu.fd.lock().unwrap().get_regs().unwrap(); assert_eq!(x86_regs.rflags, 0x0002); assert_eq!(x86_regs.rip, 0); assert_eq!(x86_regs.rsp, 0); @@ -1104,7 +1104,7 @@ mod test { // test setup_fpu function if !cpu_caps.has_xsave { - let x86_fpu = hypervisor_cpu.fd.get_fpu().unwrap(); + let x86_fpu = hypervisor_cpu.fd.lock().unwrap().get_fpu().unwrap(); assert_eq!(x86_fpu.fcw, 0x37f); } } diff --git a/hypervisor/src/kvm/x86_64/mod.rs b/hypervisor/src/kvm/x86_64/mod.rs index 7d7e7b581..2621f7cc0 100644 --- a/hypervisor/src/kvm/x86_64/mod.rs +++ b/hypervisor/src/kvm/x86_64/mod.rs @@ -90,12 +90,16 @@ impl KvmCpu { let apic_id = locked_arch_cpu.apic_id; let lapic = self .fd + .lock() + .unwrap() .get_lapic() .with_context(|| format!("Failed to get lapic for CPU {}/KVM", apic_id))?; locked_arch_cpu.setup_lapic(lapic)?; locked_arch_cpu.setup_regs(boot_config); let sregs = self .fd + .lock() + .unwrap() .get_sregs() .with_context(|| format!("Failed to get sregs for CPU {}/KVM", apic_id))?; locked_arch_cpu.setup_sregs(sregs, boot_config)?; @@ -118,29 +122,29 @@ impl KvmCpu { let mut locked_arch_cpu = arch_cpu.lock().unwrap(); match regs_index { RegsIndex::Regs => { - locked_arch_cpu.regs = self.fd.get_regs()?; + locked_arch_cpu.regs = self.fd.lock().unwrap().get_regs()?; trace::kvm_get_regs(self.id, &locked_arch_cpu.regs); } RegsIndex::Sregs => { - locked_arch_cpu.sregs = self.fd.get_sregs()?; + locked_arch_cpu.sregs = self.fd.lock().unwrap().get_sregs()?; trace::kvm_get_sregs(self.id, &locked_arch_cpu.sregs); } RegsIndex::Fpu => { if !self.caps.has_xsave { - locked_arch_cpu.fpu = self.fd.get_fpu()?; + locked_arch_cpu.fpu = self.fd.lock().unwrap().get_fpu()?; trace::kvm_get_fpu(self.id, &locked_arch_cpu.fpu); } } RegsIndex::MpState => { - locked_arch_cpu.mp_state = self.fd.get_mp_state()?; + locked_arch_cpu.mp_state = self.fd.lock().unwrap().get_mp_state()?; trace::kvm_get_mp_state(self.id, &locked_arch_cpu.mp_state); } RegsIndex::LapicState => { - locked_arch_cpu.lapic = self.fd.get_lapic()?; + locked_arch_cpu.lapic = self.fd.lock().unwrap().get_lapic()?; trace::kvm_get_lapic(self.id, &locked_arch_cpu.lapic); } RegsIndex::MsrEntry => { - locked_arch_cpu.msr_len = self.fd.get_msrs(&mut msr_entries)?; + locked_arch_cpu.msr_len = self.fd.lock().unwrap().get_msrs(&mut msr_entries)?; for (i, entry) in msr_entries.as_slice().iter().enumerate() { locked_arch_cpu.msr_list[i] = *entry; } @@ -150,23 +154,23 @@ impl KvmCpu { ); } RegsIndex::VcpuEvents => { - locked_arch_cpu.cpu_events = self.fd.get_vcpu_events()?; + locked_arch_cpu.cpu_events = self.fd.lock().unwrap().get_vcpu_events()?; trace::kvm_get_vcpu_events(self.id, &locked_arch_cpu.cpu_events); } RegsIndex::Xsave => { if self.caps.has_xsave { - locked_arch_cpu.xsave = self.fd.get_xsave()?; + locked_arch_cpu.xsave = self.fd.lock().unwrap().get_xsave()?; trace::kvm_get_xsave(self.id, &locked_arch_cpu.xsave); } } RegsIndex::Xcrs => { if self.caps.has_xcrs { - locked_arch_cpu.xcrs = self.fd.get_xcrs()?; + locked_arch_cpu.xcrs = self.fd.lock().unwrap().get_xcrs()?; trace::kvm_get_xcrs(self.id, &locked_arch_cpu.xcrs); } } RegsIndex::DebugRegs => { - locked_arch_cpu.debugregs = self.fd.get_debug_regs()?; + locked_arch_cpu.debugregs = self.fd.lock().unwrap().get_debug_regs()?; trace::kvm_get_debug_regs(self.id, &locked_arch_cpu.debugregs); } } @@ -185,30 +189,40 @@ impl KvmCpu { RegsIndex::Regs => { trace::kvm_set_regs(self.id, &locked_arch_cpu.regs); self.fd + .lock() + .unwrap() .set_regs(&locked_arch_cpu.regs) .with_context(|| format!("Failed to set regs for CPU {}", apic_id))?; } RegsIndex::Sregs => { trace::kvm_set_sregs(self.id, &locked_arch_cpu.sregs); self.fd + .lock() + .unwrap() .set_sregs(&locked_arch_cpu.sregs) .with_context(|| format!("Failed to set sregs for CPU {}", apic_id))?; } RegsIndex::Fpu => { trace::kvm_set_fpu(self.id, &locked_arch_cpu.fpu); self.fd + .lock() + .unwrap() .set_fpu(&locked_arch_cpu.fpu) .with_context(|| format!("Failed to set fpu for CPU {}", apic_id))?; } RegsIndex::MpState => { trace::kvm_set_mp_state(self.id, &locked_arch_cpu.mp_state); self.fd + .lock() + .unwrap() .set_mp_state(locked_arch_cpu.mp_state) .with_context(|| format!("Failed to set mpstate for CPU {}", apic_id))?; } RegsIndex::LapicState => { trace::kvm_set_lapic(self.id, &locked_arch_cpu.lapic); self.fd + .lock() + .unwrap() .set_lapic(&locked_arch_cpu.lapic) .with_context(|| format!("Failed to set lapic for CPU {}", apic_id))?; } @@ -218,6 +232,8 @@ impl KvmCpu { &&locked_arch_cpu.msr_list[0..locked_arch_cpu.msr_len], ); self.fd + .lock() + .unwrap() .set_msrs(&Msrs::from_entries( &locked_arch_cpu.msr_list[0..locked_arch_cpu.msr_len], )?) @@ -226,24 +242,32 @@ impl KvmCpu { RegsIndex::VcpuEvents => { trace::kvm_set_vcpu_events(self.id, &locked_arch_cpu.cpu_events); self.fd + .lock() + .unwrap() .set_vcpu_events(&locked_arch_cpu.cpu_events) .with_context(|| format!("Failed to set vcpu events for CPU {}", apic_id))?; } RegsIndex::Xsave => { trace::kvm_set_xsave(self.id, &locked_arch_cpu.xsave); self.fd + .lock() + .unwrap() .set_xsave(&locked_arch_cpu.xsave) .with_context(|| format!("Failed to set xsave for CPU {}", apic_id))?; } RegsIndex::Xcrs => { trace::kvm_set_xcrs(self.id, &locked_arch_cpu.xcrs); self.fd + .lock() + .unwrap() .set_xcrs(&locked_arch_cpu.xcrs) .with_context(|| format!("Failed to set xcrs for CPU {}", apic_id))?; } RegsIndex::DebugRegs => { trace::kvm_set_debug_regs(self.id, &locked_arch_cpu.debugregs); self.fd + .lock() + .unwrap() .set_debug_regs(&locked_arch_cpu.debugregs) .with_context(|| format!("Failed to set debug register for CPU {}", apic_id))?; } @@ -270,53 +294,73 @@ impl KvmCpu { trace::kvm_setup_cpuid(self.id, &cpuid); self.fd + .lock() + .unwrap() .set_cpuid2(&cpuid) .with_context(|| format!("Failed to set cpuid for CPU {}/KVM", apic_id))?; trace::kvm_set_cpuid2(self.id, &cpuid); self.fd + .lock() + .unwrap() .set_mp_state(locked_arch_cpu.mp_state) .with_context(|| format!("Failed to set mpstate for CPU {}", apic_id))?; trace::kvm_set_mp_state(self.id, &locked_arch_cpu.mp_state); self.fd + .lock() + .unwrap() .set_sregs(&locked_arch_cpu.sregs) .with_context(|| format!("Failed to set sregs for CPU {}", apic_id))?; trace::kvm_set_sregs(self.id, &locked_arch_cpu.sregs); self.fd + .lock() + .unwrap() .set_regs(&locked_arch_cpu.regs) .with_context(|| format!("Failed to set regs for CPU {}", apic_id))?; trace::kvm_set_regs(self.id, &locked_arch_cpu.regs); if self.caps.has_xsave { self.fd + .lock() + .unwrap() .set_xsave(&locked_arch_cpu.xsave) .with_context(|| format!("Failed to set xsave for CPU {}", apic_id))?; trace::kvm_set_xsave(self.id, &locked_arch_cpu.xsave); } else { self.fd + .lock() + .unwrap() .set_fpu(&locked_arch_cpu.fpu) .with_context(|| format!("Failed to set fpu for CPU {}", apic_id))?; trace::kvm_set_fpu(self.id, &locked_arch_cpu.fpu); } if self.caps.has_xcrs { self.fd + .lock() + .unwrap() .set_xcrs(&locked_arch_cpu.xcrs) .with_context(|| format!("Failed to set xcrs for CPU {}", apic_id))?; trace::kvm_set_xcrs(self.id, &locked_arch_cpu.xcrs); } self.fd + .lock() + .unwrap() .set_debug_regs(&locked_arch_cpu.debugregs) .with_context(|| format!("Failed to set debug register for CPU {}", apic_id))?; trace::kvm_set_debug_regs(self.id, &locked_arch_cpu.debugregs); self.fd + .lock() + .unwrap() .set_lapic(&locked_arch_cpu.lapic) .with_context(|| format!("Failed to set lapic for CPU {}", apic_id))?; trace::kvm_set_lapic(self.id, &locked_arch_cpu.lapic); self.fd + .lock() + .unwrap() .set_msrs(&Msrs::from_entries( &locked_arch_cpu.msr_list[0..locked_arch_cpu.msr_len], )?) @@ -327,6 +371,8 @@ impl KvmCpu { ); self.fd + .lock() + .unwrap() .set_vcpu_events(&locked_arch_cpu.cpu_events) .with_context(|| format!("Failed to set vcpu events for CPU {}", apic_id))?; trace::kvm_set_vcpu_events(self.id, &locked_arch_cpu.cpu_events); -- Gitee