mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
Wire a migratable VFIO device's migration state to the VM lifecycle so the device's internal state survives snapshot and restore. A device such as a ConnectX VF bound to mlx5_vfio_pci would otherwise come back blank, because a plain snapshot saves only the PCI configuration Cloud Hypervisor owns, not the device's own state. On save, pause moves the device to STOP and snapshot() drives it through STOP_COPY to extract the opaque state blob, attached to the device snapshot as a base64 encoded child. resume() returns it to RUNNING. All new behavior is gated on migration_flags.is_some(), so devices without migration support (including vfio-user) retain their previous snapshot behavior. If the data read fails after STOP_COPY was entered, the device is returned to STOP before the error is bubbled, since the STOP_COPY to STOP arc stays valid. A failed transition into STOP_COPY returns immediately because a STOP from the resulting ERROR state cannot help. Full recovery including device reset is deferred. Since the non BAR write path goes directly to the VFIO device and not the shadow, the PciConfiguration shadow can get stale. Mirror every non BAR, non MSI config write into the shadow via write_byte / write_word / write_reg so snapshot() can capture PCI_COMMAND. Without this the shadow keeps the values set at device init and snapshot() encodes PCI_COMMAND as zero. Use the raw write_byte, write_word, and write_reg helpers rather than PciConfiguration::write_config_register, which would otherwise drain pending_bar_reprogram, consumed by the BAR block below, and rerun MSI-X set_msg_ctl, already done by update_msix_capabilities. Signed-off-by: Saravanan D <saravanand@crusoe.ai>
141 lines
3.3 KiB
TOML
141 lines
3.3 KiB
TOML
# Cloud Hypervisor Workspace
|
|
#
|
|
# The main crate producing the binaries is in `./cloud-hypervisor`.
|
|
|
|
[profile.release]
|
|
codegen-units = 1
|
|
lto = true
|
|
opt-level = "s"
|
|
strip = true
|
|
|
|
[profile.profiling]
|
|
debug = true
|
|
inherits = "release"
|
|
strip = false
|
|
|
|
[workspace]
|
|
members = [
|
|
"api_client",
|
|
"arch",
|
|
"block",
|
|
"cloud-hypervisor",
|
|
"devices",
|
|
"event_monitor",
|
|
"hypervisor",
|
|
"net_util",
|
|
"offload_daemon",
|
|
"option_parser",
|
|
"pci",
|
|
"performance-metrics",
|
|
"rate_limiter",
|
|
"serial_buffer",
|
|
"test_infra",
|
|
"tracer",
|
|
"vhost_user_block",
|
|
"vhost_user_net",
|
|
"virtio-devices",
|
|
"vm-allocator",
|
|
"vm-device",
|
|
"vm-migration",
|
|
"vm-virtio",
|
|
"vmm",
|
|
]
|
|
package.edition = "2024"
|
|
# Minimum buildable version:
|
|
# Keep in sync with version in .github/workflows/build.yaml
|
|
# Policy on MSRV (see #4318):
|
|
# Can only be bumped if satisfying any of the following:
|
|
# a.) A dependency requires it,
|
|
# b.) If we want to use a new feature and that MSRV is at least 6 months old,
|
|
# c.) There is a security issue that is addressed by the toolchain update.
|
|
package.rust-version = "1.89.0"
|
|
resolver = "3"
|
|
|
|
[workspace.dependencies]
|
|
# rust-vmm crates
|
|
acpi_tables = "0.2.1"
|
|
iommufd-ioctls = "0.2.0"
|
|
kvm-bindings = "0.14.1"
|
|
kvm-ioctls = "0.25.0"
|
|
linux-loader = "0.13.2"
|
|
mshv-bindings = "0.6.9"
|
|
mshv-ioctls = "0.6.9"
|
|
seccompiler = "0.5.0"
|
|
vfio-bindings = { version = "0.6.2", default-features = false }
|
|
vfio-ioctls = { version = "0.7.0", default-features = false }
|
|
vfio_user = { version = "0.1.3", default-features = false }
|
|
vhost = { version = "0.16.0", default-features = false }
|
|
vhost-user-backend = { version = "0.22.0", default-features = false }
|
|
virtio-bindings = "0.2.6"
|
|
virtio-queue = "0.17.0"
|
|
vm-fdt = "0.3.0"
|
|
vm-memory = "0.17.1"
|
|
vmm-sys-util = "0.15.0"
|
|
|
|
# igvm crates
|
|
igvm = "0.4.0"
|
|
igvm_defs = "0.4.0"
|
|
|
|
# serde crates
|
|
serde = "1.0.228"
|
|
serde_json = "1.0.150"
|
|
serde_with = { version = "3.19.0", default-features = false }
|
|
|
|
# other crates
|
|
anyhow = "1.0.102"
|
|
base64 = "0.22.1"
|
|
bitflags = "2.11.1"
|
|
byteorder = "1.5.0"
|
|
cfg-if = "1.0.4"
|
|
clap = "4.6.1"
|
|
dhat = "0.3.3"
|
|
dirs = "6.0.0"
|
|
env_logger = "0.11.10"
|
|
epoll = "4.4.0"
|
|
flume = "0.12.0"
|
|
itertools = "0.15.0"
|
|
jiff = { version = "0.2", default-features = false, features = ["std"] }
|
|
libc = "0.2.186"
|
|
log = "0.4.30"
|
|
rustls = { version = "0.23.40", default-features = false, features = [
|
|
"logging",
|
|
"ring",
|
|
"std",
|
|
] }
|
|
sha2 = "0.11.0"
|
|
signal-hook = "0.4.4"
|
|
signal-hook-registry = "1.4.8"
|
|
thiserror = "2.0.18"
|
|
uuid = { version = "1.23.2" }
|
|
wait-timeout = "0.2.1"
|
|
zerocopy = { version = "0.8.50", default-features = false }
|
|
|
|
[workspace.lints.clippy]
|
|
# Any clippy lint (group) in alphabetical order:
|
|
# https://rust-lang.github.io/rust-clippy/master/index.html
|
|
|
|
# Groups
|
|
all = "deny" # shorthand for the other groups but here for compleness
|
|
complexity = "deny"
|
|
correctness = "deny"
|
|
perf = "deny"
|
|
style = "deny"
|
|
suspicious = "deny"
|
|
|
|
# Individual Lints
|
|
absolute_paths = "deny"
|
|
assertions_on_result_states = "deny"
|
|
if_not_else = "deny"
|
|
manual_string_new = "deny"
|
|
map_unwrap_or = "deny"
|
|
needless_pass_by_value = "deny"
|
|
redundant_else = "deny"
|
|
semicolon_if_nothing_returned = "deny"
|
|
undocumented_unsafe_blocks = "deny"
|
|
uninlined_format_args = "deny"
|
|
unnecessary_semicolon = "deny"
|
|
|
|
[workspace.lints.rust]
|
|
# `level = warn` is irrelevant here but mandatory for rustc/cargo
|
|
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(devcli_testenv)'] }
|