stratovirt/0003-hypervisor-kvm-Fix-setting-core-reg-error-when-resto.patch
frankyj915 b3a85c9741 Update to 2.4.0-5
Signed-off-by: frankyj915 <yangjieyj.yang@huawei.com>
2024-12-18 11:35:56 +08:00

136 lines
4.6 KiB
Diff

From 5551d6b5abaf9d5241904425e3991c256b30d22f Mon Sep 17 00:00:00 2001
From: frankyj915 <yangjieyj.yang@huawei.com>
Date: Sun, 15 Dec 2024 09:31:20 +0800
Subject: [PATCH 1/2] hypervisor/kvm: Fix setting core reg error when restoring
VM
vcpu_init() should be called before setting vcpu regs.
Fix 5edbafc(migration: bugfix for mgiration)
Signed-off-by: frankyj915 <yangjieyj.yang@huawei.com>
---
cpu/src/lib.rs | 20 +++++++++-----------
hypervisor/src/kvm/aarch64/mod.rs | 6 ++++--
hypervisor/src/kvm/mod.rs | 4 ++--
hypervisor/src/kvm/x86_64/mod.rs | 8 +++++---
4 files changed, 20 insertions(+), 18 deletions(-)
diff --git a/cpu/src/lib.rs b/cpu/src/lib.rs
index 7698132..873cb49 100644
--- a/cpu/src/lib.rs
+++ b/cpu/src/lib.rs
@@ -160,7 +160,7 @@ pub trait CPUHypervisorOps: Send + Sync {
fn set_boot_config(
&self,
arch_cpu: Arc<Mutex<ArchCPU>>,
- boot_config: &CPUBootConfig,
+ boot_config: &Option<CPUBootConfig>,
#[cfg(target_arch = "aarch64")] vcpu_config: &CPUFeatures,
) -> Result<()>;
@@ -323,16 +323,14 @@ impl CPUInterface for CPU {
))));
}
- if let Some(boot) = boot {
- self.hypervisor_cpu
- .set_boot_config(
- self.arch_cpu.clone(),
- boot,
- #[cfg(target_arch = "aarch64")]
- config,
- )
- .with_context(|| "Failed to realize arch cpu")?;
- }
+ self.hypervisor_cpu
+ .set_boot_config(
+ self.arch_cpu.clone(),
+ boot,
+ #[cfg(target_arch = "aarch64")]
+ config,
+ )
+ .with_context(|| "Failed to realize arch cpu")?;
self.arch_cpu
.lock()
diff --git a/hypervisor/src/kvm/aarch64/mod.rs b/hypervisor/src/kvm/aarch64/mod.rs
index 0721236..5d2a938 100644
--- a/hypervisor/src/kvm/aarch64/mod.rs
+++ b/hypervisor/src/kvm/aarch64/mod.rs
@@ -135,7 +135,7 @@ impl KvmCpu {
pub fn arch_set_boot_config(
&self,
arch_cpu: Arc<Mutex<ArchCPU>>,
- boot_config: &CPUBootConfig,
+ boot_config: &Option<CPUBootConfig>,
vcpu_config: &CPUFeatures,
) -> Result<()> {
let mut kvi = self.kvi.lock().unwrap();
@@ -169,7 +169,9 @@ impl KvmCpu {
}
drop(kvi);
- arch_cpu.lock().unwrap().set_core_reg(boot_config);
+ if let Some(cfg) = boot_config {
+ arch_cpu.lock().unwrap().set_core_reg(cfg);
+ }
self.arch_vcpu_init()?;
diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs
index 671eb54..e20f102 100644
--- a/hypervisor/src/kvm/mod.rs
+++ b/hypervisor/src/kvm/mod.rs
@@ -544,7 +544,7 @@ impl CPUHypervisorOps for KvmCpu {
fn set_boot_config(
&self,
arch_cpu: Arc<Mutex<ArchCPU>>,
- boot_config: &CPUBootConfig,
+ boot_config: &Option<CPUBootConfig>,
#[cfg(target_arch = "aarch64")] vcpu_config: &CPUFeatures,
) -> Result<()> {
#[cfg(target_arch = "aarch64")]
@@ -1067,7 +1067,7 @@ mod test {
let cpu = CPU::new(hypervisor_cpu.clone(), 0, x86_cpu, vm.clone());
// test `set_boot_config` function
assert!(hypervisor_cpu
- .set_boot_config(cpu.arch().clone(), &cpu_config)
+ .set_boot_config(cpu.arch().clone(), &Some(cpu_config))
.is_ok());
// test setup special registers
diff --git a/hypervisor/src/kvm/x86_64/mod.rs b/hypervisor/src/kvm/x86_64/mod.rs
index 7d7e7b5..e7d08ef 100644
--- a/hypervisor/src/kvm/x86_64/mod.rs
+++ b/hypervisor/src/kvm/x86_64/mod.rs
@@ -84,7 +84,7 @@ impl KvmCpu {
pub fn arch_set_boot_config(
&self,
arch_cpu: Arc<Mutex<ArchCPU>>,
- boot_config: &CPUBootConfig,
+ boot_config: &Option<CPUBootConfig>,
) -> Result<()> {
let mut locked_arch_cpu = arch_cpu.lock().unwrap();
let apic_id = locked_arch_cpu.apic_id;
@@ -93,12 +93,14 @@ impl KvmCpu {
.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
.get_sregs()
.with_context(|| format!("Failed to get sregs for CPU {}/KVM", apic_id))?;
- locked_arch_cpu.setup_sregs(sregs, boot_config)?;
+ if let Some(cfg) = boot_config {
+ locked_arch_cpu.setup_regs(cfg);
+ locked_arch_cpu.setup_sregs(sregs, cfg)?;
+ }
locked_arch_cpu.setup_fpu();
locked_arch_cpu.setup_msrs();
--
2.34.1