105 lines
4.0 KiB
Diff
105 lines
4.0 KiB
Diff
|
|
From 7c9db6a2e3082b41af3e62b241d49553f5bb8492 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Wei Gao <gaowei66@huawei.com>
|
||
|
|
Date: Wed, 18 Aug 2021 14:30:08 +0800
|
||
|
|
Subject: [PATCH 2/8] migration: fix an error during migration interface on
|
||
|
|
aarch64.
|
||
|
|
|
||
|
|
Change the order of GICv3 device register to the end. Because it rely on
|
||
|
|
vcpu_init if boot with multi vcpu.
|
||
|
|
|
||
|
|
Signed-off-by: Wei Gao <gaowei66@huawei.com>
|
||
|
|
---
|
||
|
|
.../src/interrupt_controller/aarch64/gicv3.rs | 3 ++-
|
||
|
|
hypervisor/src/kvm/mod.rs | 1 +
|
||
|
|
machine/src/lib.rs | 2 +-
|
||
|
|
migration/src/manager.rs | 16 ++++++++++++----
|
||
|
|
4 files changed, 16 insertions(+), 6 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/devices/src/interrupt_controller/aarch64/gicv3.rs b/devices/src/interrupt_controller/aarch64/gicv3.rs
|
||
|
|
index 3303b32..6559e73 100644
|
||
|
|
--- a/devices/src/interrupt_controller/aarch64/gicv3.rs
|
||
|
|
+++ b/devices/src/interrupt_controller/aarch64/gicv3.rs
|
||
|
|
@@ -389,13 +389,14 @@ impl GICDevice for GICv3 {
|
||
|
|
gic_conf: &GICConfig,
|
||
|
|
) -> Result<Arc<dyn GICDevice + std::marker::Send + std::marker::Sync>> {
|
||
|
|
let gicv3 = Arc::new(GICv3::new(gic_conf)?);
|
||
|
|
- MigrationManager::register_device_instance(GICv3State::descriptor(), gicv3.clone());
|
||
|
|
if gicv3.its_dev.is_some() {
|
||
|
|
MigrationManager::register_device_instance(
|
||
|
|
GICv3ItsState::descriptor(),
|
||
|
|
gicv3.its_dev.as_ref().unwrap().clone(),
|
||
|
|
+ true,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
+ MigrationManager::register_device_instance(GICv3State::descriptor(), gicv3.clone(), true);
|
||
|
|
|
||
|
|
Ok(gicv3)
|
||
|
|
}
|
||
|
|
diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs
|
||
|
|
index 5b5be94..19193db 100644
|
||
|
|
--- a/hypervisor/src/kvm/mod.rs
|
||
|
|
+++ b/hypervisor/src/kvm/mod.rs
|
||
|
|
@@ -60,6 +60,7 @@ impl KVMFds {
|
||
|
|
migration::MigrationManager::register_device_instance(
|
||
|
|
state::KvmDeviceState::descriptor(),
|
||
|
|
Arc::new(state::KvmDevice {}),
|
||
|
|
+ false,
|
||
|
|
);
|
||
|
|
|
||
|
|
kvm_fds
|
||
|
|
diff --git a/machine/src/lib.rs b/machine/src/lib.rs
|
||
|
|
index 8a095b3..9eb3039 100644
|
||
|
|
--- a/machine/src/lib.rs
|
||
|
|
+++ b/machine/src/lib.rs
|
||
|
|
@@ -233,7 +233,7 @@ pub trait MachineOps {
|
||
|
|
));
|
||
|
|
cpus.push(cpu.clone());
|
||
|
|
|
||
|
|
- MigrationManager::register_device_instance(cpu::ArchCPU::descriptor(), cpu);
|
||
|
|
+ MigrationManager::register_device_instance(cpu::ArchCPU::descriptor(), cpu, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
if let Some(boot_config) = boot_cfg {
|
||
|
|
diff --git a/migration/src/manager.rs b/migration/src/manager.rs
|
||
|
|
index 480b59b..7ec4767 100644
|
||
|
|
--- a/migration/src/manager.rs
|
||
|
|
+++ b/migration/src/manager.rs
|
||
|
|
@@ -162,14 +162,22 @@ impl MigrationManager {
|
||
|
|
///
|
||
|
|
/// * `device_desc` - The `DeviceStateDesc` of device instance.
|
||
|
|
/// * `entry` - Device instance with migratable interface.
|
||
|
|
- pub fn register_device_instance<T>(device_desc: DeviceStateDesc, device_entry: Arc<T>)
|
||
|
|
- where
|
||
|
|
+ /// * `reverse` - Register device in order or in the reverse order.
|
||
|
|
+ pub fn register_device_instance<T>(
|
||
|
|
+ device_desc: DeviceStateDesc,
|
||
|
|
+ device_entry: Arc<T>,
|
||
|
|
+ reverse: bool,
|
||
|
|
+ ) where
|
||
|
|
T: MigrationHook + Sync + Send + 'static,
|
||
|
|
{
|
||
|
|
Self::register_device_desc(device_desc);
|
||
|
|
|
||
|
|
let entry = MigrationEntry::Safe(device_entry);
|
||
|
|
- let nr_entry = Self::entry_db_len();
|
||
|
|
+ let nr_entry = if reverse {
|
||
|
|
+ !0 - Self::entry_db_len()
|
||
|
|
+ } else {
|
||
|
|
+ Self::entry_db_len()
|
||
|
|
+ };
|
||
|
|
|
||
|
|
MIGRATION_MANAGER
|
||
|
|
.entry
|
||
|
|
@@ -333,7 +341,7 @@ mod tests {
|
||
|
|
let device_v2 = Arc::new(DeviceV2::default());
|
||
|
|
let device_v2_mutex = Arc::new(Mutex::new(DeviceV2::default()));
|
||
|
|
|
||
|
|
- MigrationManager::register_device_instance(DeviceV1State::descriptor(), device_v1);
|
||
|
|
+ MigrationManager::register_device_instance(DeviceV1State::descriptor(), device_v1, false);
|
||
|
|
MigrationManager::register_memory_instance(device_v2);
|
||
|
|
MigrationManager::register_device_instance_mutex(
|
||
|
|
DeviceV2State::descriptor(),
|
||
|
|
--
|
||
|
|
2.25.1
|
||
|
|
|