virtio: fix dev_id initialization for virtio-pci and vfio device on aarch64 platform vfio: fix the problem of dma mapping failed syscall: add syscall "newfstatat" in x86_64-unknown-linux-gnu target kernel_config: update kernel config 5.10 on aarch64 platform machine/standard_vm: fix inappropriate file open permissions migration: fix an errors during the PL011 device state restore migration: fix an error during migration interface on aarch64 fix spelling errors in project (cherry picked from commit a12a13829fa5d788667e11b886c254760e6a4579)
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
|
|
|