From 3bc88622d6f11fefcd31b1bd6e75ca6e84f9cd13 Mon Sep 17 00:00:00 2001 From: Egor Lazarchuk Date: Tue, 13 Aug 2024 22:22:59 +0100 Subject: [PATCH 1/5] refactor(vmm): rename utilities to test_utils `utilities` has only test related code/binaries, so rename the module with more descriptive name. Signed-off-by: Egor Lazarchuk --- src/vmm/benches/block_request.rs | 2 +- src/vmm/benches/queue.rs | 2 +- src/vmm/src/acpi/mod.rs | 2 +- src/vmm/src/arch/aarch64/fdt.rs | 2 +- src/vmm/src/arch/aarch64/mod.rs | 2 +- src/vmm/src/arch/aarch64/vcpu.rs | 2 +- src/vmm/src/arch/x86_64/mod.rs | 2 +- src/vmm/src/arch/x86_64/mptable.rs | 2 +- src/vmm/src/arch/x86_64/regs.rs | 2 +- src/vmm/src/builder.rs | 2 +- src/vmm/src/device_manager/legacy.rs | 2 +- src/vmm/src/device_manager/mmio.rs | 2 +- src/vmm/src/devices/virtio/balloon/device.rs | 2 +- src/vmm/src/devices/virtio/balloon/util.rs | 2 +- .../src/devices/virtio/block/vhost_user/device.rs | 2 +- src/vmm/src/devices/virtio/block/virtio/request.rs | 2 +- src/vmm/src/devices/virtio/iovec.rs | 2 +- src/vmm/src/devices/virtio/mmio.rs | 2 +- src/vmm/src/devices/virtio/net/device.rs | 2 +- src/vmm/src/devices/virtio/net/event_handler.rs | 2 +- src/vmm/src/devices/virtio/queue.rs | 2 +- src/vmm/src/devices/virtio/test_utils.rs | 4 ++-- src/vmm/src/devices/virtio/vhost_user.rs | 2 +- src/vmm/src/devices/virtio/vsock/event_handler.rs | 2 +- src/vmm/src/devices/virtio/vsock/test_utils.rs | 2 +- src/vmm/src/lib.rs | 2 +- .../mock_resources/dirtying_init.tgz | Bin .../mock_resources/make_noisy_kernel.sh | 0 .../{utilities => test_utils}/mock_resources/mod.rs | 2 +- .../mock_resources/test_elf.bin | Bin .../mock_resources/test_noisy_elf.bin | Bin .../mock_resources/test_pe.bin | Bin src/vmm/src/{utilities => test_utils}/mod.rs | 0 .../src/{utilities => test_utils}/test_utils/mod.rs | 2 +- src/vmm/src/vstate/vcpu/mod.rs | 4 ++-- src/vmm/src/vstate/vm.rs | 2 +- src/vmm/tests/integration_tests.rs | 6 +++--- 37 files changed, 35 insertions(+), 35 deletions(-) rename src/vmm/src/{utilities => test_utils}/mock_resources/dirtying_init.tgz (100%) rename src/vmm/src/{utilities => test_utils}/mock_resources/make_noisy_kernel.sh (100%) rename src/vmm/src/{utilities => test_utils}/mock_resources/mod.rs (98%) rename src/vmm/src/{utilities => test_utils}/mock_resources/test_elf.bin (100%) rename src/vmm/src/{utilities => test_utils}/mock_resources/test_noisy_elf.bin (100%) rename src/vmm/src/{utilities => test_utils}/mock_resources/test_pe.bin (100%) rename src/vmm/src/{utilities => test_utils}/mod.rs (100%) rename src/vmm/src/{utilities => test_utils}/test_utils/mod.rs (98%) diff --git a/src/vmm/benches/block_request.rs b/src/vmm/benches/block_request.rs index 17937dd0242..4b9ced34b89 100644 --- a/src/vmm/benches/block_request.rs +++ b/src/vmm/benches/block_request.rs @@ -11,7 +11,7 @@ use vm_memory::GuestAddress; use vmm::devices::virtio::block::virtio::test_utils::RequestDescriptorChain; use vmm::devices::virtio::block::virtio::{Request, RequestHeader, VIRTIO_BLK_T_IN}; use vmm::devices::virtio::test_utils::VirtQueue; -use vmm::utilities::test_utils::single_region_mem; +use vmm::test_utils::test_utils::single_region_mem; pub fn block_request_benchmark(c: &mut Criterion) { let mem = single_region_mem(2 * 65562); diff --git a/src/vmm/benches/queue.rs b/src/vmm/benches/queue.rs index de4e94ee27f..f9508c5bd60 100644 --- a/src/vmm/benches/queue.rs +++ b/src/vmm/benches/queue.rs @@ -12,7 +12,7 @@ use criterion::{criterion_group, criterion_main, Criterion}; use vm_memory::GuestAddress; use vmm::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use vmm::devices::virtio::test_utils::VirtQueue; -use vmm::utilities::test_utils::single_region_mem; +use vmm::test_utils::test_utils::single_region_mem; /// Create one chain with n descriptors /// Descriptor buffers will leave at the offset of 2048 bytes diff --git a/src/vmm/src/acpi/mod.rs b/src/vmm/src/acpi/mod.rs index ad108217d08..787ccb08806 100644 --- a/src/vmm/src/acpi/mod.rs +++ b/src/vmm/src/acpi/mod.rs @@ -186,7 +186,7 @@ pub mod tests { use crate::acpi::{AcpiError, AcpiTableWriter}; use crate::arch::x86_64::layout::{SYSTEM_MEM_SIZE, SYSTEM_MEM_START}; use crate::builder::tests::default_vmm; - use crate::utilities::test_utils::arch_mem; + use crate::test_utils::test_utils::arch_mem; struct MockSdt(Vec); diff --git a/src/vmm/src/arch/aarch64/fdt.rs b/src/vmm/src/arch/aarch64/fdt.rs index cbc7884cf98..83676c8fa35 100644 --- a/src/vmm/src/arch/aarch64/fdt.rs +++ b/src/vmm/src/arch/aarch64/fdt.rs @@ -460,7 +460,7 @@ mod tests { use crate::arch::aarch64::gic::create_gic; use crate::arch::aarch64::layout; use crate::device_manager::resources::ResourceAllocator; - use crate::utilities::test_utils::arch_mem; + use crate::test_utils::test_utils::arch_mem; const LEN: u64 = 4096; diff --git a/src/vmm/src/arch/aarch64/mod.rs b/src/vmm/src/arch/aarch64/mod.rs index 7ed72789325..8aa481b6255 100644 --- a/src/vmm/src/arch/aarch64/mod.rs +++ b/src/vmm/src/arch/aarch64/mod.rs @@ -117,7 +117,7 @@ fn get_fdt_addr(mem: &GuestMemoryMmap) -> u64 { #[cfg(test)] mod tests { use super::*; - use crate::utilities::test_utils::arch_mem; + use crate::test_utils::test_utils::arch_mem; #[test] fn test_regions_lt_1024gb() { diff --git a/src/vmm/src/arch/aarch64/vcpu.rs b/src/vmm/src/arch/aarch64/vcpu.rs index 6368b73dc17..cd294d6b1e1 100644 --- a/src/vmm/src/arch/aarch64/vcpu.rs +++ b/src/vmm/src/arch/aarch64/vcpu.rs @@ -218,7 +218,7 @@ mod tests { use super::*; use crate::arch::aarch64::layout; - use crate::utilities::test_utils::arch_mem; + use crate::test_utils::test_utils::arch_mem; #[test] fn test_setup_regs() { diff --git a/src/vmm/src/arch/x86_64/mod.rs b/src/vmm/src/arch/x86_64/mod.rs index 575895871cb..79d6482c8e3 100644 --- a/src/vmm/src/arch/x86_64/mod.rs +++ b/src/vmm/src/arch/x86_64/mod.rs @@ -222,7 +222,7 @@ mod tests { use linux_loader::loader::bootparam::boot_e820_entry; use super::*; - use crate::utilities::test_utils::{arch_mem, single_region_mem}; + use crate::test_utils::test_utils::{arch_mem, single_region_mem}; #[test] fn regions_lt_4gb() { diff --git a/src/vmm/src/arch/x86_64/mptable.rs b/src/vmm/src/arch/x86_64/mptable.rs index 5558bdc3a37..ef9a67a68ed 100644 --- a/src/vmm/src/arch/x86_64/mptable.rs +++ b/src/vmm/src/arch/x86_64/mptable.rs @@ -316,7 +316,7 @@ mod tests { use super::*; use crate::arch::SYSTEM_MEM_START; - use crate::utilities::test_utils::single_region_mem_at; + use crate::test_utils::test_utils::single_region_mem_at; use crate::vstate::memory::Bytes; fn table_entry_size(type_: u8) -> usize { diff --git a/src/vmm/src/arch/x86_64/regs.rs b/src/vmm/src/arch/x86_64/regs.rs index 2cf9e25bbfc..283cf8b9b8c 100644 --- a/src/vmm/src/arch/x86_64/regs.rs +++ b/src/vmm/src/arch/x86_64/regs.rs @@ -243,7 +243,7 @@ mod tests { use kvm_ioctls::Kvm; use super::*; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::{Bytes, GuestAddress, GuestMemoryMmap}; fn read_u64(gm: &GuestMemoryMmap, offset: u64) -> u64 { diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs index 27d2ce72dad..f6d34ab5f08 100644 --- a/src/vmm/src/builder.rs +++ b/src/vmm/src/builder.rs @@ -1033,7 +1033,7 @@ pub mod tests { use crate::devices::virtio::{TYPE_BALLOON, TYPE_BLOCK, TYPE_RNG}; use crate::mmds::data_store::{Mmds, MmdsVersion}; use crate::mmds::ns::MmdsNetworkStack; - use crate::utilities::test_utils::{arch_mem, single_region_mem, single_region_mem_at}; + use crate::test_utils::test_utils::{arch_mem, single_region_mem, single_region_mem_at}; use crate::vmm_config::balloon::{BalloonBuilder, BalloonDeviceConfig, BALLOON_DEV_ID}; use crate::vmm_config::boot_source::DEFAULT_KERNEL_CMDLINE; use crate::vmm_config::drive::{BlockBuilder, BlockDeviceConfig}; diff --git a/src/vmm/src/device_manager/legacy.rs b/src/vmm/src/device_manager/legacy.rs index 7c4a0719900..c425f2d55d9 100644 --- a/src/vmm/src/device_manager/legacy.rs +++ b/src/vmm/src/device_manager/legacy.rs @@ -238,7 +238,7 @@ impl PortIODeviceManager { #[cfg(test)] mod tests { use super::*; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; use crate::Vm; #[test] diff --git a/src/vmm/src/device_manager/mmio.rs b/src/vmm/src/device_manager/mmio.rs index c63f7fb513f..111be5f05cc 100644 --- a/src/vmm/src/device_manager/mmio.rs +++ b/src/vmm/src/device_manager/mmio.rs @@ -535,7 +535,7 @@ mod tests { use crate::devices::virtio::device::{IrqTrigger, VirtioDevice}; use crate::devices::virtio::queue::Queue; use crate::devices::virtio::ActivateError; - use crate::utilities::test_utils::multi_region_mem; + use crate::test_utils::test_utils::multi_region_mem; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; use crate::{builder, Vm}; diff --git a/src/vmm/src/devices/virtio/balloon/device.rs b/src/vmm/src/devices/virtio/balloon/device.rs index 98ed8332ac8..52ef96fbaf5 100644 --- a/src/vmm/src/devices/virtio/balloon/device.rs +++ b/src/vmm/src/devices/virtio/balloon/device.rs @@ -637,7 +637,7 @@ pub(crate) mod tests { }; use crate::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::{default_mem, VirtQueue}; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::GuestAddress; impl Balloon { diff --git a/src/vmm/src/devices/virtio/balloon/util.rs b/src/vmm/src/devices/virtio/balloon/util.rs index 486c25e884b..38302b80b2b 100644 --- a/src/vmm/src/devices/virtio/balloon/util.rs +++ b/src/vmm/src/devices/virtio/balloon/util.rs @@ -263,7 +263,7 @@ mod tests { /// BEGIN PROPERTY BASED TESTING use proptest::prelude::*; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; #[allow(clippy::let_with_type_underscore)] fn random_pfn_u32_max() -> impl Strategy> { diff --git a/src/vmm/src/devices/virtio/block/vhost_user/device.rs b/src/vmm/src/devices/virtio/block/vhost_user/device.rs index 627984d1bb5..04d4bb89251 100644 --- a/src/vmm/src/devices/virtio/block/vhost_user/device.rs +++ b/src/vmm/src/devices/virtio/block/vhost_user/device.rs @@ -376,7 +376,7 @@ mod tests { use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; use crate::devices::virtio::mmio::VIRTIO_MMIO_INT_CONFIG; - use crate::utilities::test_utils::create_tmp_socket; + use crate::test_utils::test_utils::create_tmp_socket; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/block/virtio/request.rs b/src/vmm/src/devices/virtio/block/virtio/request.rs index c9c3cf112d1..73829608651 100644 --- a/src/vmm/src/devices/virtio/block/virtio/request.rs +++ b/src/vmm/src/devices/virtio/block/virtio/request.rs @@ -667,7 +667,7 @@ mod tests { use proptest::strategy::{Map, Strategy, TupleUnion}; use crate::devices::virtio::block::virtio::test_utils::RequestDescriptorChain; - use crate::utilities::test_utils::{multi_region_mem, single_region_mem}; + use crate::test_utils::test_utils::{multi_region_mem, single_region_mem}; // Implements a "strategy" for producing arbitrary values of RequestType. // This can also be generated by a derive macro from `proptest_derive`, but the crate diff --git a/src/vmm/src/devices/virtio/iovec.rs b/src/vmm/src/devices/virtio/iovec.rs index 688f27a0a67..d9ad8246773 100644 --- a/src/vmm/src/devices/virtio/iovec.rs +++ b/src/vmm/src/devices/virtio/iovec.rs @@ -393,7 +393,7 @@ mod tests { use super::{IoVecBuffer, IoVecBufferMut}; use crate::devices::virtio::queue::{Queue, VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::VirtQueue; - use crate::utilities::test_utils::multi_region_mem; + use crate::test_utils::test_utils::multi_region_mem; use crate::vstate::memory::{Bytes, GuestAddress, GuestMemoryMmap}; impl<'a> From<&'a [u8]> for IoVecBuffer { diff --git a/src/vmm/src/devices/virtio/mmio.rs b/src/vmm/src/devices/virtio/mmio.rs index b4aa9c88875..78d16f7860f 100644 --- a/src/vmm/src/devices/virtio/mmio.rs +++ b/src/vmm/src/devices/virtio/mmio.rs @@ -382,7 +382,7 @@ pub(crate) mod tests { use crate::devices::virtio::device::IrqTrigger; use crate::devices::virtio::device_status::DEVICE_NEEDS_RESET; use crate::devices::virtio::ActivateError; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::GuestMemoryMmap; #[derive(Debug)] diff --git a/src/vmm/src/devices/virtio/net/device.rs b/src/vmm/src/devices/virtio/net/device.rs index 975e1588333..50f39c82d51 100755 --- a/src/vmm/src/devices/virtio/net/device.rs +++ b/src/vmm/src/devices/virtio/net/device.rs @@ -956,7 +956,7 @@ pub mod tests { use crate::dumbo::EthernetFrame; use crate::logger::IncMetric; use crate::rate_limiter::{BucketUpdate, RateLimiter, TokenBucket, TokenType}; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::{Address, GuestMemory}; #[test] diff --git a/src/vmm/src/devices/virtio/net/event_handler.rs b/src/vmm/src/devices/virtio/net/event_handler.rs index f6c4fddbf91..38a78c91590 100644 --- a/src/vmm/src/devices/virtio/net/event_handler.rs +++ b/src/vmm/src/devices/virtio/net/event_handler.rs @@ -135,7 +135,7 @@ pub mod tests { use crate::devices::virtio::net::test_utils::test::TestHelper; use crate::devices::virtio::net::test_utils::NetQueue; use crate::devices::virtio::net::{MAX_BUFFER_SIZE, TX_INDEX}; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; #[test] fn test_event_handler() { diff --git a/src/vmm/src/devices/virtio/queue.rs b/src/vmm/src/devices/virtio/queue.rs index 9dc3f2042ae..6afc133cb5e 100644 --- a/src/vmm/src/devices/virtio/queue.rs +++ b/src/vmm/src/devices/virtio/queue.rs @@ -1231,7 +1231,7 @@ mod tests { pub use super::*; use crate::devices::virtio::queue::QueueError::DescIndexOutOfBounds; use crate::devices::virtio::test_utils::{default_mem, VirtQueue}; - use crate::utilities::test_utils::{multi_region_mem, single_region_mem}; + use crate::test_utils::test_utils::{multi_region_mem, single_region_mem}; use crate::vstate::memory::GuestAddress; #[test] diff --git a/src/vmm/src/devices/virtio/test_utils.rs b/src/vmm/src/devices/virtio/test_utils.rs index 32807d7381e..7137d7d3e1f 100644 --- a/src/vmm/src/devices/virtio/test_utils.rs +++ b/src/vmm/src/devices/virtio/test_utils.rs @@ -11,7 +11,7 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use utils::u64_to_usize; use crate::devices::virtio::queue::Queue; -use crate::utilities::test_utils::single_region_mem; +use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::{Address, Bytes, GuestAddress, GuestMemoryMmap}; #[macro_export] @@ -325,7 +325,7 @@ pub(crate) mod test { use crate::devices::virtio::net::MAX_BUFFER_SIZE; use crate::devices::virtio::queue::{Queue, VIRTQ_DESC_F_NEXT}; use crate::devices::virtio::test_utils::{VirtQueue, VirtqDesc}; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::{Address, GuestAddress, GuestMemoryMmap}; pub fn create_virtio_mem() -> GuestMemoryMmap { diff --git a/src/vmm/src/devices/virtio/vhost_user.rs b/src/vmm/src/devices/virtio/vhost_user.rs index 3e3ce0a2dca..f5309e3e1e4 100644 --- a/src/vmm/src/devices/virtio/vhost_user.rs +++ b/src/vmm/src/devices/virtio/vhost_user.rs @@ -465,7 +465,7 @@ mod tests { use utils::tempfile::TempFile; use super::*; - use crate::utilities::test_utils::create_tmp_socket; + use crate::test_utils::test_utils::create_tmp_socket; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/vsock/event_handler.rs b/src/vmm/src/devices/virtio/vsock/event_handler.rs index 99640f1b5c2..2d483cbca7a 100755 --- a/src/vmm/src/devices/virtio/vsock/event_handler.rs +++ b/src/vmm/src/devices/virtio/vsock/event_handler.rs @@ -225,7 +225,7 @@ mod tests { use super::*; use crate::devices::virtio::vsock::packet::VSOCK_PKT_HDR_SIZE; use crate::devices::virtio::vsock::test_utils::{EventHandlerContext, TestContext}; - use crate::utilities::test_utils::multi_region_mem; + use crate::test_utils::test_utils::multi_region_mem; use crate::vstate::memory::Bytes; #[test] diff --git a/src/vmm/src/devices/virtio/vsock/test_utils.rs b/src/vmm/src/devices/virtio/vsock/test_utils.rs index 4360e2f2a48..53ae60f31cb 100644 --- a/src/vmm/src/devices/virtio/vsock/test_utils.rs +++ b/src/vmm/src/devices/virtio/vsock/test_utils.rs @@ -17,7 +17,7 @@ use crate::devices::virtio::vsock::packet::{VsockPacket, VSOCK_PKT_HDR_SIZE}; use crate::devices::virtio::vsock::{ Vsock, VsockBackend, VsockChannel, VsockEpollListener, VsockError, }; -use crate::utilities::test_utils::single_region_mem; +use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; #[derive(Debug)] diff --git a/src/vmm/src/lib.rs b/src/vmm/src/lib.rs index 13699a4c02b..e62ca8e14b7 100644 --- a/src/vmm/src/lib.rs +++ b/src/vmm/src/lib.rs @@ -100,7 +100,7 @@ pub mod signal_handler; /// Serialization and deserialization facilities pub mod snapshot; /// Utility functions for integration and benchmark testing -pub mod utilities; +pub mod test_utils; /// Wrappers over structures used to configure the VMM. pub mod vmm_config; /// Module with virtual state structs. diff --git a/src/vmm/src/utilities/mock_resources/dirtying_init.tgz b/src/vmm/src/test_utils/mock_resources/dirtying_init.tgz similarity index 100% rename from src/vmm/src/utilities/mock_resources/dirtying_init.tgz rename to src/vmm/src/test_utils/mock_resources/dirtying_init.tgz diff --git a/src/vmm/src/utilities/mock_resources/make_noisy_kernel.sh b/src/vmm/src/test_utils/mock_resources/make_noisy_kernel.sh similarity index 100% rename from src/vmm/src/utilities/mock_resources/make_noisy_kernel.sh rename to src/vmm/src/test_utils/mock_resources/make_noisy_kernel.sh diff --git a/src/vmm/src/utilities/mock_resources/mod.rs b/src/vmm/src/test_utils/mock_resources/mod.rs similarity index 98% rename from src/vmm/src/utilities/mock_resources/mod.rs rename to src/vmm/src/test_utils/mock_resources/mod.rs index a048d924532..9f4406ab280 100644 --- a/src/vmm/src/utilities/mock_resources/mod.rs +++ b/src/vmm/src/test_utils/mock_resources/mod.rs @@ -21,7 +21,7 @@ pub const NOISY_KERNEL_IMAGE: &str = "test_pe.bin"; pub fn kernel_image_path(kernel_image: Option<&str>) -> String { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.push("src/utilities/mock_resources"); + path.push("src/test_utils/mock_resources"); path.push(kernel_image.unwrap_or(DEFAULT_KERNEL_IMAGE)); path.as_os_str().to_str().unwrap().to_string() } diff --git a/src/vmm/src/utilities/mock_resources/test_elf.bin b/src/vmm/src/test_utils/mock_resources/test_elf.bin similarity index 100% rename from src/vmm/src/utilities/mock_resources/test_elf.bin rename to src/vmm/src/test_utils/mock_resources/test_elf.bin diff --git a/src/vmm/src/utilities/mock_resources/test_noisy_elf.bin b/src/vmm/src/test_utils/mock_resources/test_noisy_elf.bin similarity index 100% rename from src/vmm/src/utilities/mock_resources/test_noisy_elf.bin rename to src/vmm/src/test_utils/mock_resources/test_noisy_elf.bin diff --git a/src/vmm/src/utilities/mock_resources/test_pe.bin b/src/vmm/src/test_utils/mock_resources/test_pe.bin similarity index 100% rename from src/vmm/src/utilities/mock_resources/test_pe.bin rename to src/vmm/src/test_utils/mock_resources/test_pe.bin diff --git a/src/vmm/src/utilities/mod.rs b/src/vmm/src/test_utils/mod.rs similarity index 100% rename from src/vmm/src/utilities/mod.rs rename to src/vmm/src/test_utils/mod.rs diff --git a/src/vmm/src/utilities/test_utils/mod.rs b/src/vmm/src/test_utils/test_utils/mod.rs similarity index 98% rename from src/vmm/src/utilities/test_utils/mod.rs rename to src/vmm/src/test_utils/test_utils/mod.rs index f46229b0566..2dc8b591f65 100644 --- a/src/vmm/src/utilities/test_utils/mod.rs +++ b/src/vmm/src/test_utils/test_utils/mod.rs @@ -10,7 +10,7 @@ use vm_memory::GuestAddress; use crate::builder::build_microvm_for_boot; use crate::resources::VmResources; use crate::seccomp_filters::get_empty_filters; -use crate::utilities::mock_resources::{MockBootSourceConfig, MockVmConfig, MockVmResources}; +use crate::test_utils::mock_resources::{MockBootSourceConfig, MockVmConfig, MockVmResources}; use crate::vmm_config::boot_source::BootSourceConfig; use crate::vmm_config::instance_info::InstanceInfo; use crate::vmm_config::machine_config::HugePageConfig; diff --git a/src/vmm/src/vstate/vcpu/mod.rs b/src/vmm/src/vstate/vcpu/mod.rs index 7e5eb50dac2..7760166d089 100644 --- a/src/vmm/src/vstate/vcpu/mod.rs +++ b/src/vmm/src/vstate/vcpu/mod.rs @@ -877,9 +877,9 @@ pub mod tests { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); #[cfg(target_arch = "x86_64")] - path.push("src/utilities/mock_resources/test_elf.bin"); + path.push("src/test_utils/mock_resources/test_elf.bin"); #[cfg(target_arch = "aarch64")] - path.push("src/utilities/mock_resources/test_pe.bin"); + path.push("src/test_utils/mock_resources/test_pe.bin"); let mut kernel_file = File::open(path).expect("Cannot open kernel file"); diff --git a/src/vmm/src/vstate/vm.rs b/src/vmm/src/vstate/vm.rs index 55b0ec146e0..363bbf42136 100644 --- a/src/vmm/src/vstate/vm.rs +++ b/src/vmm/src/vstate/vm.rs @@ -470,7 +470,7 @@ pub(crate) mod tests { use super::*; #[cfg(target_arch = "x86_64")] use crate::snapshot::Snapshot; - use crate::utilities::test_utils::single_region_mem; + use crate::test_utils::test_utils::single_region_mem; use crate::vstate::memory::GuestMemoryMmap; // Auxiliary function being used throughout the tests. diff --git a/src/vmm/tests/integration_tests.rs b/src/vmm/tests/integration_tests.rs index 76956bb10d0..4da2127d695 100644 --- a/src/vmm/tests/integration_tests.rs +++ b/src/vmm/tests/integration_tests.rs @@ -15,10 +15,10 @@ use vmm::rpc_interface::{ }; use vmm::seccomp_filters::get_empty_filters; use vmm::snapshot::Snapshot; -use vmm::utilities::mock_resources::{MockVmResources, NOISY_KERNEL_IMAGE}; +use vmm::test_utils::mock_resources::{MockVmResources, NOISY_KERNEL_IMAGE}; #[cfg(target_arch = "x86_64")] -use vmm::utilities::test_utils::dirty_tracking_vmm; -use vmm::utilities::test_utils::{create_vmm, default_vmm, default_vmm_no_boot}; +use vmm::test_utils::test_utils::dirty_tracking_vmm; +use vmm::test_utils::test_utils::{create_vmm, default_vmm, default_vmm_no_boot}; use vmm::vmm_config::balloon::BalloonDeviceConfig; use vmm::vmm_config::boot_source::BootSourceConfig; use vmm::vmm_config::drive::BlockDeviceConfig; From 5a023a0e8df66107adb947baaa02b90f2e676062 Mon Sep 17 00:00:00 2001 From: Egor Lazarchuk Date: Tue, 13 Aug 2024 22:28:29 +0100 Subject: [PATCH 2/5] refactor(vmm): remove test_utils/test_utils Move content of `test_utils/test_utils/mod.rs` into `test_utils/mod.rs`. This remove the duplication of module names and makes clippy happy. Signed-off-by: Egor Lazarchuk --- src/vmm/benches/block_request.rs | 2 +- src/vmm/benches/queue.rs | 2 +- src/vmm/src/acpi/mod.rs | 2 +- src/vmm/src/arch/aarch64/fdt.rs | 2 +- src/vmm/src/arch/aarch64/mod.rs | 2 +- src/vmm/src/arch/aarch64/vcpu.rs | 2 +- src/vmm/src/arch/x86_64/mod.rs | 2 +- src/vmm/src/arch/x86_64/mptable.rs | 2 +- src/vmm/src/arch/x86_64/regs.rs | 2 +- src/vmm/src/builder.rs | 2 +- src/vmm/src/device_manager/legacy.rs | 2 +- src/vmm/src/device_manager/mmio.rs | 2 +- src/vmm/src/devices/virtio/balloon/device.rs | 2 +- src/vmm/src/devices/virtio/balloon/util.rs | 2 +- .../devices/virtio/block/vhost_user/device.rs | 2 +- .../devices/virtio/block/virtio/request.rs | 2 +- src/vmm/src/devices/virtio/iovec.rs | 2 +- src/vmm/src/devices/virtio/mmio.rs | 2 +- src/vmm/src/devices/virtio/net/device.rs | 2 +- .../src/devices/virtio/net/event_handler.rs | 2 +- src/vmm/src/devices/virtio/queue.rs | 2 +- src/vmm/src/devices/virtio/test_utils.rs | 4 +- src/vmm/src/devices/virtio/vhost_user.rs | 2 +- .../src/devices/virtio/vsock/event_handler.rs | 2 +- .../src/devices/virtio/vsock/test_utils.rs | 2 +- src/vmm/src/test_utils/mod.rs | 134 ++++++++++++++++- src/vmm/src/test_utils/test_utils/mod.rs | 136 ------------------ src/vmm/src/vstate/vm.rs | 2 +- src/vmm/tests/integration_tests.rs | 6 +- 29 files changed, 163 insertions(+), 167 deletions(-) delete mode 100644 src/vmm/src/test_utils/test_utils/mod.rs diff --git a/src/vmm/benches/block_request.rs b/src/vmm/benches/block_request.rs index 4b9ced34b89..92989f7693b 100644 --- a/src/vmm/benches/block_request.rs +++ b/src/vmm/benches/block_request.rs @@ -11,7 +11,7 @@ use vm_memory::GuestAddress; use vmm::devices::virtio::block::virtio::test_utils::RequestDescriptorChain; use vmm::devices::virtio::block::virtio::{Request, RequestHeader, VIRTIO_BLK_T_IN}; use vmm::devices::virtio::test_utils::VirtQueue; -use vmm::test_utils::test_utils::single_region_mem; +use vmm::test_utils::single_region_mem; pub fn block_request_benchmark(c: &mut Criterion) { let mem = single_region_mem(2 * 65562); diff --git a/src/vmm/benches/queue.rs b/src/vmm/benches/queue.rs index f9508c5bd60..168ecec33bb 100644 --- a/src/vmm/benches/queue.rs +++ b/src/vmm/benches/queue.rs @@ -12,7 +12,7 @@ use criterion::{criterion_group, criterion_main, Criterion}; use vm_memory::GuestAddress; use vmm::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use vmm::devices::virtio::test_utils::VirtQueue; -use vmm::test_utils::test_utils::single_region_mem; +use vmm::test_utils::single_region_mem; /// Create one chain with n descriptors /// Descriptor buffers will leave at the offset of 2048 bytes diff --git a/src/vmm/src/acpi/mod.rs b/src/vmm/src/acpi/mod.rs index 787ccb08806..75de9edfebc 100644 --- a/src/vmm/src/acpi/mod.rs +++ b/src/vmm/src/acpi/mod.rs @@ -186,7 +186,7 @@ pub mod tests { use crate::acpi::{AcpiError, AcpiTableWriter}; use crate::arch::x86_64::layout::{SYSTEM_MEM_SIZE, SYSTEM_MEM_START}; use crate::builder::tests::default_vmm; - use crate::test_utils::test_utils::arch_mem; + use crate::test_utils::arch_mem; struct MockSdt(Vec); diff --git a/src/vmm/src/arch/aarch64/fdt.rs b/src/vmm/src/arch/aarch64/fdt.rs index 83676c8fa35..71dc401fb32 100644 --- a/src/vmm/src/arch/aarch64/fdt.rs +++ b/src/vmm/src/arch/aarch64/fdt.rs @@ -460,7 +460,7 @@ mod tests { use crate::arch::aarch64::gic::create_gic; use crate::arch::aarch64::layout; use crate::device_manager::resources::ResourceAllocator; - use crate::test_utils::test_utils::arch_mem; + use crate::test_utils::arch_mem; const LEN: u64 = 4096; diff --git a/src/vmm/src/arch/aarch64/mod.rs b/src/vmm/src/arch/aarch64/mod.rs index 8aa481b6255..0cb6f1ed9ba 100644 --- a/src/vmm/src/arch/aarch64/mod.rs +++ b/src/vmm/src/arch/aarch64/mod.rs @@ -117,7 +117,7 @@ fn get_fdt_addr(mem: &GuestMemoryMmap) -> u64 { #[cfg(test)] mod tests { use super::*; - use crate::test_utils::test_utils::arch_mem; + use crate::test_utils::arch_mem; #[test] fn test_regions_lt_1024gb() { diff --git a/src/vmm/src/arch/aarch64/vcpu.rs b/src/vmm/src/arch/aarch64/vcpu.rs index cd294d6b1e1..84623b6d697 100644 --- a/src/vmm/src/arch/aarch64/vcpu.rs +++ b/src/vmm/src/arch/aarch64/vcpu.rs @@ -218,7 +218,7 @@ mod tests { use super::*; use crate::arch::aarch64::layout; - use crate::test_utils::test_utils::arch_mem; + use crate::test_utils::arch_mem; #[test] fn test_setup_regs() { diff --git a/src/vmm/src/arch/x86_64/mod.rs b/src/vmm/src/arch/x86_64/mod.rs index 79d6482c8e3..d2d6bd5781e 100644 --- a/src/vmm/src/arch/x86_64/mod.rs +++ b/src/vmm/src/arch/x86_64/mod.rs @@ -222,7 +222,7 @@ mod tests { use linux_loader::loader::bootparam::boot_e820_entry; use super::*; - use crate::test_utils::test_utils::{arch_mem, single_region_mem}; + use crate::test_utils::{arch_mem, single_region_mem}; #[test] fn regions_lt_4gb() { diff --git a/src/vmm/src/arch/x86_64/mptable.rs b/src/vmm/src/arch/x86_64/mptable.rs index ef9a67a68ed..9944ecee8fb 100644 --- a/src/vmm/src/arch/x86_64/mptable.rs +++ b/src/vmm/src/arch/x86_64/mptable.rs @@ -316,7 +316,7 @@ mod tests { use super::*; use crate::arch::SYSTEM_MEM_START; - use crate::test_utils::test_utils::single_region_mem_at; + use crate::test_utils::single_region_mem_at; use crate::vstate::memory::Bytes; fn table_entry_size(type_: u8) -> usize { diff --git a/src/vmm/src/arch/x86_64/regs.rs b/src/vmm/src/arch/x86_64/regs.rs index 283cf8b9b8c..c32bb6e88a6 100644 --- a/src/vmm/src/arch/x86_64/regs.rs +++ b/src/vmm/src/arch/x86_64/regs.rs @@ -243,7 +243,7 @@ mod tests { use kvm_ioctls::Kvm; use super::*; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; use crate::vstate::memory::{Bytes, GuestAddress, GuestMemoryMmap}; fn read_u64(gm: &GuestMemoryMmap, offset: u64) -> u64 { diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs index f6d34ab5f08..01c91638bdc 100644 --- a/src/vmm/src/builder.rs +++ b/src/vmm/src/builder.rs @@ -1033,7 +1033,7 @@ pub mod tests { use crate::devices::virtio::{TYPE_BALLOON, TYPE_BLOCK, TYPE_RNG}; use crate::mmds::data_store::{Mmds, MmdsVersion}; use crate::mmds::ns::MmdsNetworkStack; - use crate::test_utils::test_utils::{arch_mem, single_region_mem, single_region_mem_at}; + use crate::test_utils::{arch_mem, single_region_mem, single_region_mem_at}; use crate::vmm_config::balloon::{BalloonBuilder, BalloonDeviceConfig, BALLOON_DEV_ID}; use crate::vmm_config::boot_source::DEFAULT_KERNEL_CMDLINE; use crate::vmm_config::drive::{BlockBuilder, BlockDeviceConfig}; diff --git a/src/vmm/src/device_manager/legacy.rs b/src/vmm/src/device_manager/legacy.rs index c425f2d55d9..e9ea96621bc 100644 --- a/src/vmm/src/device_manager/legacy.rs +++ b/src/vmm/src/device_manager/legacy.rs @@ -238,7 +238,7 @@ impl PortIODeviceManager { #[cfg(test)] mod tests { use super::*; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; use crate::Vm; #[test] diff --git a/src/vmm/src/device_manager/mmio.rs b/src/vmm/src/device_manager/mmio.rs index 111be5f05cc..7cec4525d6b 100644 --- a/src/vmm/src/device_manager/mmio.rs +++ b/src/vmm/src/device_manager/mmio.rs @@ -535,7 +535,7 @@ mod tests { use crate::devices::virtio::device::{IrqTrigger, VirtioDevice}; use crate::devices::virtio::queue::Queue; use crate::devices::virtio::ActivateError; - use crate::test_utils::test_utils::multi_region_mem; + use crate::test_utils::multi_region_mem; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; use crate::{builder, Vm}; diff --git a/src/vmm/src/devices/virtio/balloon/device.rs b/src/vmm/src/devices/virtio/balloon/device.rs index 52ef96fbaf5..eea95ff4080 100644 --- a/src/vmm/src/devices/virtio/balloon/device.rs +++ b/src/vmm/src/devices/virtio/balloon/device.rs @@ -637,7 +637,7 @@ pub(crate) mod tests { }; use crate::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::{default_mem, VirtQueue}; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; use crate::vstate::memory::GuestAddress; impl Balloon { diff --git a/src/vmm/src/devices/virtio/balloon/util.rs b/src/vmm/src/devices/virtio/balloon/util.rs index 38302b80b2b..436223e6cc2 100644 --- a/src/vmm/src/devices/virtio/balloon/util.rs +++ b/src/vmm/src/devices/virtio/balloon/util.rs @@ -263,7 +263,7 @@ mod tests { /// BEGIN PROPERTY BASED TESTING use proptest::prelude::*; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; #[allow(clippy::let_with_type_underscore)] fn random_pfn_u32_max() -> impl Strategy> { diff --git a/src/vmm/src/devices/virtio/block/vhost_user/device.rs b/src/vmm/src/devices/virtio/block/vhost_user/device.rs index 04d4bb89251..e5d185f9bfe 100644 --- a/src/vmm/src/devices/virtio/block/vhost_user/device.rs +++ b/src/vmm/src/devices/virtio/block/vhost_user/device.rs @@ -376,7 +376,7 @@ mod tests { use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; use crate::devices::virtio::mmio::VIRTIO_MMIO_INT_CONFIG; - use crate::test_utils::test_utils::create_tmp_socket; + use crate::test_utils::create_tmp_socket; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/block/virtio/request.rs b/src/vmm/src/devices/virtio/block/virtio/request.rs index 73829608651..4eb8d7e2efd 100644 --- a/src/vmm/src/devices/virtio/block/virtio/request.rs +++ b/src/vmm/src/devices/virtio/block/virtio/request.rs @@ -667,7 +667,7 @@ mod tests { use proptest::strategy::{Map, Strategy, TupleUnion}; use crate::devices::virtio::block::virtio::test_utils::RequestDescriptorChain; - use crate::test_utils::test_utils::{multi_region_mem, single_region_mem}; + use crate::test_utils::{multi_region_mem, single_region_mem}; // Implements a "strategy" for producing arbitrary values of RequestType. // This can also be generated by a derive macro from `proptest_derive`, but the crate diff --git a/src/vmm/src/devices/virtio/iovec.rs b/src/vmm/src/devices/virtio/iovec.rs index d9ad8246773..3acde02fc05 100644 --- a/src/vmm/src/devices/virtio/iovec.rs +++ b/src/vmm/src/devices/virtio/iovec.rs @@ -393,7 +393,7 @@ mod tests { use super::{IoVecBuffer, IoVecBufferMut}; use crate::devices::virtio::queue::{Queue, VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::VirtQueue; - use crate::test_utils::test_utils::multi_region_mem; + use crate::test_utils::multi_region_mem; use crate::vstate::memory::{Bytes, GuestAddress, GuestMemoryMmap}; impl<'a> From<&'a [u8]> for IoVecBuffer { diff --git a/src/vmm/src/devices/virtio/mmio.rs b/src/vmm/src/devices/virtio/mmio.rs index 78d16f7860f..221d7307ff3 100644 --- a/src/vmm/src/devices/virtio/mmio.rs +++ b/src/vmm/src/devices/virtio/mmio.rs @@ -382,7 +382,7 @@ pub(crate) mod tests { use crate::devices::virtio::device::IrqTrigger; use crate::devices::virtio::device_status::DEVICE_NEEDS_RESET; use crate::devices::virtio::ActivateError; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; use crate::vstate::memory::GuestMemoryMmap; #[derive(Debug)] diff --git a/src/vmm/src/devices/virtio/net/device.rs b/src/vmm/src/devices/virtio/net/device.rs index 50f39c82d51..67c2e57aca7 100755 --- a/src/vmm/src/devices/virtio/net/device.rs +++ b/src/vmm/src/devices/virtio/net/device.rs @@ -956,7 +956,7 @@ pub mod tests { use crate::dumbo::EthernetFrame; use crate::logger::IncMetric; use crate::rate_limiter::{BucketUpdate, RateLimiter, TokenBucket, TokenType}; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; use crate::vstate::memory::{Address, GuestMemory}; #[test] diff --git a/src/vmm/src/devices/virtio/net/event_handler.rs b/src/vmm/src/devices/virtio/net/event_handler.rs index 38a78c91590..dd9a41afd8a 100644 --- a/src/vmm/src/devices/virtio/net/event_handler.rs +++ b/src/vmm/src/devices/virtio/net/event_handler.rs @@ -135,7 +135,7 @@ pub mod tests { use crate::devices::virtio::net::test_utils::test::TestHelper; use crate::devices::virtio::net::test_utils::NetQueue; use crate::devices::virtio::net::{MAX_BUFFER_SIZE, TX_INDEX}; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; #[test] fn test_event_handler() { diff --git a/src/vmm/src/devices/virtio/queue.rs b/src/vmm/src/devices/virtio/queue.rs index 6afc133cb5e..c183e8b2c00 100644 --- a/src/vmm/src/devices/virtio/queue.rs +++ b/src/vmm/src/devices/virtio/queue.rs @@ -1231,7 +1231,7 @@ mod tests { pub use super::*; use crate::devices::virtio::queue::QueueError::DescIndexOutOfBounds; use crate::devices::virtio::test_utils::{default_mem, VirtQueue}; - use crate::test_utils::test_utils::{multi_region_mem, single_region_mem}; + use crate::test_utils::{multi_region_mem, single_region_mem}; use crate::vstate::memory::GuestAddress; #[test] diff --git a/src/vmm/src/devices/virtio/test_utils.rs b/src/vmm/src/devices/virtio/test_utils.rs index 7137d7d3e1f..12983851560 100644 --- a/src/vmm/src/devices/virtio/test_utils.rs +++ b/src/vmm/src/devices/virtio/test_utils.rs @@ -11,7 +11,7 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use utils::u64_to_usize; use crate::devices::virtio::queue::Queue; -use crate::test_utils::test_utils::single_region_mem; +use crate::test_utils::single_region_mem; use crate::vstate::memory::{Address, Bytes, GuestAddress, GuestMemoryMmap}; #[macro_export] @@ -325,7 +325,7 @@ pub(crate) mod test { use crate::devices::virtio::net::MAX_BUFFER_SIZE; use crate::devices::virtio::queue::{Queue, VIRTQ_DESC_F_NEXT}; use crate::devices::virtio::test_utils::{VirtQueue, VirtqDesc}; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; use crate::vstate::memory::{Address, GuestAddress, GuestMemoryMmap}; pub fn create_virtio_mem() -> GuestMemoryMmap { diff --git a/src/vmm/src/devices/virtio/vhost_user.rs b/src/vmm/src/devices/virtio/vhost_user.rs index f5309e3e1e4..0274b59fdbf 100644 --- a/src/vmm/src/devices/virtio/vhost_user.rs +++ b/src/vmm/src/devices/virtio/vhost_user.rs @@ -465,7 +465,7 @@ mod tests { use utils::tempfile::TempFile; use super::*; - use crate::test_utils::test_utils::create_tmp_socket; + use crate::test_utils::create_tmp_socket; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/vsock/event_handler.rs b/src/vmm/src/devices/virtio/vsock/event_handler.rs index 2d483cbca7a..811ce20c9f5 100755 --- a/src/vmm/src/devices/virtio/vsock/event_handler.rs +++ b/src/vmm/src/devices/virtio/vsock/event_handler.rs @@ -225,7 +225,7 @@ mod tests { use super::*; use crate::devices::virtio::vsock::packet::VSOCK_PKT_HDR_SIZE; use crate::devices::virtio::vsock::test_utils::{EventHandlerContext, TestContext}; - use crate::test_utils::test_utils::multi_region_mem; + use crate::test_utils::multi_region_mem; use crate::vstate::memory::Bytes; #[test] diff --git a/src/vmm/src/devices/virtio/vsock/test_utils.rs b/src/vmm/src/devices/virtio/vsock/test_utils.rs index 53ae60f31cb..f9a31e2e815 100644 --- a/src/vmm/src/devices/virtio/vsock/test_utils.rs +++ b/src/vmm/src/devices/virtio/vsock/test_utils.rs @@ -17,7 +17,7 @@ use crate::devices::virtio::vsock::packet::{VsockPacket, VSOCK_PKT_HDR_SIZE}; use crate::devices::virtio::vsock::{ Vsock, VsockBackend, VsockChannel, VsockEpollListener, VsockError, }; -use crate::test_utils::test_utils::single_region_mem; +use crate::test_utils::single_region_mem; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; #[derive(Debug)] diff --git a/src/vmm/src/test_utils/mod.rs b/src/vmm/src/test_utils/mod.rs index cae9e807ebb..552ad102d19 100644 --- a/src/vmm/src/test_utils/mod.rs +++ b/src/vmm/src/test_utils/mod.rs @@ -3,5 +3,137 @@ #![allow(missing_docs)] +use std::sync::{Arc, Mutex}; + +use utils::tempdir::TempDir; +use vm_memory::GuestAddress; + +use crate::builder::build_microvm_for_boot; +use crate::resources::VmResources; +use crate::seccomp_filters::get_empty_filters; +use crate::test_utils::mock_resources::{MockBootSourceConfig, MockVmConfig, MockVmResources}; +use crate::vmm_config::boot_source::BootSourceConfig; +use crate::vmm_config::instance_info::InstanceInfo; +use crate::vmm_config::machine_config::HugePageConfig; +use crate::vstate::memory::{GuestMemoryExtension, GuestMemoryMmap}; +use crate::{EventManager, Vmm}; + pub mod mock_resources; -pub mod test_utils; + +/// Creates a [`GuestMemoryMmap`] with a single region of the given size starting at guest +/// physical address 0 and without dirty tracking. +pub fn single_region_mem(region_size: usize) -> GuestMemoryMmap { + single_region_mem_at(0, region_size) +} + +/// Creates a [`GuestMemoryMmap`] with a single region of the given size starting at the given +/// guest physical address `at` and without dirty tracking. +pub fn single_region_mem_at(at: u64, size: usize) -> GuestMemoryMmap { + multi_region_mem(&[(GuestAddress(at), size)]) +} + +/// Creates a [`GuestMemoryMmap`] with multiple regions and without dirty page tracking. +pub fn multi_region_mem(regions: &[(GuestAddress, usize)]) -> GuestMemoryMmap { + GuestMemoryMmap::from_raw_regions(regions, false, HugePageConfig::None) + .expect("Cannot initialize memory") +} + +/// Creates a [`GuestMemoryMmap`] of the given size with the contained regions laid out in +/// accordance with the requirements of the architecture on which the tests are being run. +pub fn arch_mem(mem_size_bytes: usize) -> GuestMemoryMmap { + multi_region_mem(&crate::arch::arch_memory_regions(mem_size_bytes)) +} + +pub fn create_vmm( + _kernel_image: Option<&str>, + is_diff: bool, + boot_microvm: bool, +) -> (Arc>, EventManager) { + let mut event_manager = EventManager::new().unwrap(); + let empty_seccomp_filters = get_empty_filters(); + + let boot_source_cfg = MockBootSourceConfig::new().with_default_boot_args(); + #[cfg(target_arch = "aarch64")] + let boot_source_cfg: BootSourceConfig = boot_source_cfg.into(); + #[cfg(target_arch = "x86_64")] + let boot_source_cfg: BootSourceConfig = match _kernel_image { + Some(kernel) => boot_source_cfg.with_kernel(kernel).into(), + None => boot_source_cfg.into(), + }; + let mock_vm_res = MockVmResources::new().with_boot_source(boot_source_cfg); + let resources: VmResources = if is_diff { + mock_vm_res + .with_vm_config(MockVmConfig::new().with_dirty_page_tracking().into()) + .into() + } else { + mock_vm_res.into() + }; + + let vmm = build_microvm_for_boot( + &InstanceInfo::default(), + &resources, + &mut event_manager, + &empty_seccomp_filters, + ) + .unwrap(); + + if boot_microvm { + vmm.lock().unwrap().resume_vm().unwrap(); + } + + (vmm, event_manager) +} + +pub fn default_vmm(kernel_image: Option<&str>) -> (Arc>, EventManager) { + create_vmm(kernel_image, false, true) +} + +pub fn default_vmm_no_boot(kernel_image: Option<&str>) -> (Arc>, EventManager) { + create_vmm(kernel_image, false, false) +} + +#[cfg(target_arch = "x86_64")] +pub fn dirty_tracking_vmm(kernel_image: Option<&str>) -> (Arc>, EventManager) { + create_vmm(kernel_image, true, true) +} + +#[allow(clippy::undocumented_unsafe_blocks)] +#[allow(clippy::cast_possible_truncation)] +pub fn create_tmp_socket() -> (TempDir, String) { + let tmp_dir = TempDir::new().unwrap(); + let tmp_dir_path_str = tmp_dir.as_path().to_str().unwrap(); + let tmp_socket_path = format!("{tmp_dir_path_str}/tmp_socket"); + + unsafe { + let socketfd = libc::socket(libc::AF_UNIX, libc::SOCK_STREAM, 0); + if socketfd < 0 { + panic!("Cannot create socket"); + } + let mut socket_addr = libc::sockaddr_un { + sun_family: libc::AF_UNIX as u16, + sun_path: [0; 108], + }; + + std::ptr::copy( + tmp_socket_path.as_ptr().cast(), + socket_addr.sun_path.as_mut_ptr(), + tmp_socket_path.as_bytes().len(), + ); + + let bind = libc::bind( + socketfd, + (&socket_addr as *const libc::sockaddr_un).cast(), + std::mem::size_of::() as u32, + ); + if bind < 0 { + panic!("Cannot bind socket"); + } + + let listen = libc::listen(socketfd, 1); + if listen < 0 { + panic!("Cannot listen on socket"); + } + } + + (tmp_dir, tmp_socket_path) +} diff --git a/src/vmm/src/test_utils/test_utils/mod.rs b/src/vmm/src/test_utils/test_utils/mod.rs deleted file mode 100644 index 2dc8b591f65..00000000000 --- a/src/vmm/src/test_utils/test_utils/mod.rs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -#![allow(missing_docs)] - -use std::sync::{Arc, Mutex}; - -use utils::tempdir::TempDir; -use vm_memory::GuestAddress; - -use crate::builder::build_microvm_for_boot; -use crate::resources::VmResources; -use crate::seccomp_filters::get_empty_filters; -use crate::test_utils::mock_resources::{MockBootSourceConfig, MockVmConfig, MockVmResources}; -use crate::vmm_config::boot_source::BootSourceConfig; -use crate::vmm_config::instance_info::InstanceInfo; -use crate::vmm_config::machine_config::HugePageConfig; -use crate::vstate::memory::{GuestMemoryExtension, GuestMemoryMmap}; -use crate::{EventManager, Vmm}; - -/// Creates a [`GuestMemoryMmap`] with a single region of the given size starting at guest -/// physical address 0 and without dirty tracking. -pub fn single_region_mem(region_size: usize) -> GuestMemoryMmap { - single_region_mem_at(0, region_size) -} - -/// Creates a [`GuestMemoryMmap`] with a single region of the given size starting at the given -/// guest physical address `at` and without dirty tracking. -pub fn single_region_mem_at(at: u64, size: usize) -> GuestMemoryMmap { - multi_region_mem(&[(GuestAddress(at), size)]) -} - -/// Creates a [`GuestMemoryMmap`] with multiple regions and without dirty page tracking. -pub fn multi_region_mem(regions: &[(GuestAddress, usize)]) -> GuestMemoryMmap { - GuestMemoryMmap::from_raw_regions(regions, false, HugePageConfig::None) - .expect("Cannot initialize memory") -} - -/// Creates a [`GuestMemoryMmap`] of the given size with the contained regions laid out in -/// accordance with the requirements of the architecture on which the tests are being run. -pub fn arch_mem(mem_size_bytes: usize) -> GuestMemoryMmap { - multi_region_mem(&crate::arch::arch_memory_regions(mem_size_bytes)) -} - -pub fn create_vmm( - _kernel_image: Option<&str>, - is_diff: bool, - boot_microvm: bool, -) -> (Arc>, EventManager) { - let mut event_manager = EventManager::new().unwrap(); - let empty_seccomp_filters = get_empty_filters(); - - let boot_source_cfg = MockBootSourceConfig::new().with_default_boot_args(); - #[cfg(target_arch = "aarch64")] - let boot_source_cfg: BootSourceConfig = boot_source_cfg.into(); - #[cfg(target_arch = "x86_64")] - let boot_source_cfg: BootSourceConfig = match _kernel_image { - Some(kernel) => boot_source_cfg.with_kernel(kernel).into(), - None => boot_source_cfg.into(), - }; - let mock_vm_res = MockVmResources::new().with_boot_source(boot_source_cfg); - let resources: VmResources = if is_diff { - mock_vm_res - .with_vm_config(MockVmConfig::new().with_dirty_page_tracking().into()) - .into() - } else { - mock_vm_res.into() - }; - - let vmm = build_microvm_for_boot( - &InstanceInfo::default(), - &resources, - &mut event_manager, - &empty_seccomp_filters, - ) - .unwrap(); - - if boot_microvm { - vmm.lock().unwrap().resume_vm().unwrap(); - } - - (vmm, event_manager) -} - -pub fn default_vmm(kernel_image: Option<&str>) -> (Arc>, EventManager) { - create_vmm(kernel_image, false, true) -} - -pub fn default_vmm_no_boot(kernel_image: Option<&str>) -> (Arc>, EventManager) { - create_vmm(kernel_image, false, false) -} - -#[cfg(target_arch = "x86_64")] -pub fn dirty_tracking_vmm(kernel_image: Option<&str>) -> (Arc>, EventManager) { - create_vmm(kernel_image, true, true) -} - -#[allow(clippy::undocumented_unsafe_blocks)] -#[allow(clippy::cast_possible_truncation)] -pub fn create_tmp_socket() -> (TempDir, String) { - let tmp_dir = TempDir::new().unwrap(); - let tmp_dir_path_str = tmp_dir.as_path().to_str().unwrap(); - let tmp_socket_path = format!("{tmp_dir_path_str}/tmp_socket"); - - unsafe { - let socketfd = libc::socket(libc::AF_UNIX, libc::SOCK_STREAM, 0); - if socketfd < 0 { - panic!("Cannot create socket"); - } - let mut socket_addr = libc::sockaddr_un { - sun_family: libc::AF_UNIX as u16, - sun_path: [0; 108], - }; - - std::ptr::copy( - tmp_socket_path.as_ptr().cast(), - socket_addr.sun_path.as_mut_ptr(), - tmp_socket_path.as_bytes().len(), - ); - - let bind = libc::bind( - socketfd, - (&socket_addr as *const libc::sockaddr_un).cast(), - std::mem::size_of::() as u32, - ); - if bind < 0 { - panic!("Cannot bind socket"); - } - - let listen = libc::listen(socketfd, 1); - if listen < 0 { - panic!("Cannot listen on socket"); - } - } - - (tmp_dir, tmp_socket_path) -} diff --git a/src/vmm/src/vstate/vm.rs b/src/vmm/src/vstate/vm.rs index 363bbf42136..c227fae0b7c 100644 --- a/src/vmm/src/vstate/vm.rs +++ b/src/vmm/src/vstate/vm.rs @@ -470,7 +470,7 @@ pub(crate) mod tests { use super::*; #[cfg(target_arch = "x86_64")] use crate::snapshot::Snapshot; - use crate::test_utils::test_utils::single_region_mem; + use crate::test_utils::single_region_mem; use crate::vstate::memory::GuestMemoryMmap; // Auxiliary function being used throughout the tests. diff --git a/src/vmm/tests/integration_tests.rs b/src/vmm/tests/integration_tests.rs index 4da2127d695..40e230496c4 100644 --- a/src/vmm/tests/integration_tests.rs +++ b/src/vmm/tests/integration_tests.rs @@ -15,10 +15,10 @@ use vmm::rpc_interface::{ }; use vmm::seccomp_filters::get_empty_filters; use vmm::snapshot::Snapshot; -use vmm::test_utils::mock_resources::{MockVmResources, NOISY_KERNEL_IMAGE}; #[cfg(target_arch = "x86_64")] -use vmm::test_utils::test_utils::dirty_tracking_vmm; -use vmm::test_utils::test_utils::{create_vmm, default_vmm, default_vmm_no_boot}; +use vmm::test_utils::dirty_tracking_vmm; +use vmm::test_utils::mock_resources::{MockVmResources, NOISY_KERNEL_IMAGE}; +use vmm::test_utils::{create_vmm, default_vmm, default_vmm_no_boot}; use vmm::vmm_config::balloon::BalloonDeviceConfig; use vmm::vmm_config::boot_source::BootSourceConfig; use vmm::vmm_config::drive::BlockDeviceConfig; From 1fb69c81162951064f1eaf9833c6025f37cbc245 Mon Sep 17 00:00:00 2001 From: Egor Lazarchuk Date: Sat, 24 Aug 2024 15:07:48 +0100 Subject: [PATCH 3/5] refactor(vmm): copy part of utils to vmm/utils Most modules in `utils` are `vmm` specific, so copy them into `vmm/utils`. The actual removal of those files from `utils` will happen in later commit. Signed-off-by: Egor Lazarchuk --- Cargo.lock | 1 + src/vmm/Cargo.toml | 1 + src/vmm/src/arch/aarch64/vcpu.rs | 2 +- src/vmm/src/arch/x86_64/interrupts.rs | 7 +- src/vmm/src/arch/x86_64/mod.rs | 2 +- src/vmm/src/arch/x86_64/msr.rs | 2 +- src/vmm/src/arch/x86_64/regs.rs | 8 +- src/vmm/src/builder.rs | 8 +- src/vmm/src/cpu_config/x86_64/cpuid/mod.rs | 2 +- src/vmm/src/device_manager/legacy.rs | 2 +- src/vmm/src/device_manager/mmio.rs | 3 +- src/vmm/src/device_manager/persist.rs | 3 +- src/vmm/src/devices/acpi/vmgenid.rs | 2 +- src/vmm/src/devices/legacy/i8042.rs | 2 +- src/vmm/src/devices/legacy/mod.rs | 2 +- src/vmm/src/devices/legacy/serial.rs | 7 +- src/vmm/src/devices/virtio/balloon/device.rs | 4 +- .../devices/virtio/balloon/event_handler.rs | 2 +- src/vmm/src/devices/virtio/balloon/util.rs | 3 +- src/vmm/src/devices/virtio/block/device.rs | 2 +- .../devices/virtio/block/vhost_user/device.rs | 6 +- .../virtio/block/vhost_user/event_handler.rs | 2 +- .../src/devices/virtio/block/virtio/device.rs | 11 +- .../virtio/block/virtio/event_handler.rs | 2 +- .../virtio/block/virtio/io/async_io.rs | 2 +- .../src/devices/virtio/block/virtio/io/mod.rs | 9 +- .../devices/virtio/block/virtio/persist.rs | 5 +- .../devices/virtio/block/virtio/test_utils.rs | 3 +- src/vmm/src/devices/virtio/device.rs | 3 +- src/vmm/src/devices/virtio/mmio.rs | 10 +- src/vmm/src/devices/virtio/net/device.rs | 9 +- .../src/devices/virtio/net/event_handler.rs | 2 +- src/vmm/src/devices/virtio/net/persist.rs | 2 +- src/vmm/src/devices/virtio/net/tap.rs | 13 +- src/vmm/src/devices/virtio/net/test_utils.rs | 9 +- src/vmm/src/devices/virtio/persist.rs | 3 +- src/vmm/src/devices/virtio/rng/device.rs | 2 +- .../src/devices/virtio/rng/event_handler.rs | 2 +- src/vmm/src/devices/virtio/test_utils.rs | 5 +- src/vmm/src/devices/virtio/vhost_user.rs | 5 +- .../devices/virtio/vsock/csm/connection.rs | 6 +- src/vmm/src/devices/virtio/vsock/csm/txbuf.rs | 2 +- src/vmm/src/devices/virtio/vsock/device.rs | 4 +- .../src/devices/virtio/vsock/event_handler.rs | 2 +- src/vmm/src/devices/virtio/vsock/mod.rs | 2 +- src/vmm/src/devices/virtio/vsock/persist.rs | 3 +- .../src/devices/virtio/vsock/test_utils.rs | 5 +- .../src/devices/virtio/vsock/unix/muxer.rs | 5 +- src/vmm/src/dumbo/mod.rs | 3 +- src/vmm/src/dumbo/pdu/arp.rs | 3 +- src/vmm/src/dumbo/pdu/bytes.rs | 2 +- src/vmm/src/dumbo/pdu/ethernet.rs | 5 +- src/vmm/src/dumbo/tcp/connection.rs | 2 +- src/vmm/src/io_uring/mod.rs | 9 +- src/vmm/src/io_uring/probe.rs | 5 +- src/vmm/src/io_uring/queue/submission.rs | 2 +- src/vmm/src/lib.rs | 16 +- src/vmm/src/logger/logging.rs | 2 +- src/vmm/src/logger/metrics.rs | 3 +- src/vmm/src/mmds/ns.rs | 2 +- src/vmm/src/mmds/persist.rs | 2 +- src/vmm/src/persist.rs | 9 +- src/vmm/src/resources.rs | 6 +- src/vmm/src/rpc_interface.rs | 2 +- src/vmm/src/signal_handler.rs | 4 +- src/vmm/src/test_utils/mod.rs | 2 +- src/vmm/src/utils/byte_order.rs | 119 +++++++++++++ src/vmm/src/utils/mod.rs | 57 +++++++ src/vmm/src/utils/net/ipv4addr.rs | 56 ++++++ src/vmm/src/utils/net/mac.rs | 159 ++++++++++++++++++ src/vmm/src/utils/net/mod.rs | 16 ++ src/vmm/src/utils/signal.rs | 22 +++ src/vmm/src/utils/sm.rs | 144 ++++++++++++++++ src/vmm/src/vmm_config/boot_source.rs | 3 +- src/vmm/src/vmm_config/drive.rs | 3 +- src/vmm/src/vmm_config/metrics.rs | 3 +- src/vmm/src/vmm_config/net.rs | 2 +- src/vmm/src/vmm_config/vsock.rs | 3 +- src/vmm/src/vstate/memory.rs | 7 +- src/vmm/src/vstate/vcpu/mod.rs | 18 +- src/vmm/src/vstate/vcpu/x86_64.rs | 10 +- src/vmm/src/vstate/vm.rs | 4 +- src/vmm/tests/devices.rs | 2 +- src/vmm/tests/io_uring.rs | 6 +- 84 files changed, 732 insertions(+), 180 deletions(-) create mode 100644 src/vmm/src/utils/byte_order.rs create mode 100644 src/vmm/src/utils/mod.rs create mode 100644 src/vmm/src/utils/net/ipv4addr.rs create mode 100644 src/vmm/src/utils/net/mac.rs create mode 100644 src/vmm/src/utils/net/mod.rs create mode 100644 src/vmm/src/utils/signal.rs create mode 100644 src/vmm/src/utils/sm.rs diff --git a/Cargo.lock b/Cargo.lock index 187cba000cd..ea7b5c40621 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1566,6 +1566,7 @@ dependencies = [ "vm-fdt", "vm-memory", "vm-superio", + "vmm-sys-util", "zerocopy", ] diff --git a/src/vmm/Cargo.toml b/src/vmm/Cargo.toml index d91eacfee6d..e8815464440 100644 --- a/src/vmm/Cargo.toml +++ b/src/vmm/Cargo.toml @@ -43,6 +43,7 @@ vhost = { version = "0.11.0", features = ["vhost-user-frontend"] } vm-allocator = "0.1.0" vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-bitmap"] } vm-superio = "0.8.0" +vmm-sys-util = { version = "0.12.1", features = ["with-serde"] } zerocopy = { version = "0.7.35" } [target.'cfg(target_arch = "aarch64")'.dependencies] diff --git a/src/vmm/src/arch/aarch64/vcpu.rs b/src/vmm/src/arch/aarch64/vcpu.rs index 84623b6d697..66700917065 100644 --- a/src/vmm/src/arch/aarch64/vcpu.rs +++ b/src/vmm/src/arch/aarch64/vcpu.rs @@ -29,7 +29,7 @@ pub enum VcpuError { /// Failed to set multiprocessor state: {0} SetMp(kvm_ioctls::Error), /// Failed FamStructWrapper operation: {0} - Fam(utils::fam::Error), + Fam(crate::utils::fam::Error), /// {0} GetMidrEl1(String), } diff --git a/src/vmm/src/arch/x86_64/interrupts.rs b/src/vmm/src/arch/x86_64/interrupts.rs index c211a6e6085..09a2dc6ec84 100644 --- a/src/vmm/src/arch/x86_64/interrupts.rs +++ b/src/vmm/src/arch/x86_64/interrupts.rs @@ -7,7 +7,8 @@ use kvm_bindings::kvm_lapic_state; use kvm_ioctls::VcpuFd; -use utils::byte_order; + +use crate::utils::byte_order; /// Errors thrown while configuring the LAPIC. #[derive(Debug, thiserror::Error, displaydoc::Display, PartialEq, Eq)] @@ -103,7 +104,9 @@ mod tests { #[test] fn test_apic_delivery_mode() { - let mut v: Vec = (0..20).map(|_| utils::rand::xor_pseudo_rng_u32()).collect(); + let mut v: Vec = (0..20) + .map(|_| crate::utils::rand::xor_pseudo_rng_u32()) + .collect(); v.iter_mut() .for_each(|x| *x = set_apic_delivery_mode(*x, 2)); diff --git a/src/vmm/src/arch/x86_64/mod.rs b/src/vmm/src/arch/x86_64/mod.rs index d2d6bd5781e..1066d9734c3 100644 --- a/src/vmm/src/arch/x86_64/mod.rs +++ b/src/vmm/src/arch/x86_64/mod.rs @@ -24,10 +24,10 @@ pub mod gen; use linux_loader::configurator::linux::LinuxBootConfigurator; use linux_loader::configurator::{BootConfigurator, BootParams}; use linux_loader::loader::bootparam::boot_params; -use utils::u64_to_usize; use crate::arch::InitrdConfig; use crate::device_manager::resources::ResourceAllocator; +use crate::utils::u64_to_usize; use crate::vstate::memory::{ Address, GuestAddress, GuestMemory, GuestMemoryMmap, GuestMemoryRegion, }; diff --git a/src/vmm/src/arch/x86_64/msr.rs b/src/vmm/src/arch/x86_64/msr.rs index d08caf9301d..a05fac79961 100644 --- a/src/vmm/src/arch/x86_64/msr.rs +++ b/src/vmm/src/arch/x86_64/msr.rs @@ -16,7 +16,7 @@ use crate::cpu_config::x86_64::cpuid::common::GetCpuidError; /// MSR related errors. pub enum MsrError { /// Failed to create `vmm_sys_util::fam::FamStructWrapper` for MSRs - Fam(#[from] utils::fam::Error), + Fam(#[from] crate::utils::fam::Error), /// Failed to get MSR index list: {0} GetMsrIndexList(kvm_ioctls::Error), /// Invalid CPU vendor: {0} diff --git a/src/vmm/src/arch/x86_64/regs.rs b/src/vmm/src/arch/x86_64/regs.rs index c32bb6e88a6..30e4bf2cc82 100644 --- a/src/vmm/src/arch/x86_64/regs.rs +++ b/src/vmm/src/arch/x86_64/regs.rs @@ -44,7 +44,7 @@ pub enum RegsError { /// Error type for [`setup_fpu`]. #[derive(Debug, derive_more::From, PartialEq, Eq, thiserror::Error)] #[error("Failed to setup FPU: {0}")] -pub struct SetupFpuError(utils::errno::Error); +pub struct SetupFpuError(crate::utils::errno::Error); /// Configure Floating-Point Unit (FPU) registers for a given CPU. /// @@ -68,7 +68,7 @@ pub fn setup_fpu(vcpu: &VcpuFd) -> Result<(), SetupFpuError> { /// Error type of [`setup_regs`]. #[derive(Debug, derive_more::From, PartialEq, Eq, thiserror::Error)] #[error("Failed to setup registers: {0}")] -pub struct SetupRegistersError(utils::errno::Error); +pub struct SetupRegistersError(crate::utils::errno::Error); /// Configure base registers for a given CPU. /// @@ -103,13 +103,13 @@ pub fn setup_regs(vcpu: &VcpuFd, boot_ip: u64) -> Result<(), SetupRegistersError #[derive(Debug, thiserror::Error, displaydoc::Display, PartialEq, Eq)] pub enum SetupSpecialRegistersError { /// Failed to get special registers: {0} - GetSpecialRegisters(utils::errno::Error), + GetSpecialRegisters(crate::utils::errno::Error), /// Failed to configure segments and special registers: {0} ConfigureSegmentsAndSpecialRegisters(RegsError), /// Failed to setup page tables: {0} SetupPageTables(RegsError), /// Failed to set special registers: {0} - SetSpecialRegisters(utils::errno::Error), + SetSpecialRegisters(crate::utils::errno::Error), } /// Configures the special registers and system page tables for a given CPU. diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs index 01c91638bdc..a14c55f35ab 100644 --- a/src/vmm/src/builder.rs +++ b/src/vmm/src/builder.rs @@ -19,9 +19,7 @@ use linux_loader::loader::pe::PE as Loader; use linux_loader::loader::KernelLoader; use seccompiler::BpfThreadMap; use userfaultfd::Uffd; -use utils::eventfd::EventFd; use utils::time::TimestampUs; -use utils::u64_to_usize; use vm_memory::ReadVolatile; #[cfg(target_arch = "aarch64")] use vm_superio::Rtc; @@ -61,6 +59,8 @@ use crate::logger::{debug, error}; use crate::persist::{MicrovmState, MicrovmStateError}; use crate::resources::VmResources; use crate::snapshot::Persist; +use crate::utils::eventfd::EventFd; +use crate::utils::u64_to_usize; use crate::vmm_config::boot_source::BootConfig; use crate::vmm_config::instance_info::InstanceInfo; use crate::vmm_config::machine_config::{VmConfig, VmConfigError}; @@ -412,7 +412,7 @@ pub enum BuildMicrovmFromSnapshotError { /// Failed to create microVM and vCPUs: {0} CreateMicrovmAndVcpus(#[from] StartMicrovmError), /// Could not access KVM: {0} - KvmAccess(#[from] utils::errno::Error), + KvmAccess(#[from] crate::utils::errno::Error), /// Error configuring the TSC, frequency not present in the given snapshot. TscFrequencyNotPresent, #[cfg(target_arch = "x86_64")] @@ -1022,7 +1022,6 @@ pub mod tests { use std::io::Write; use linux_loader::cmdline::Cmdline; - use utils::tempfile::TempFile; use super::*; use crate::arch::DeviceType; @@ -1034,6 +1033,7 @@ pub mod tests { use crate::mmds::data_store::{Mmds, MmdsVersion}; use crate::mmds::ns::MmdsNetworkStack; use crate::test_utils::{arch_mem, single_region_mem, single_region_mem_at}; + use crate::utils::tempfile::TempFile; use crate::vmm_config::balloon::{BalloonBuilder, BalloonDeviceConfig, BALLOON_DEV_ID}; use crate::vmm_config::boot_source::DEFAULT_KERNEL_CMDLINE; use crate::vmm_config::drive::{BlockBuilder, BlockDeviceConfig}; diff --git a/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs b/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs index ea5dbd6d286..f557ed2e621 100644 --- a/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs +++ b/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs @@ -410,7 +410,7 @@ impl TryFrom for Cpuid { } impl TryFrom for kvm_bindings::CpuId { - type Error = utils::fam::Error; + type Error = crate::utils::fam::Error; fn try_from(cpuid: Cpuid) -> Result { let entries = cpuid diff --git a/src/vmm/src/device_manager/legacy.rs b/src/vmm/src/device_manager/legacy.rs index e9ea96621bc..035756f261e 100644 --- a/src/vmm/src/device_manager/legacy.rs +++ b/src/vmm/src/device_manager/legacy.rs @@ -12,12 +12,12 @@ use std::sync::{Arc, Mutex}; use acpi_tables::{aml, Aml}; use kvm_ioctls::VmFd; use libc::EFD_NONBLOCK; -use utils::eventfd::EventFd; use vm_superio::Serial; use crate::devices::bus::BusDevice; use crate::devices::legacy::serial::SerialOut; use crate::devices::legacy::{EventFdTrigger, SerialDevice, SerialEventsWrapper}; +use crate::utils::eventfd::EventFd; /// Errors corresponding to the `PortIODeviceManager`. #[derive(Debug, derive_more::From, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/device_manager/mmio.rs b/src/vmm/src/device_manager/mmio.rs index 7cec4525d6b..91878babbb9 100644 --- a/src/vmm/src/device_manager/mmio.rs +++ b/src/vmm/src/device_manager/mmio.rs @@ -529,13 +529,12 @@ mod tests { use std::sync::Arc; - use utils::eventfd::EventFd; - use super::*; use crate::devices::virtio::device::{IrqTrigger, VirtioDevice}; use crate::devices::virtio::queue::Queue; use crate::devices::virtio::ActivateError; use crate::test_utils::multi_region_mem; + use crate::utils::eventfd::EventFd; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; use crate::{builder, Vm}; diff --git a/src/vmm/src/device_manager/persist.rs b/src/vmm/src/device_manager/persist.rs index 7a51bf790e9..8b16a2881d6 100644 --- a/src/vmm/src/device_manager/persist.rs +++ b/src/vmm/src/device_manager/persist.rs @@ -652,13 +652,12 @@ impl<'a> Persist<'a> for MMIODeviceManager { #[cfg(test)] mod tests { - use utils::tempfile::TempFile; - use super::*; use crate::builder::tests::*; use crate::devices::virtio::block::CacheType; use crate::resources::VmmConfig; use crate::snapshot::Snapshot; + use crate::utils::tempfile::TempFile; use crate::vmm_config::balloon::BalloonDeviceConfig; use crate::vmm_config::entropy::EntropyDeviceConfig; use crate::vmm_config::net::NetworkInterfaceConfig; diff --git a/src/vmm/src/devices/acpi/vmgenid.rs b/src/vmm/src/devices/acpi/vmgenid.rs index 47fb456e7ae..b06d088e25e 100644 --- a/src/vmm/src/devices/acpi/vmgenid.rs +++ b/src/vmm/src/devices/acpi/vmgenid.rs @@ -6,13 +6,13 @@ use aws_lc_rs::error::Unspecified as RandError; use aws_lc_rs::rand; use log::{debug, error}; use serde::{Deserialize, Serialize}; -use utils::eventfd::EventFd; use vm_memory::{GuestAddress, GuestMemoryError}; use vm_superio::Trigger; use super::super::legacy::EventFdTrigger; use crate::device_manager::resources::ResourceAllocator; use crate::snapshot::Persist; +use crate::utils::eventfd::EventFd; use crate::vstate::memory::{Bytes, GuestMemoryMmap}; /// Bytes of memory we allocate for VMGenID device diff --git a/src/vmm/src/devices/legacy/i8042.rs b/src/vmm/src/devices/legacy/i8042.rs index b84f8c43f5d..8ab97ce3e9d 100644 --- a/src/vmm/src/devices/legacy/i8042.rs +++ b/src/vmm/src/devices/legacy/i8042.rs @@ -10,9 +10,9 @@ use std::num::Wrapping; use log::warn; use serde::Serialize; -use utils::eventfd::EventFd; use crate::logger::{error, IncMetric, SharedIncMetric}; +use crate::utils::eventfd::EventFd; /// Errors thrown by the i8042 device. #[derive(Debug, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/devices/legacy/mod.rs b/src/vmm/src/devices/legacy/mod.rs index 224f77c7bb0..f84c39207bf 100644 --- a/src/vmm/src/devices/legacy/mod.rs +++ b/src/vmm/src/devices/legacy/mod.rs @@ -16,7 +16,6 @@ use std::ops::Deref; use serde::ser::SerializeMap; use serde::Serializer; -use utils::eventfd::EventFd; use vm_superio::Trigger; pub use self::i8042::{I8042Device, I8042Error as I8042DeviceError}; @@ -25,6 +24,7 @@ pub use self::rtc_pl031::RTCDevice; pub use self::serial::{ SerialDevice, SerialEventsWrapper, SerialWrapper, IER_RDA_BIT, IER_RDA_OFFSET, }; +use crate::utils::eventfd::EventFd; /// Wrapper for implementing the trigger functionality for `EventFd`. /// diff --git a/src/vmm/src/devices/legacy/serial.rs b/src/vmm/src/devices/legacy/serial.rs index d711d94f608..609afe79077 100644 --- a/src/vmm/src/devices/legacy/serial.rs +++ b/src/vmm/src/devices/legacy/serial.rs @@ -14,12 +14,12 @@ use std::os::unix::io::{AsRawFd, RawFd}; use event_manager::{EventOps, Events, MutEventSubscriber}; use log::{error, warn}; use serde::Serialize; -use utils::epoll::EventSet; use vm_superio::serial::{Error as SerialError, SerialEvents}; use vm_superio::{Serial, Trigger}; use crate::devices::legacy::EventFdTrigger; use crate::logger::{IncMetric, SharedIncMetric}; +use crate::utils::epoll::EventSet; /// Received Data Available interrupt - for letting the driver know that /// there is some pending data to be processed. @@ -365,10 +365,9 @@ impl mod tests { #![allow(clippy::undocumented_unsafe_blocks)] - use utils::eventfd::EventFd; - use super::*; use crate::logger::IncMetric; + use crate::utils::eventfd::EventFd; #[test] fn test_serial_bus_read() { @@ -419,7 +418,7 @@ mod tests { assert!(is_fifo(fds[1])); // Files arent fifos - let tmp_file = utils::tempfile::TempFile::new().unwrap(); + let tmp_file = crate::utils::tempfile::TempFile::new().unwrap(); assert!(!is_fifo(tmp_file.as_file().as_raw_fd())); } diff --git a/src/vmm/src/devices/virtio/balloon/device.rs b/src/vmm/src/devices/virtio/balloon/device.rs index eea95ff4080..f4f91e36907 100644 --- a/src/vmm/src/devices/virtio/balloon/device.rs +++ b/src/vmm/src/devices/virtio/balloon/device.rs @@ -7,8 +7,6 @@ use std::time::Duration; use log::error; use serde::Serialize; use timerfd::{ClockId, SetTimeFlags, TimerFd, TimerState}; -use utils::eventfd::EventFd; -use utils::u64_to_usize; use super::super::device::{DeviceState, VirtioDevice}; use super::super::queue::Queue; @@ -28,6 +26,8 @@ use crate::devices::virtio::balloon::BalloonError; use crate::devices::virtio::device::{IrqTrigger, IrqType}; use crate::devices::virtio::gen::virtio_blk::VIRTIO_F_VERSION_1; use crate::logger::IncMetric; +use crate::utils::eventfd::EventFd; +use crate::utils::u64_to_usize; use crate::vstate::memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemoryMmap}; const SIZE_OF_U32: usize = std::mem::size_of::(); diff --git a/src/vmm/src/devices/virtio/balloon/event_handler.rs b/src/vmm/src/devices/virtio/balloon/event_handler.rs index 283f8bc1457..d554a893e7a 100644 --- a/src/vmm/src/devices/virtio/balloon/event_handler.rs +++ b/src/vmm/src/devices/virtio/balloon/event_handler.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; -use utils::epoll::EventSet; use super::{report_balloon_event_fail, DEFLATE_INDEX, INFLATE_INDEX, STATS_INDEX}; use crate::devices::virtio::balloon::device::Balloon; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; +use crate::utils::epoll::EventSet; impl Balloon { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/balloon/util.rs b/src/vmm/src/devices/virtio/balloon/util.rs index 436223e6cc2..f8cf7aa2000 100644 --- a/src/vmm/src/devices/virtio/balloon/util.rs +++ b/src/vmm/src/devices/virtio/balloon/util.rs @@ -3,10 +3,9 @@ use std::io; -use utils::u64_to_usize; - use super::{RemoveRegionError, MAX_PAGE_COMPACT_BUFFER}; use crate::logger::error; +use crate::utils::u64_to_usize; use crate::vstate::memory::{GuestAddress, GuestMemory, GuestMemoryMmap, GuestMemoryRegion}; /// This takes a vector of page frame numbers, and compacts them diff --git a/src/vmm/src/devices/virtio/block/device.rs b/src/vmm/src/devices/virtio/block/device.rs index fe201f7246d..afb3c7febd0 100644 --- a/src/vmm/src/devices/virtio/block/device.rs +++ b/src/vmm/src/devices/virtio/block/device.rs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; -use utils::eventfd::EventFd; use super::persist::{BlockConstructorArgs, BlockState}; use super::vhost_user::device::{VhostUserBlock, VhostUserBlockConfig}; @@ -13,6 +12,7 @@ use crate::devices::virtio::queue::Queue; use crate::devices::virtio::{ActivateError, TYPE_BLOCK}; use crate::rate_limiter::BucketUpdate; use crate::snapshot::Persist; +use crate::utils::eventfd::EventFd; use crate::vmm_config::drive::BlockDeviceConfig; use crate::vstate::memory::GuestMemoryMmap; diff --git a/src/vmm/src/devices/virtio/block/vhost_user/device.rs b/src/vmm/src/devices/virtio/block/vhost_user/device.rs index e5d185f9bfe..9b6dda0bd57 100644 --- a/src/vmm/src/devices/virtio/block/vhost_user/device.rs +++ b/src/vmm/src/devices/virtio/block/vhost_user/device.rs @@ -7,8 +7,6 @@ use std::sync::Arc; use log::error; -use utils::eventfd::EventFd; -use utils::u64_to_usize; use vhost::vhost_user::message::*; use vhost::vhost_user::Frontend; @@ -26,6 +24,8 @@ use crate::devices::virtio::vhost_user_metrics::{ }; use crate::devices::virtio::{ActivateError, TYPE_BLOCK}; use crate::logger::{log_dev_preview_warning, IncMetric, StoreMetric}; +use crate::utils::eventfd::EventFd; +use crate::utils::u64_to_usize; use crate::vmm_config::drive::BlockDeviceConfig; use crate::vstate::memory::GuestMemoryMmap; @@ -370,13 +370,13 @@ mod tests { use std::os::unix::net::UnixStream; use std::sync::atomic::Ordering; - use utils::tempfile::TempFile; use vhost::{VhostUserMemoryRegionInfo, VringConfigData}; use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; use crate::devices::virtio::mmio::VIRTIO_MMIO_INT_CONFIG; use crate::test_utils::create_tmp_socket; + use crate::utils::tempfile::TempFile; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs b/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs index 3fbb4a4abba..8c57f6f599f 100644 --- a/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs +++ b/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs @@ -1,11 +1,11 @@ // Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; -use utils::epoll::EventSet; use super::VhostUserBlock; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; +use crate::utils::epoll::EventSet; impl VhostUserBlock { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/block/virtio/device.rs b/src/vmm/src/devices/virtio/block/virtio/device.rs index 5c8fb95886e..57524157043 100644 --- a/src/vmm/src/devices/virtio/block/virtio/device.rs +++ b/src/vmm/src/devices/virtio/block/virtio/device.rs @@ -15,8 +15,6 @@ use std::sync::Arc; use block_io::FileEngine; use serde::{Deserialize, Serialize}; -use utils::eventfd::EventFd; -use utils::u64_to_usize; use super::io::async_io; use super::request::*; @@ -35,6 +33,8 @@ use crate::devices::virtio::queue::Queue; use crate::devices::virtio::{ActivateError, TYPE_BLOCK}; use crate::logger::{error, warn, IncMetric}; use crate::rate_limiter::{BucketUpdate, RateLimiter}; +use crate::utils::eventfd::EventFd; +use crate::utils::u64_to_usize; use crate::vmm_config::drive::BlockDeviceConfig; use crate::vmm_config::RateLimiterConfig; use crate::vstate::memory::GuestMemoryMmap; @@ -678,8 +678,6 @@ mod tests { use std::thread; use std::time::Duration; - use utils::tempfile::TempFile; - use super::*; use crate::check_metric_after_block; use crate::devices::virtio::block::virtio::test_utils::{ @@ -691,6 +689,7 @@ mod tests { use crate::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::{default_mem, VirtQueue}; use crate::rate_limiter::TokenType; + use crate::utils::tempfile::TempFile; use crate::vstate::memory::{Address, Bytes, GuestAddress}; #[test] @@ -1084,7 +1083,9 @@ mod tests { let status_addr = GuestAddress(vq.dtable[2].addr.get()); let empty_data = vec![0; 512]; - let rand_data = utils::rand::rand_alphanumerics(1024).as_bytes().to_vec(); + let rand_data = crate::utils::rand::rand_alphanumerics(1024) + .as_bytes() + .to_vec(); // Write with invalid data len (not a multiple of 512). { diff --git a/src/vmm/src/devices/virtio/block/virtio/event_handler.rs b/src/vmm/src/devices/virtio/block/virtio/event_handler.rs index cd931026c1f..67fe519044c 100644 --- a/src/vmm/src/devices/virtio/block/virtio/event_handler.rs +++ b/src/vmm/src/devices/virtio/block/virtio/event_handler.rs @@ -1,12 +1,12 @@ // Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; -use utils::epoll::EventSet; use super::io::FileEngine; use crate::devices::virtio::block::virtio::device::VirtioBlock; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; +use crate::utils::epoll::EventSet; impl VirtioBlock { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs b/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs index 0380db1dd74..7ed9a9f18d1 100644 --- a/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs +++ b/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs @@ -6,7 +6,6 @@ use std::fs::File; use std::os::fd::RawFd; use std::os::unix::io::AsRawFd; -use utils::eventfd::EventFd; use vm_memory::GuestMemoryError; use crate::devices::virtio::block::virtio::io::UserDataError; @@ -15,6 +14,7 @@ use crate::io_uring::operation::{Cqe, OpCode, Operation}; use crate::io_uring::restriction::Restriction; use crate::io_uring::{self, IoUring, IoUringError}; use crate::logger::log_dev_preview_warning; +use crate::utils::eventfd::EventFd; use crate::vstate::memory::{GuestAddress, GuestMemory, GuestMemoryExtension, GuestMemoryMmap}; #[derive(Debug, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/devices/virtio/block/virtio/io/mod.rs b/src/vmm/src/devices/virtio/block/virtio/io/mod.rs index 4dcb61fd86f..1cb30aeae56 100644 --- a/src/vmm/src/devices/virtio/block/virtio/io/mod.rs +++ b/src/vmm/src/devices/virtio/block/virtio/io/mod.rs @@ -189,11 +189,10 @@ pub mod tests { use std::os::unix::ffi::OsStrExt; use std::os::unix::io::FromRawFd; - use utils::tempfile::TempFile; - use utils::u64_to_usize; - use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; + use crate::utils::tempfile::TempFile; + use crate::utils::u64_to_usize; use crate::vmm_config::machine_config::HugePageConfig; use crate::vstate::memory::{Bitmap, Bytes, GuestMemory, GuestMemoryExtension}; @@ -280,7 +279,7 @@ pub mod tests { let file = TempFile::new().unwrap().into_file(); let mut engine = FileEngine::from_file(file, FileEngineType::Sync).unwrap(); - let data = utils::rand::rand_alphanumerics(FILE_LEN as usize) + let data = crate::utils::rand::rand_alphanumerics(FILE_LEN as usize) .as_bytes() .to_vec(); @@ -350,7 +349,7 @@ pub mod tests { let file = TempFile::new().unwrap().into_file(); let mut engine = FileEngine::<()>::from_file(file, FileEngineType::Async).unwrap(); - let data = utils::rand::rand_alphanumerics(FILE_LEN as usize) + let data = crate::utils::rand::rand_alphanumerics(FILE_LEN as usize) .as_bytes() .to_vec(); diff --git a/src/vmm/src/devices/virtio/block/virtio/persist.rs b/src/vmm/src/devices/virtio/block/virtio/persist.rs index 6e5b6a2c138..712a83332b2 100644 --- a/src/vmm/src/devices/virtio/block/virtio/persist.rs +++ b/src/vmm/src/devices/virtio/block/virtio/persist.rs @@ -7,7 +7,6 @@ use std::sync::atomic::AtomicU32; use std::sync::Arc; use serde::{Deserialize, Serialize}; -use utils::eventfd::EventFd; use super::device::DiskProperties; use super::*; @@ -21,6 +20,7 @@ use crate::devices::virtio::TYPE_BLOCK; use crate::rate_limiter::persist::RateLimiterState; use crate::rate_limiter::RateLimiter; use crate::snapshot::Persist; +use crate::utils::eventfd::EventFd; /// Holds info about block's file engine type. Gets saved in snapshot. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] @@ -151,13 +151,12 @@ impl Persist<'_> for VirtioBlock { mod tests { use std::sync::atomic::Ordering; - use utils::tempfile::TempFile; - use super::*; use crate::devices::virtio::block::virtio::device::VirtioBlockConfig; use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::test_utils::default_mem; use crate::snapshot::Snapshot; + use crate::utils::tempfile::TempFile; #[test] fn test_cache_semantic_ser() { diff --git a/src/vmm/src/devices/virtio/block/virtio/test_utils.rs b/src/vmm/src/devices/virtio/block/virtio/test_utils.rs index 7abf33dae5b..e92d53c05bc 100644 --- a/src/vmm/src/devices/virtio/block/virtio/test_utils.rs +++ b/src/vmm/src/devices/virtio/block/virtio/test_utils.rs @@ -8,8 +8,6 @@ use std::thread; #[cfg(test)] use std::time::Duration; -use utils::tempfile::TempFile; - use super::device::VirtioBlockConfig; use super::RequestHeader; use crate::devices::virtio::block::virtio::device::FileEngineType; @@ -21,6 +19,7 @@ use crate::devices::virtio::device::IrqType; use crate::devices::virtio::queue::{Queue, VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::{VirtQueue, VirtqDesc}; use crate::rate_limiter::RateLimiter; +use crate::utils::tempfile::TempFile; use crate::vmm_config::{RateLimiterConfig, TokenBucketConfig}; use crate::vstate::memory::{Bytes, GuestAddress}; diff --git a/src/vmm/src/devices/virtio/device.rs b/src/vmm/src/devices/virtio/device.rs index 7ae93b46a40..759a37a93ca 100644 --- a/src/vmm/src/devices/virtio/device.rs +++ b/src/vmm/src/devices/virtio/device.rs @@ -9,13 +9,12 @@ use std::fmt; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; -use utils::eventfd::EventFd; - use super::mmio::{VIRTIO_MMIO_INT_CONFIG, VIRTIO_MMIO_INT_VRING}; use super::queue::{Queue, QueueError}; use super::ActivateError; use crate::devices::virtio::AsAny; use crate::logger::{error, warn}; +use crate::utils::eventfd::EventFd; use crate::vstate::memory::GuestMemoryMmap; /// Enum that indicates if a VirtioDevice is inactive or has been activated diff --git a/src/vmm/src/devices/virtio/mmio.rs b/src/vmm/src/devices/virtio/mmio.rs index 221d7307ff3..585c3c62f33 100644 --- a/src/vmm/src/devices/virtio/mmio.rs +++ b/src/vmm/src/devices/virtio/mmio.rs @@ -9,12 +9,11 @@ use std::fmt::Debug; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::{Arc, Mutex, MutexGuard}; -use utils::byte_order; - use crate::devices::virtio::device::{IrqType, VirtioDevice}; use crate::devices::virtio::device_status; use crate::devices::virtio::queue::Queue; use crate::logger::{error, warn}; +use crate::utils::byte_order; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; // TODO crosvm uses 0 here, but IIRC virtio specified some other vendor id that should be used @@ -374,15 +373,14 @@ impl MmioTransport { #[cfg(test)] pub(crate) mod tests { - use utils::byte_order::{read_le_u32, write_le_u32}; - use utils::eventfd::EventFd; - use utils::u64_to_usize; - use super::*; use crate::devices::virtio::device::IrqTrigger; use crate::devices::virtio::device_status::DEVICE_NEEDS_RESET; use crate::devices::virtio::ActivateError; use crate::test_utils::single_region_mem; + use crate::utils::byte_order::{read_le_u32, write_le_u32}; + use crate::utils::eventfd::EventFd; + use crate::utils::u64_to_usize; use crate::vstate::memory::GuestMemoryMmap; #[derive(Debug)] diff --git a/src/vmm/src/devices/virtio/net/device.rs b/src/vmm/src/devices/virtio/net/device.rs index 67c2e57aca7..5c27ac71267 100755 --- a/src/vmm/src/devices/virtio/net/device.rs +++ b/src/vmm/src/devices/virtio/net/device.rs @@ -12,9 +12,6 @@ use std::sync::{Arc, Mutex}; use libc::EAGAIN; use log::{error, warn}; -use utils::eventfd::EventFd; -use utils::net::mac::MacAddr; -use utils::u64_to_usize; use vm_memory::GuestMemoryError; use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice}; @@ -40,6 +37,9 @@ use crate::logger::{IncMetric, METRICS}; use crate::mmds::data_store::Mmds; use crate::mmds::ns::MmdsNetworkStack; use crate::rate_limiter::{BucketUpdate, RateLimiter, TokenType}; +use crate::utils::eventfd::EventFd; +use crate::utils::net::mac::MacAddr; +use crate::utils::u64_to_usize; use crate::vstate::memory::{ByteValued, Bytes, GuestMemoryMmap}; const FRAME_HEADER_MAX_LEN: usize = PAYLOAD_OFFSET + ETH_IPV4_FRAME_LEN; @@ -935,8 +935,6 @@ pub mod tests { use std::time::Duration; use std::{mem, thread}; - use utils::net::mac::{MacAddr, MAC_ADDR_LEN}; - use super::*; use crate::check_metric_after_block; use crate::devices::virtio::gen::virtio_ring::VIRTIO_RING_F_EVENT_IDX; @@ -957,6 +955,7 @@ pub mod tests { use crate::logger::IncMetric; use crate::rate_limiter::{BucketUpdate, RateLimiter, TokenBucket, TokenType}; use crate::test_utils::single_region_mem; + use crate::utils::net::mac::{MacAddr, MAC_ADDR_LEN}; use crate::vstate::memory::{Address, GuestMemory}; #[test] diff --git a/src/vmm/src/devices/virtio/net/event_handler.rs b/src/vmm/src/devices/virtio/net/event_handler.rs index dd9a41afd8a..7f0eae195d3 100644 --- a/src/vmm/src/devices/virtio/net/event_handler.rs +++ b/src/vmm/src/devices/virtio/net/event_handler.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; -use utils::epoll::EventSet; use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::net::device::Net; use crate::devices::virtio::net::{RX_INDEX, TX_INDEX}; use crate::logger::{error, warn, IncMetric}; +use crate::utils::epoll::EventSet; impl Net { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/net/persist.rs b/src/vmm/src/devices/virtio/net/persist.rs index 271977a4792..54ff724ce51 100644 --- a/src/vmm/src/devices/virtio/net/persist.rs +++ b/src/vmm/src/devices/virtio/net/persist.rs @@ -8,7 +8,6 @@ use std::sync::atomic::AtomicU32; use std::sync::{Arc, Mutex}; use serde::{Deserialize, Serialize}; -use utils::net::mac::MacAddr; use super::device::Net; use super::NET_NUM_QUEUES; @@ -22,6 +21,7 @@ use crate::mmds::persist::MmdsNetworkStackState; use crate::rate_limiter::persist::RateLimiterState; use crate::rate_limiter::RateLimiter; use crate::snapshot::Persist; +use crate::utils::net::mac::MacAddr; use crate::vstate::memory::GuestMemoryMmap; /// Information about the network config's that are saved diff --git a/src/vmm/src/devices/virtio/net/tap.rs b/src/vmm/src/devices/virtio/net/tap.rs index d6ab7d3f840..056a615833c 100644 --- a/src/vmm/src/devices/virtio/net/tap.rs +++ b/src/vmm/src/devices/virtio/net/tap.rs @@ -11,11 +11,10 @@ use std::io::{Error as IoError, Read}; use std::os::raw::*; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; -use utils::ioctl::{ioctl_with_mut_ref, ioctl_with_ref, ioctl_with_val}; -use utils::{ioctl_ioc_nr, ioctl_iow_nr}; - use crate::devices::virtio::iovec::IoVecBuffer; use crate::devices::virtio::net::gen; +use crate::utils::ioctl::{ioctl_with_mut_ref, ioctl_with_ref, ioctl_with_val}; +use crate::utils::{ioctl_ioc_nr, ioctl_iow_nr}; // As defined in the Linux UAPI: // https://elixir.bootlin.com/linux/v4.17/source/include/uapi/linux/if.h#L33 @@ -293,7 +292,7 @@ pub mod tests { enable(&tap); let tap_traffic_simulator = TapTrafficSimulator::new(if_index(&tap)); - let packet = utils::rand::rand_alphanumerics(PAYLOAD_SIZE); + let packet = crate::utils::rand::rand_alphanumerics(PAYLOAD_SIZE); tap_traffic_simulator.push_tx_packet(packet.as_bytes()); let mut buf = [0u8; PACKET_SIZE]; @@ -310,11 +309,11 @@ pub mod tests { enable(&tap); let tap_traffic_simulator = TapTrafficSimulator::new(if_index(&tap)); - let mut fragment1 = utils::rand::rand_bytes(PAYLOAD_SIZE); + let mut fragment1 = crate::utils::rand::rand_bytes(PAYLOAD_SIZE); fragment1.as_mut_slice()[..gen::ETH_HLEN as usize] .copy_from_slice(&[0; gen::ETH_HLEN as usize]); - let fragment2 = utils::rand::rand_bytes(PAYLOAD_SIZE); - let fragment3 = utils::rand::rand_bytes(PAYLOAD_SIZE); + let fragment2 = crate::utils::rand::rand_bytes(PAYLOAD_SIZE); + let fragment3 = crate::utils::rand::rand_bytes(PAYLOAD_SIZE); let scattered = IoVecBuffer::from(vec![ fragment1.as_slice(), diff --git a/src/vmm/src/devices/virtio/net/test_utils.rs b/src/vmm/src/devices/virtio/net/test_utils.rs index efbafba482f..04a00ecb2ba 100644 --- a/src/vmm/src/devices/virtio/net/test_utils.rs +++ b/src/vmm/src/devices/virtio/net/test_utils.rs @@ -12,8 +12,6 @@ use std::str::FromStr; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; -use utils::net::mac::MacAddr; - #[cfg(test)] use crate::devices::virtio::net::device::vnet_hdr_len; use crate::devices::virtio::net::tap::{IfReqBuilder, Tap}; @@ -24,6 +22,7 @@ use crate::devices::DeviceError; use crate::mmds::data_store::Mmds; use crate::mmds::ns::MmdsNetworkStack; use crate::rate_limiter::RateLimiter; +use crate::utils::net::mac::MacAddr; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; static NEXT_INDEX: AtomicUsize = AtomicUsize::new(1); @@ -251,7 +250,7 @@ pub(crate) fn inject_tap_tx_frame(net: &Net, len: usize) -> Vec { assert!(len >= vnet_hdr_len()); let tap_traffic_simulator = TapTrafficSimulator::new(if_index(&net.tap)); - let mut frame = utils::rand::rand_alphanumerics(len - vnet_hdr_len()) + let mut frame = crate::utils::rand::rand_alphanumerics(len - vnet_hdr_len()) .as_bytes() .to_vec(); tap_traffic_simulator.push_tx_packet(&frame); @@ -419,7 +418,7 @@ pub mod test { addr += u64::from(len); // Add small random gaps between descriptor addresses in order to make sure we // don't blindly read contiguous memory. - addr += u64::from(utils::rand::xor_pseudo_rng_u32()) % 10; + addr += u64::from(crate::utils::rand::xor_pseudo_rng_u32()) % 10; } // Mark the chain as available. @@ -481,7 +480,7 @@ pub mod test { // Generates a frame of `frame_len` and writes it to the provided descriptor chain. // Doesn't generate an error if the descriptor chain is longer than `frame_len`. pub fn write_tx_frame(&self, desc_list: &[(u16, u32, u16)], frame_len: usize) -> Vec { - let mut frame = utils::rand::rand_alphanumerics(frame_len) + let mut frame = crate::utils::rand::rand_alphanumerics(frame_len) .as_bytes() .to_vec(); let prefix_len = vnet_hdr_len() + ETH_HLEN as usize; diff --git a/src/vmm/src/devices/virtio/persist.rs b/src/vmm/src/devices/virtio/persist.rs index f80d5382104..abf39739fd3 100644 --- a/src/vmm/src/devices/virtio/persist.rs +++ b/src/vmm/src/devices/virtio/persist.rs @@ -255,8 +255,6 @@ impl Persist<'_> for MmioTransport { #[cfg(test)] mod tests { - use utils::tempfile::TempFile; - use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; use crate::devices::virtio::block::virtio::test_utils::default_block_with_path; @@ -267,6 +265,7 @@ mod tests { use crate::devices::virtio::test_utils::default_mem; use crate::devices::virtio::vsock::{Vsock, VsockUnixBackend}; use crate::snapshot::Snapshot; + use crate::utils::tempfile::TempFile; const DEFAULT_QUEUE_MAX_SIZE: u16 = 256; impl Default for QueueState { diff --git a/src/vmm/src/devices/virtio/rng/device.rs b/src/vmm/src/devices/virtio/rng/device.rs index 43742ab0327..5adadd60b25 100644 --- a/src/vmm/src/devices/virtio/rng/device.rs +++ b/src/vmm/src/devices/virtio/rng/device.rs @@ -6,7 +6,6 @@ use std::sync::atomic::AtomicU32; use std::sync::Arc; use aws_lc_rs::rand; -use utils::eventfd::EventFd; use vm_memory::GuestMemoryError; use super::metrics::METRICS; @@ -19,6 +18,7 @@ use crate::devices::virtio::{ActivateError, TYPE_RNG}; use crate::devices::DeviceError; use crate::logger::{debug, error, IncMetric}; use crate::rate_limiter::{RateLimiter, TokenType}; +use crate::utils::eventfd::EventFd; use crate::vstate::memory::GuestMemoryMmap; pub const ENTROPY_DEV_ID: &str = "rng"; diff --git a/src/vmm/src/devices/virtio/rng/event_handler.rs b/src/vmm/src/devices/virtio/rng/event_handler.rs index a2c81bdf2df..0d3c6061955 100644 --- a/src/vmm/src/devices/virtio/rng/event_handler.rs +++ b/src/vmm/src/devices/virtio/rng/event_handler.rs @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; -use utils::epoll::EventSet; use super::{Entropy, RNG_QUEUE}; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; +use crate::utils::epoll::EventSet; impl Entropy { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/test_utils.rs b/src/vmm/src/devices/virtio/test_utils.rs index 12983851560..031ecf84427 100644 --- a/src/vmm/src/devices/virtio/test_utils.rs +++ b/src/vmm/src/devices/virtio/test_utils.rs @@ -8,10 +8,9 @@ use std::marker::PhantomData; use std::mem; use std::sync::atomic::{AtomicUsize, Ordering}; -use utils::u64_to_usize; - use crate::devices::virtio::queue::Queue; use crate::test_utils::single_region_mem; +use crate::utils::u64_to_usize; use crate::vstate::memory::{Address, Bytes, GuestAddress, GuestMemoryMmap}; #[macro_export] @@ -470,7 +469,7 @@ pub(crate) mod test { addr += u64::from(len); // Add small random gaps between descriptor addresses in order to make sure we // don't blindly read contiguous memory. - addr += u64::from(utils::rand::xor_pseudo_rng_u32()) % 10; + addr += u64::from(crate::utils::rand::xor_pseudo_rng_u32()) % 10; } // Mark the chain as available. diff --git a/src/vmm/src/devices/virtio/vhost_user.rs b/src/vmm/src/devices/virtio/vhost_user.rs index 0274b59fdbf..a63eed50c57 100644 --- a/src/vmm/src/devices/virtio/vhost_user.rs +++ b/src/vmm/src/devices/virtio/vhost_user.rs @@ -7,7 +7,6 @@ use std::os::fd::AsRawFd; use std::os::unix::net::UnixStream; -use utils::eventfd::EventFd; use vhost::vhost_user::message::*; use vhost::vhost_user::{Frontend, VhostUserFrontend}; use vhost::{Error as VhostError, VhostBackend, VhostUserMemoryRegionInfo, VringConfigData}; @@ -15,6 +14,7 @@ use vm_memory::{Address, Error as MmapError, GuestMemory, GuestMemoryError, Gues use crate::devices::virtio::device::IrqTrigger; use crate::devices::virtio::queue::Queue; +use crate::utils::eventfd::EventFd; use crate::vstate::memory::GuestMemoryMmap; /// vhost-user error. @@ -462,10 +462,9 @@ impl VhostUserHandleImpl { mod tests { #![allow(clippy::undocumented_unsafe_blocks)] - use utils::tempfile::TempFile; - use super::*; use crate::test_utils::create_tmp_socket; + use crate::utils::tempfile::TempFile; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/vsock/csm/connection.rs b/src/vmm/src/devices/virtio/vsock/csm/connection.rs index 9fe744058c0..e43d80eff72 100644 --- a/src/vmm/src/devices/virtio/vsock/csm/connection.rs +++ b/src/vmm/src/devices/virtio/vsock/csm/connection.rs @@ -83,8 +83,6 @@ use std::os::unix::io::{AsRawFd, RawFd}; use std::time::{Duration, Instant}; use log::{debug, error, info, warn}; -use utils::epoll::EventSet; -use utils::wrap_usize_to_u32; use vm_memory::io::{ReadVolatile, WriteVolatile}; use vm_memory::GuestMemoryError; @@ -95,6 +93,8 @@ use super::txbuf::TxBuf; use super::{defs, ConnState, PendingRx, PendingRxSet, VsockCsmError}; use crate::devices::virtio::vsock::metrics::METRICS; use crate::logger::IncMetric; +use crate::utils::epoll::EventSet; +use crate::utils::wrap_usize_to_u32; /// Trait that vsock connection backends need to implement. /// @@ -684,7 +684,6 @@ mod tests { use std::os::unix::io::RawFd; use std::time::{Duration, Instant}; - use utils::eventfd::EventFd; use vm_memory::{VolatileMemoryError, VolatileSlice}; use super::super::super::defs::uapi; @@ -693,6 +692,7 @@ mod tests { use crate::devices::virtio::vsock::device::{RXQ_INDEX, TXQ_INDEX}; use crate::devices::virtio::vsock::test_utils; use crate::devices::virtio::vsock::test_utils::TestContext; + use crate::utils::eventfd::EventFd; use crate::vstate::memory::BitmapSlice; const LOCAL_CID: u64 = 2; diff --git a/src/vmm/src/devices/virtio/vsock/csm/txbuf.rs b/src/vmm/src/devices/virtio/vsock/csm/txbuf.rs index 53165cbf84c..1742b02394f 100644 --- a/src/vmm/src/devices/virtio/vsock/csm/txbuf.rs +++ b/src/vmm/src/devices/virtio/vsock/csm/txbuf.rs @@ -6,10 +6,10 @@ use std::fmt::Debug; use std::io::Write; use std::num::Wrapping; -use utils::wrap_usize_to_u32; use vm_memory::{VolatileMemoryError, VolatileSlice, WriteVolatile}; use super::{defs, VsockCsmError}; +use crate::utils::wrap_usize_to_u32; use crate::vstate::memory::{BitmapSlice, Bytes}; /// A simple ring-buffer implementation, used by vsock connections to buffer TX (guest -> host) diff --git a/src/vmm/src/devices/virtio/vsock/device.rs b/src/vmm/src/devices/virtio/vsock/device.rs index 17b1789191f..47b5f5861f6 100644 --- a/src/vmm/src/devices/virtio/vsock/device.rs +++ b/src/vmm/src/devices/virtio/vsock/device.rs @@ -23,8 +23,6 @@ use std::fmt::Debug; use log::{error, warn}; -use utils::byte_order; -use utils::eventfd::EventFd; use super::super::super::DeviceError; use super::defs::uapi; @@ -36,6 +34,8 @@ use crate::devices::virtio::vsock::metrics::METRICS; use crate::devices::virtio::vsock::VsockError; use crate::devices::virtio::ActivateError; use crate::logger::IncMetric; +use crate::utils::byte_order; +use crate::utils::eventfd::EventFd; use crate::vstate::memory::{Bytes, GuestMemoryMmap}; pub(crate) const RXQ_INDEX: usize = 0; diff --git a/src/vmm/src/devices/virtio/vsock/event_handler.rs b/src/vmm/src/devices/virtio/vsock/event_handler.rs index 811ce20c9f5..03df6a195d6 100755 --- a/src/vmm/src/devices/virtio/vsock/event_handler.rs +++ b/src/vmm/src/devices/virtio/vsock/event_handler.rs @@ -28,13 +28,13 @@ use std::fmt::Debug; /// buffers. use event_manager::{EventOps, Events, MutEventSubscriber}; use log::{error, warn}; -use utils::epoll::EventSet; use super::device::{Vsock, EVQ_INDEX, RXQ_INDEX, TXQ_INDEX}; use super::VsockBackend; use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::vsock::metrics::METRICS; use crate::logger::IncMetric; +use crate::utils::epoll::EventSet; impl Vsock where diff --git a/src/vmm/src/devices/virtio/vsock/mod.rs b/src/vmm/src/devices/virtio/vsock/mod.rs index a87b6b488d8..b3b384c9c0b 100644 --- a/src/vmm/src/devices/virtio/vsock/mod.rs +++ b/src/vmm/src/devices/virtio/vsock/mod.rs @@ -23,7 +23,6 @@ mod unix; use std::os::unix::io::AsRawFd; use packet::VsockPacket; -use utils::epoll::EventSet; use vm_memory::GuestMemoryError; pub use self::defs::uapi::VIRTIO_ID_VSOCK as TYPE_VSOCK; @@ -32,6 +31,7 @@ pub use self::device::Vsock; pub use self::unix::{VsockUnixBackend, VsockUnixBackendError}; use crate::devices::virtio::iovec::IoVecError; use crate::devices::virtio::persist::PersistError as VirtioStateError; +use crate::utils::epoll::EventSet; mod defs { use crate::devices::virtio::queue::FIRECRACKER_MAX_QUEUE_SIZE; diff --git a/src/vmm/src/devices/virtio/vsock/persist.rs b/src/vmm/src/devices/virtio/vsock/persist.rs index 1c0b07fea7e..dce545fd68d 100644 --- a/src/vmm/src/devices/virtio/vsock/persist.rs +++ b/src/vmm/src/devices/virtio/vsock/persist.rs @@ -134,14 +134,13 @@ where #[cfg(test)] pub(crate) mod tests { - use utils::byte_order; - use super::device::AVAIL_FEATURES; use super::*; use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::vsock::defs::uapi; use crate::devices::virtio::vsock::test_utils::{TestBackend, TestContext}; use crate::snapshot::Snapshot; + use crate::utils::byte_order; impl Persist<'_> for TestBackend { type State = VsockBackendState; diff --git a/src/vmm/src/devices/virtio/vsock/test_utils.rs b/src/vmm/src/devices/virtio/vsock/test_utils.rs index f9a31e2e815..87821f0de17 100644 --- a/src/vmm/src/devices/virtio/vsock/test_utils.rs +++ b/src/vmm/src/devices/virtio/vsock/test_utils.rs @@ -6,9 +6,6 @@ use std::os::unix::io::{AsRawFd, RawFd}; -use utils::epoll::EventSet; -use utils::eventfd::EventFd; - use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::VirtQueue as GuestQ; @@ -18,6 +15,8 @@ use crate::devices::virtio::vsock::{ Vsock, VsockBackend, VsockChannel, VsockEpollListener, VsockError, }; use crate::test_utils::single_region_mem; +use crate::utils::epoll::EventSet; +use crate::utils::eventfd::EventFd; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; #[derive(Debug)] diff --git a/src/vmm/src/devices/virtio/vsock/unix/muxer.rs b/src/vmm/src/devices/virtio/vsock/unix/muxer.rs index d543a2799dd..1dfb3a5296f 100644 --- a/src/vmm/src/devices/virtio/vsock/unix/muxer.rs +++ b/src/vmm/src/devices/virtio/vsock/unix/muxer.rs @@ -36,7 +36,6 @@ use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::net::{UnixListener, UnixStream}; use log::{debug, error, info, warn}; -use utils::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; use super::super::csm::ConnState; use super::super::defs::uapi; @@ -47,6 +46,7 @@ use super::muxer_rxq::MuxerRxQ; use super::{defs, MuxerConnection, VsockUnixBackendError}; use crate::devices::virtio::vsock::metrics::METRICS; use crate::logger::IncMetric; +use crate::utils::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; /// A unique identifier of a `MuxerConnection` object. Connections are stored in a hash map, /// keyed by a `ConnMapKey` object. @@ -791,13 +791,12 @@ mod tests { use std::os::unix::net::{UnixListener, UnixStream}; use std::path::{Path, PathBuf}; - use utils::tempfile::TempFile; - use super::super::super::csm::defs as csm_defs; use super::*; use crate::devices::virtio::vsock::device::{RXQ_INDEX, TXQ_INDEX}; use crate::devices::virtio::vsock::test_utils; use crate::devices::virtio::vsock::test_utils::TestContext as VsockTestContext; + use crate::utils::tempfile::TempFile; const PEER_CID: u64 = 3; const PEER_BUF_ALLOC: u32 = 64 * 1024; diff --git a/src/vmm/src/dumbo/mod.rs b/src/vmm/src/dumbo/mod.rs index 38af5643e9d..e1286c74e93 100644 --- a/src/vmm/src/dumbo/mod.rs +++ b/src/vmm/src/dumbo/mod.rs @@ -8,14 +8,13 @@ pub mod tcp; use std::ops::Index; -use utils::net::mac::MacAddr; - pub use crate::dumbo::pdu::arp::{EthIPv4ArpFrame, ETH_IPV4_FRAME_LEN}; pub use crate::dumbo::pdu::ethernet::{ EthernetFrame, ETHERTYPE_ARP, ETHERTYPE_IPV4, PAYLOAD_OFFSET as ETHERNET_PAYLOAD_OFFSET, }; pub use crate::dumbo::pdu::ipv4::{IPv4Packet, PROTOCOL_TCP, PROTOCOL_UDP}; pub use crate::dumbo::pdu::udp::{UdpDatagram, UDP_HEADER_SIZE}; +use crate::utils::net::mac::MacAddr; /// Represents a generalization of a borrowed `[u8]` slice. #[allow(clippy::len_without_is_empty)] diff --git a/src/vmm/src/dumbo/pdu/arp.rs b/src/vmm/src/dumbo/pdu/arp.rs index 76a1dcdf22e..bccb32154a9 100644 --- a/src/vmm/src/dumbo/pdu/arp.rs +++ b/src/vmm/src/dumbo/pdu/arp.rs @@ -12,10 +12,9 @@ use std::fmt::Debug; use std::net::Ipv4Addr; use std::result::Result; -use utils::net::mac::{MacAddr, MAC_ADDR_LEN}; - use super::bytes::{InnerBytes, NetworkBytes, NetworkBytesMut}; use super::ethernet::{self, ETHERTYPE_IPV4}; +use crate::utils::net::mac::{MacAddr, MAC_ADDR_LEN}; /// ARP Request operation pub const OPER_REQUEST: u16 = 0x0001; diff --git a/src/vmm/src/dumbo/pdu/bytes.rs b/src/vmm/src/dumbo/pdu/bytes.rs index 2da690f7c50..9b87673c211 100644 --- a/src/vmm/src/dumbo/pdu/bytes.rs +++ b/src/vmm/src/dumbo/pdu/bytes.rs @@ -68,7 +68,7 @@ use std::fmt::Debug; use std::marker::PhantomData; use std::ops::{Deref, DerefMut}; -use utils::byte_order; +use crate::utils::byte_order; /// Represents an immutable view into a sequence of bytes which stands for different values packed /// together using network byte ordering. diff --git a/src/vmm/src/dumbo/pdu/ethernet.rs b/src/vmm/src/dumbo/pdu/ethernet.rs index 64bc8320e0e..8b3321ca4b8 100644 --- a/src/vmm/src/dumbo/pdu/ethernet.rs +++ b/src/vmm/src/dumbo/pdu/ethernet.rs @@ -240,9 +240,8 @@ mod tests { #[cfg(kani)] #[allow(dead_code)] // Avoid warning when using stubs. mod kani_proofs { - use utils::net::mac::MAC_ADDR_LEN; - use super::*; + use crate::utils::net::mac::MAC_ADDR_LEN; // See the Virtual I/O Device (VIRTIO) specification, Sec. 5.1.6.2. // https://docs.oasis-open.org/virtio/virtio/v1.2/csd01/virtio-v1.2-csd01.pdf @@ -520,7 +519,7 @@ mod kani_proofs { #[kani::proof] #[kani::solver(cadical)] - #[kani::stub(utils::byte_order::read_be_u16, stubs::read_be_u16)] + #[kani::stub(crate::utils::byte_order::read_be_u16, stubs::read_be_u16)] fn verify_with_payload_len_unchecked() { // Create non-deterministic stream of bytes up to MAX_FRAME_SIZE let mut bytes: [u8; MAX_FRAME_SIZE] = kani::Arbitrary::any_array::(); diff --git a/src/vmm/src/dumbo/tcp/connection.rs b/src/vmm/src/dumbo/tcp/connection.rs index 94092ec367a..c0c8bf36d4e 100644 --- a/src/vmm/src/dumbo/tcp/connection.rs +++ b/src/vmm/src/dumbo/tcp/connection.rs @@ -10,7 +10,6 @@ use std::fmt::Debug; use std::num::{NonZeroU16, NonZeroU64, NonZeroUsize, Wrapping}; use bitflags::bitflags; -use utils::rand::xor_pseudo_rng_u32; use crate::dumbo::pdu::bytes::NetworkBytes; use crate::dumbo::pdu::tcp::{Flags as TcpFlags, TcpError as TcpSegmentError, TcpSegment}; @@ -19,6 +18,7 @@ use crate::dumbo::tcp::{ seq_after, seq_at_or_after, NextSegmentStatus, RstConfig, MAX_WINDOW_SIZE, MSS_DEFAULT, }; use crate::dumbo::ByteBuffer; +use crate::utils::rand::xor_pseudo_rng_u32; bitflags! { // We use a set of flags, instead of a state machine, to represent the connection status. Some diff --git a/src/vmm/src/io_uring/mod.rs b/src/vmm/src/io_uring/mod.rs index 95809717ca9..89e44c45166 100644 --- a/src/vmm/src/io_uring/mod.rs +++ b/src/vmm/src/io_uring/mod.rs @@ -22,7 +22,8 @@ use queue::completion::CompletionQueue; pub use queue::submission::SQueueError; use queue::submission::SubmissionQueue; use restriction::Restriction; -use utils::syscall::SyscallReturnCode; + +use crate::utils::syscall::SyscallReturnCode; // IO_uring operations that we require to be supported by the host kernel. const REQUIRED_OPS: [OpCode; 2] = [OpCode::Read, OpCode::Write]; @@ -37,7 +38,7 @@ pub enum IoUringError { /// Could not enable the ring: {0} Enable(IOError), /// A FamStructWrapper operation has failed: {0} - Fam(utils::fam::Error), + Fam(crate::utils::fam::Error), /// The number of ops in the ring is >= CQ::count FullCQueue, /// Fd was not registered: {0} @@ -387,13 +388,13 @@ mod tests { use proptest::prelude::*; use proptest::strategy::Strategy; use proptest::test_runner::{Config, TestRunner}; - use utils::syscall::SyscallReturnCode; - use utils::tempfile::TempFile; use vm_memory::VolatileMemory; /// ------------------------------------- /// BEGIN PROPERTY BASED TESTING use super::*; + use crate::utils::syscall::SyscallReturnCode; + use crate::utils::tempfile::TempFile; use crate::vstate::memory::{Bytes, MmapRegion}; fn drain_cqueue(ring: &mut IoUring) { diff --git a/src/vmm/src/io_uring/probe.rs b/src/vmm/src/io_uring/probe.rs index 4d7bd0a5bb6..12f6fb03608 100644 --- a/src/vmm/src/io_uring/probe.rs +++ b/src/vmm/src/io_uring/probe.rs @@ -1,10 +1,9 @@ // Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -use utils::fam::{FamStruct, FamStructWrapper}; -use utils::generate_fam_struct_impl; - use crate::io_uring::gen::{io_uring_probe, io_uring_probe_op}; +use crate::utils::fam::{FamStruct, FamStructWrapper}; +use crate::utils::generate_fam_struct_impl; // There is no max for the number of operations returned by probing. So we fallback to using the // number of values representable in a u8; diff --git a/src/vmm/src/io_uring/queue/submission.rs b/src/vmm/src/io_uring/queue/submission.rs index bb677687447..d9956b9583d 100644 --- a/src/vmm/src/io_uring/queue/submission.rs +++ b/src/vmm/src/io_uring/queue/submission.rs @@ -8,12 +8,12 @@ use std::num::Wrapping; use std::os::unix::io::RawFd; use std::sync::atomic::Ordering; -use utils::syscall::SyscallReturnCode; use vm_memory::{VolatileMemory, VolatileMemoryError}; use super::mmap::{mmap, MmapError}; use crate::io_uring::gen; use crate::io_uring::operation::Sqe; +use crate::utils::syscall::SyscallReturnCode; use crate::vstate::memory::{Bytes, MmapRegion}; #[derive(Debug, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/lib.rs b/src/vmm/src/lib.rs index e62ca8e14b7..075fb45d173 100644 --- a/src/vmm/src/lib.rs +++ b/src/vmm/src/lib.rs @@ -101,6 +101,8 @@ pub mod signal_handler; pub mod snapshot; /// Utility functions for integration and benchmark testing pub mod test_utils; +/// Utility functions and struct +pub mod utils; /// Wrappers over structures used to configure the VMM. pub mod vmm_config; /// Module with virtual state structs. @@ -119,10 +121,6 @@ use devices::acpi::vmgenid::VmGenIdError; use event_manager::{EventManager as BaseEventManager, EventOps, Events, MutEventSubscriber}; use seccompiler::BpfProgram; use userfaultfd::Uffd; -use utils::epoll::EventSet; -use utils::eventfd::EventFd; -use utils::terminal::Terminal; -use utils::u64_to_usize; use vstate::vcpu::{self, KvmVcpuConfigureError, StartThreadedError, VcpuSendEventError}; use crate::arch::DeviceType; @@ -141,6 +139,10 @@ use crate::logger::{error, info, warn, MetricsError, METRICS}; use crate::persist::{MicrovmState, MicrovmStateError, VmInfo}; use crate::rate_limiter::BucketUpdate; use crate::snapshot::Persist; +use crate::utils::epoll::EventSet; +use crate::utils::eventfd::EventFd; +use crate::utils::terminal::Terminal; +use crate::utils::u64_to_usize; use crate::vmm_config::instance_info::{InstanceInfo, VmState}; use crate::vstate::memory::{ GuestMemory, GuestMemoryExtension, GuestMemoryMmap, GuestMemoryRegion, @@ -251,9 +253,9 @@ pub enum VmmError { /// Vm error: {0} Vm(vstate::vm::VmError), /// Error thrown by observer object on Vmm initialization: {0} - VmmObserverInit(utils::errno::Error), + VmmObserverInit(crate::utils::errno::Error), /// Error thrown by observer object on Vmm teardown: {0} - VmmObserverTeardown(utils::errno::Error), + VmmObserverTeardown(crate::utils::errno::Error), /// VMGenID error: {0} VMGenID(#[from] VmGenIdError), } @@ -275,7 +277,7 @@ pub struct EmulateSerialInitError(#[from] std::io::Error); #[derive(Debug, thiserror::Error, displaydoc::Display)] pub enum StartVcpusError { /// VMM observer init error: {0} - VmmObserverInit(#[from] utils::errno::Error), + VmmObserverInit(#[from] crate::utils::errno::Error), /// Vcpu handle error: {0} VcpuHandle(#[from] StartThreadedError), } diff --git a/src/vmm/src/logger/logging.rs b/src/vmm/src/logger/logging.rs index d2958bdb691..9a2c2fecdd9 100644 --- a/src/vmm/src/logger/logging.rs +++ b/src/vmm/src/logger/logging.rs @@ -351,7 +351,7 @@ mod tests { #[test] fn logger() { // Get temp file path. - let file = utils::tempfile::TempFile::new().unwrap(); + let file = crate::utils::tempfile::TempFile::new().unwrap(); let path = file.as_path().to_str().unwrap().to_string(); drop(file); diff --git a/src/vmm/src/logger/metrics.rs b/src/vmm/src/logger/metrics.rs index 26a755c8f4e..b07f391ef56 100644 --- a/src/vmm/src/logger/metrics.rs +++ b/src/vmm/src/logger/metrics.rs @@ -956,9 +956,8 @@ mod tests { use std::sync::Arc; use std::thread; - use utils::tempfile::TempFile; - use super::*; + use crate::utils::tempfile::TempFile; #[test] fn test_init() { diff --git a/src/vmm/src/mmds/ns.rs b/src/vmm/src/mmds/ns.rs index b99338b7c9f..09d73b21e99 100644 --- a/src/vmm/src/mmds/ns.rs +++ b/src/vmm/src/mmds/ns.rs @@ -11,7 +11,6 @@ use std::result::Result; use std::str::FromStr; use std::sync::{Arc, Mutex}; -use utils::net::mac::MacAddr; use utils::time::timestamp_cycles; use crate::dumbo::pdu::arp::{ @@ -29,6 +28,7 @@ use crate::dumbo::tcp::handler::{RecvEvent, TcpIPv4Handler, WriteEvent, WriteNex use crate::dumbo::tcp::NextSegmentStatus; use crate::logger::{IncMetric, METRICS}; use crate::mmds::data_store::Mmds; +use crate::utils::net::mac::MacAddr; const DEFAULT_MAC_ADDR: &str = "06:01:23:45:67:01"; const DEFAULT_IPV4_ADDR: [u8; 4] = [169, 254, 169, 254]; diff --git a/src/vmm/src/mmds/persist.rs b/src/vmm/src/mmds/persist.rs index 0b4b06519de..dc0113f8a5c 100644 --- a/src/vmm/src/mmds/persist.rs +++ b/src/vmm/src/mmds/persist.rs @@ -8,11 +8,11 @@ use std::num::NonZeroUsize; use std::sync::{Arc, Mutex}; use serde::{Deserialize, Serialize}; -use utils::net::mac::{MacAddr, MAC_ADDR_LEN}; use super::ns::MmdsNetworkStack; use crate::mmds::data_store::Mmds; use crate::snapshot::Persist; +use crate::utils::net::mac::{MacAddr, MAC_ADDR_LEN}; /// State of a MmdsNetworkStack. #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src/vmm/src/persist.rs b/src/vmm/src/persist.rs index d9183178797..0c5c5f49037 100644 --- a/src/vmm/src/persist.rs +++ b/src/vmm/src/persist.rs @@ -15,8 +15,6 @@ use seccompiler::BpfThreadMap; use semver::Version; use serde::{Deserialize, Serialize}; use userfaultfd::{FeatureFlags, Uffd, UffdBuilder}; -use utils::sock_ctrl_msg::ScmSocket; -use utils::u64_to_usize; #[cfg(target_arch = "aarch64")] use crate::arch::aarch64::vcpu::{get_manufacturer_id_from_host, get_manufacturer_id_from_state}; @@ -30,6 +28,8 @@ use crate::device_manager::persist::{ACPIDeviceManagerState, DevicePersistError, use crate::logger::{info, warn}; use crate::resources::VmResources; use crate::snapshot::Snapshot; +use crate::utils::sock_ctrl_msg::ScmSocket; +use crate::utils::u64_to_usize; use crate::vmm_config::boot_source::BootSourceConfig; use crate::vmm_config::instance_info::InstanceInfo; use crate::vmm_config::machine_config::{HugePageConfig, MachineConfigUpdate, VmConfigError}; @@ -534,7 +534,7 @@ pub enum GuestMemoryFromUffdError { /// Failed to connect to UDS Unix stream: {0} Connect(#[from] std::io::Error), /// Failed to sends file descriptor: {0} - Send(#[from] utils::errno::Error), + Send(#[from] crate::utils::errno::Error), } fn guest_memory_from_uffd( @@ -643,8 +643,6 @@ fn send_uffd_handshake( mod tests { use std::os::unix::net::UnixListener; - use utils::tempfile::TempFile; - use super::*; #[cfg(target_arch = "x86_64")] use crate::builder::tests::insert_vmgenid_device; @@ -656,6 +654,7 @@ mod tests { use crate::construct_kvm_mpidrs; use crate::devices::virtio::block::CacheType; use crate::snapshot::Persist; + use crate::utils::tempfile::TempFile; use crate::vmm_config::balloon::BalloonDeviceConfig; use crate::vmm_config::net::NetworkInterfaceConfig; use crate::vmm_config::vsock::tests::default_config; diff --git a/src/vmm/src/resources.rs b/src/vmm/src/resources.rs index 656d3ff6221..d1ac27ee199 100644 --- a/src/vmm/src/resources.rs +++ b/src/vmm/src/resources.rs @@ -6,7 +6,6 @@ use std::path::PathBuf; use std::sync::{Arc, Mutex, MutexGuard}; use serde::{Deserialize, Serialize}; -use utils::net::ipv4addr::is_link_local_valid; use crate::cpu_config::templates::CustomCpuTemplate; use crate::device_manager::persist::SharedDeviceType; @@ -14,6 +13,7 @@ use crate::logger::{info, log_dev_preview_warning}; use crate::mmds; use crate::mmds::data_store::{Mmds, MmdsVersion}; use crate::mmds::ns::MmdsNetworkStack; +use crate::utils::net::ipv4addr::is_link_local_valid; use crate::vmm_config::balloon::*; use crate::vmm_config::boot_source::{ BootConfig, BootSource, BootSourceConfig, BootSourceConfigError, @@ -501,8 +501,6 @@ mod tests { use std::str::FromStr; use serde_json::{Map, Value}; - use utils::net::mac::MacAddr; - use utils::tempfile::TempFile; use super::*; use crate::cpu_config::templates::{CpuTemplateType, StaticCpuTemplate}; @@ -511,6 +509,8 @@ mod tests { use crate::devices::virtio::block::{BlockError, CacheType}; use crate::devices::virtio::vsock::VSOCK_DEV_ID; use crate::resources::VmResources; + use crate::utils::net::mac::MacAddr; + use crate::utils::tempfile::TempFile; use crate::vmm_config::boot_source::{ BootConfig, BootSource, BootSourceConfig, DEFAULT_KERNEL_CMDLINE, }; diff --git a/src/vmm/src/rpc_interface.rs b/src/vmm/src/rpc_interface.rs index be3161b527d..0a2c6257faa 100644 --- a/src/vmm/src/rpc_interface.rs +++ b/src/vmm/src/rpc_interface.rs @@ -324,7 +324,7 @@ impl<'a> PrebootApiController<'a> { instance_info: InstanceInfo, from_api: &std::sync::mpsc::Receiver, to_api: &std::sync::mpsc::Sender, - api_event_fd: &utils::eventfd::EventFd, + api_event_fd: &crate::utils::eventfd::EventFd, boot_timer_enabled: bool, mmds_size_limit: usize, metadata_json: Option<&str>, diff --git a/src/vmm/src/signal_handler.rs b/src/vmm/src/signal_handler.rs index 37711449ad8..139fb4828ed 100644 --- a/src/vmm/src/signal_handler.rs +++ b/src/vmm/src/signal_handler.rs @@ -5,9 +5,9 @@ use libc::{ c_int, c_void, siginfo_t, SIGBUS, SIGHUP, SIGILL, SIGPIPE, SIGSEGV, SIGSYS, SIGXCPU, SIGXFSZ, }; use log::error; -use utils::signal::register_signal_handler; use crate::logger::{IncMetric, StoreMetric, METRICS}; +use crate::utils::signal::register_signal_handler; use crate::FcExitCode; // The offset of `si_syscall` (offending syscall identifier) within the siginfo structure @@ -155,7 +155,7 @@ extern "C" fn sigpipe_handler(num: c_int, info: *mut siginfo_t, _unused: *mut c_ /// /// Custom handlers are installed for: `SIGBUS`, `SIGSEGV`, `SIGSYS` /// `SIGXFSZ` `SIGXCPU` `SIGPIPE` `SIGHUP` and `SIGILL`. -pub fn register_signal_handlers() -> utils::errno::Result<()> { +pub fn register_signal_handlers() -> crate::utils::errno::Result<()> { // Call to unsafe register_signal_handler which is considered unsafe because it will // register a signal handler which will be called in the current thread and will interrupt // whatever work is done on the current thread, so we have to keep in mind that the registered diff --git a/src/vmm/src/test_utils/mod.rs b/src/vmm/src/test_utils/mod.rs index 552ad102d19..f90ba7fbd0c 100644 --- a/src/vmm/src/test_utils/mod.rs +++ b/src/vmm/src/test_utils/mod.rs @@ -5,8 +5,8 @@ use std::sync::{Arc, Mutex}; -use utils::tempdir::TempDir; use vm_memory::GuestAddress; +use vmm_sys_util::tempdir::TempDir; use crate::builder::build_microvm_for_boot; use crate::resources::VmResources; diff --git a/src/vmm/src/utils/byte_order.rs b/src/vmm/src/utils/byte_order.rs new file mode 100644 index 00000000000..32aa9daee18 --- /dev/null +++ b/src/vmm/src/utils/byte_order.rs @@ -0,0 +1,119 @@ +// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +macro_rules! generate_read_fn { + ($fn_name: ident, $data_type: ty, $byte_type: ty, $type_size: expr, $endian_type: ident) => { + /// Read bytes from the slice + pub fn $fn_name(input: &[$byte_type]) -> $data_type { + assert!($type_size == std::mem::size_of::<$data_type>()); + let mut array = [0u8; $type_size]; + #[allow(clippy::cast_sign_loss)] + #[allow(clippy::cast_possible_wrap)] + for (byte, read) in array.iter_mut().zip(input.iter().cloned()) { + *byte = read as u8; + } + <$data_type>::$endian_type(array) + } + }; +} + +macro_rules! generate_write_fn { + ($fn_name: ident, $data_type: ty, $byte_type: ty, $endian_type: ident) => { + /// Write bytes to the slice + pub fn $fn_name(buf: &mut [$byte_type], n: $data_type) { + #[allow(clippy::cast_sign_loss)] + #[allow(clippy::cast_possible_wrap)] + for (byte, read) in buf + .iter_mut() + .zip(<$data_type>::$endian_type(n).iter().cloned()) + { + *byte = read as $byte_type; + } + } + }; +} + +generate_read_fn!(read_le_u16, u16, u8, 2, from_le_bytes); +generate_read_fn!(read_le_u32, u32, u8, 4, from_le_bytes); +generate_read_fn!(read_le_u32_from_i8, u32, i8, 4, from_le_bytes); +generate_read_fn!(read_le_u64, u64, u8, 8, from_le_bytes); +generate_read_fn!(read_le_i32, i32, i8, 4, from_le_bytes); + +generate_read_fn!(read_be_u16, u16, u8, 2, from_be_bytes); +generate_read_fn!(read_be_u32, u32, u8, 4, from_be_bytes); + +generate_write_fn!(write_le_u16, u16, u8, to_le_bytes); +generate_write_fn!(write_le_u32, u32, u8, to_le_bytes); +generate_write_fn!(write_le_u32_to_i8, u32, i8, to_le_bytes); +generate_write_fn!(write_le_u64, u64, u8, to_le_bytes); +generate_write_fn!(write_le_i32, i32, i8, to_le_bytes); + +generate_write_fn!(write_be_u16, u16, u8, to_be_bytes); +generate_write_fn!(write_be_u32, u32, u8, to_be_bytes); + +#[cfg(test)] +mod tests { + use super::*; + macro_rules! byte_order_test_read_write { + ($test_name: ident, $write_fn_name: ident, $read_fn_name: ident, $is_be: expr, $data_type: ty) => { + #[test] + fn $test_name() { + #[allow(overflowing_literals)] + let test_cases = [ + ( + 0x0123_4567_89AB_CDEF as u64, + [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + ), + ( + 0x0000_0000_0000_0000 as u64, + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + ), + ( + 0x1923_2345_ABF3_CCD4 as u64, + [0x19, 0x23, 0x23, 0x45, 0xAB, 0xF3, 0xCC, 0xD4], + ), + ( + 0x0FF0_0FF0_0FF0_0FF0 as u64, + [0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0], + ), + ( + 0xFFFF_FFFF_FFFF_FFFF as u64, + [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], + ), + ( + 0x89AB_12D4_C2D2_09BB as u64, + [0x89, 0xAB, 0x12, 0xD4, 0xC2, 0xD2, 0x09, 0xBB], + ), + ]; + + let type_size = std::mem::size_of::<$data_type>(); + #[allow(clippy::cast_possible_truncation)] + #[allow(clippy::cast_sign_loss)] + for (test_val, v_arr) in &test_cases { + let v = *test_val as $data_type; + let cmp_iter: Box> = if $is_be { + Box::new(v_arr[(8 - type_size)..].iter()) + } else { + Box::new(v_arr.iter().rev()) + }; + // test write + let mut write_arr = vec![Default::default(); type_size]; + $write_fn_name(&mut write_arr, v); + for (cmp, cur) in cmp_iter.zip(write_arr.iter()) { + assert_eq!(*cmp, *cur as u8) + } + // test read + let read_val = $read_fn_name(&write_arr); + assert_eq!(v, read_val); + } + } + }; + } + + byte_order_test_read_write!(test_le_u16, write_le_u16, read_le_u16, false, u16); + byte_order_test_read_write!(test_le_u32, write_le_u32, read_le_u32, false, u32); + byte_order_test_read_write!(test_le_u64, write_le_u64, read_le_u64, false, u64); + byte_order_test_read_write!(test_le_i32, write_le_i32, read_le_i32, false, i32); + byte_order_test_read_write!(test_be_u16, write_be_u16, read_be_u16, true, u16); + byte_order_test_read_write!(test_be_u32, write_be_u32, read_be_u32, true, u32); +} diff --git a/src/vmm/src/utils/mod.rs b/src/vmm/src/utils/mod.rs new file mode 100644 index 00000000000..447a7260774 --- /dev/null +++ b/src/vmm/src/utils/mod.rs @@ -0,0 +1,57 @@ +// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// We use `utils` as a wrapper over `vmm_sys_util` to control the latter +// dependency easier (i.e. update only in one place `vmm_sys_util` version). +// More specifically, we are re-exporting modules from `vmm_sys_util` as part +// of the `utils` crate. +pub use vmm_sys_util::ioctl::ioctl_expr; +pub use vmm_sys_util::{ + epoll, errno, eventfd, fam, generate_fam_struct_impl, ioctl, ioctl_ioc_nr, ioctl_iow_nr, rand, + seek_hole, sock_ctrl_msg, syscall, tempdir, tempfile, terminal, +}; + +/// Module with helpers to read/write bytes into slices +pub mod byte_order; +/// Module with network related helpers +pub mod net; +/// Module with external libc functions +pub mod signal; +/// Module with state machine +pub mod sm; + +use std::num::Wrapping; +use std::result::Result; + +/// Return the default page size of the platform, in bytes. +pub fn get_page_size() -> Result { + // SAFETY: Safe because the parameters are valid. + match unsafe { libc::sysconf(libc::_SC_PAGESIZE) } { + -1 => Err(errno::Error::last()), + ps => Ok(usize::try_from(ps).unwrap()), + } +} + +/// Safely converts a u64 value to a usize value. +/// This bypasses the Clippy lint check because we only support 64-bit platforms. +#[cfg(target_pointer_width = "64")] +#[inline] +#[allow(clippy::cast_possible_truncation)] +pub const fn u64_to_usize(num: u64) -> usize { + num as usize +} + +/// Safely converts a usize value to a u64 value. +/// This bypasses the Clippy lint check because we only support 64-bit platforms. +#[cfg(target_pointer_width = "64")] +#[inline] +#[allow(clippy::cast_possible_truncation)] +pub const fn usize_to_u64(num: usize) -> u64 { + num as u64 +} + +/// Converts a usize into a wrapping u32. +#[inline] +pub const fn wrap_usize_to_u32(num: usize) -> Wrapping { + Wrapping(((num as u64) & 0xFFFFFFFF) as u32) +} diff --git a/src/vmm/src/utils/net/ipv4addr.rs b/src/vmm/src/utils/net/ipv4addr.rs new file mode 100644 index 00000000000..654e6f824d5 --- /dev/null +++ b/src/vmm/src/utils/net/ipv4addr.rs @@ -0,0 +1,56 @@ +// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::net::Ipv4Addr; + +/// Checks if an IPv4 address is RFC 3927 compliant. +pub fn is_link_local_valid(ipv4_addr: Ipv4Addr) -> bool { + match ipv4_addr.octets() { + [169, 254, 0, _] => false, + [169, 254, 255, _] => false, + [169, 254, _, _] => true, + _ => false, + } +} + +#[cfg(test)] +mod tests { + use std::net::Ipv4Addr; + + use super::*; + + #[test] + fn test_is_link_local_valid() { + // Outside link-local IPv4 address range (169.254.0.0/16 - 169.254.255.255/16). + let mut ipv4_addr = Ipv4Addr::new(1, 1, 1, 1); + assert!(!is_link_local_valid(ipv4_addr)); + + // First 256 addresses can not be used, per RFC 3927. + ipv4_addr = Ipv4Addr::new(169, 254, 0, 0); + assert!(!is_link_local_valid(ipv4_addr)); + ipv4_addr = Ipv4Addr::new(169, 254, 0, 10); + assert!(!is_link_local_valid(ipv4_addr)); + ipv4_addr = Ipv4Addr::new(169, 254, 0, 255); + assert!(!is_link_local_valid(ipv4_addr)); + + // Last 256 addresses can not be used, per RFC 3927. + ipv4_addr = Ipv4Addr::new(169, 254, 255, 0); + assert!(!is_link_local_valid(ipv4_addr)); + ipv4_addr = Ipv4Addr::new(169, 254, 255, 194); + assert!(!is_link_local_valid(ipv4_addr)); + ipv4_addr = Ipv4Addr::new(169, 254, 255, 255); + assert!(!is_link_local_valid(ipv4_addr)); + + // First valid IPv4 link-local address. + ipv4_addr = Ipv4Addr::new(169, 254, 1, 0); + assert!(is_link_local_valid(ipv4_addr)); + + // Last valid IPv4 link-local address. + ipv4_addr = Ipv4Addr::new(169, 254, 254, 255); + assert!(is_link_local_valid(ipv4_addr)); + + // In between valid IPv4 link-local address. + ipv4_addr = Ipv4Addr::new(169, 254, 170, 2); + assert!(is_link_local_valid(ipv4_addr)); + } +} diff --git a/src/vmm/src/utils/net/mac.rs b/src/vmm/src/utils/net/mac.rs new file mode 100644 index 00000000000..86f92881b04 --- /dev/null +++ b/src/vmm/src/utils/net/mac.rs @@ -0,0 +1,159 @@ +// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +// +// Portions Copyright 2017 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the THIRD-PARTY file. + +//! Contains support for parsing and constructing MAC addresses +//! More information about MAC addresses can be found [here] +//! +//! [here]: https://en.wikipedia.org/wiki/MAC_address + +use std::fmt; +use std::result::Result; +use std::str::FromStr; + +use serde::de::{Deserialize, Deserializer, Error}; +use serde::ser::{Serialize, Serializer}; + +/// The number of tuples (the ones separated by ":") contained in a MAC address. +pub const MAC_ADDR_LEN: u8 = 6; + +/// Represents a MAC address +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +#[repr(transparent)] +/// Representation of a MAC address. +pub struct MacAddr { + bytes: [u8; MAC_ADDR_LEN as usize], +} + +impl fmt::Display for MacAddr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let b = &self.bytes; + write!( + f, + "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}", + b[0], b[1], b[2], b[3], b[4], b[5] + ) + } +} + +impl From<[u8; 6]> for MacAddr { + fn from(bytes: [u8; 6]) -> Self { + Self { bytes } + } +} + +impl From for [u8; 6] { + fn from(mac: MacAddr) -> Self { + mac.bytes + } +} + +impl FromStr for MacAddr { + type Err = String; + /// Try to turn a `&str` into a `MacAddr` object. The method will return the `str` that failed + /// to be parsed. + /// # Arguments + /// + /// * `s` - reference that can be converted to &str. + fn from_str(s: &str) -> Result { + let v: Vec<&str> = s.split(':').collect(); + let mut bytes = [0u8; MAC_ADDR_LEN as usize]; + + if v.len() != MAC_ADDR_LEN as usize { + return Err(String::from(s)); + } + + for i in 0..MAC_ADDR_LEN as usize { + if v[i].len() != 2 { + return Err(String::from(s)); + } + bytes[i] = u8::from_str_radix(v[i], 16).map_err(|_| String::from(s))?; + } + + Ok(MacAddr { bytes }) + } +} + +impl MacAddr { + /// Create a `MacAddr` from a slice. + /// Does not check whether `src.len()` == `MAC_ADDR_LEN`. + /// # Arguments + /// + /// * `src` - slice from which to copy MAC address content. + #[inline] + pub fn from_bytes_unchecked(src: &[u8]) -> MacAddr { + // TODO: using something like std::mem::uninitialized could avoid the extra initialization, + // if this ever becomes a performance bottleneck. + let mut bytes = [0u8; MAC_ADDR_LEN as usize]; + bytes[..].copy_from_slice(src); + + MacAddr { bytes } + } + + /// Return the underlying content of this `MacAddr` in bytes. + #[inline] + pub fn get_bytes(&self) -> &[u8] { + &self.bytes + } +} + +impl Serialize for MacAddr { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + Serialize::serialize(&self.to_string(), serializer) + } +} + +impl<'de> Deserialize<'de> for MacAddr { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = ::deserialize(deserializer)?; + MacAddr::from_str(&s).map_err(|_| D::Error::custom("The provided MAC address is invalid.")) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_mac_addr() { + // too long + MacAddr::from_str("aa:aa:aa:aa:aa:aa:aa").unwrap_err(); + + // invalid hex + MacAddr::from_str("aa:aa:aa:aa:aa:ax").unwrap_err(); + + // single digit mac address component should be invalid + MacAddr::from_str("aa:aa:aa:aa:aa:b").unwrap_err(); + + // components with more than two digits should also be invalid + MacAddr::from_str("aa:aa:aa:aa:aa:bbb").unwrap_err(); + + let mac = MacAddr::from_str("12:34:56:78:9a:BC").unwrap(); + + println!("parsed MAC address: {}", mac); + + let bytes = mac.get_bytes(); + assert_eq!(bytes, [0x12u8, 0x34, 0x56, 0x78, 0x9a, 0xbc]); + } + + #[test] + fn test_mac_addr_serialization_and_deserialization() { + let mac: MacAddr = + serde_json::from_str("\"12:34:56:78:9a:bc\"").expect("MacAddr deserialization failed."); + + let bytes = mac.get_bytes(); + assert_eq!(bytes, [0x12u8, 0x34, 0x56, 0x78, 0x9a, 0xbc]); + + let s = serde_json::to_string(&mac).expect("MacAddr serialization failed."); + assert_eq!(s, "\"12:34:56:78:9a:bc\""); + } +} diff --git a/src/vmm/src/utils/net/mod.rs b/src/vmm/src/utils/net/mod.rs new file mode 100644 index 00000000000..abf3b516f21 --- /dev/null +++ b/src/vmm/src/utils/net/mod.rs @@ -0,0 +1,16 @@ +// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +// +// Portions Copyright 2017 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the THIRD-PARTY file. + +#![warn(missing_docs)] +//! # Network-related utilities +//! +//! Provides tools for representing and handling network related concepts like MAC addresses and +//! network interfaces. + +/// Provides IPv4 address utility methods. +pub mod ipv4addr; +pub mod mac; diff --git a/src/vmm/src/utils/signal.rs b/src/vmm/src/utils/signal.rs new file mode 100644 index 00000000000..172ae1b376e --- /dev/null +++ b/src/vmm/src/utils/signal.rs @@ -0,0 +1,22 @@ +// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use libc::c_int; +pub use vmm_sys_util::signal::*; + +extern "C" { + fn __libc_current_sigrtmin() -> c_int; + fn __libc_current_sigrtmax() -> c_int; +} + +/// Sigrtmin +pub fn sigrtmin() -> c_int { + // SAFETY: Function has no invariants that can be broken. + unsafe { __libc_current_sigrtmin() } +} + +/// Sigrtmax +pub fn sigrtmax() -> c_int { + // SAFETY: Function has no invariants that can be broken. + unsafe { __libc_current_sigrtmax() } +} diff --git a/src/vmm/src/utils/sm.rs b/src/vmm/src/utils/sm.rs new file mode 100644 index 00000000000..6e64e8f1ef4 --- /dev/null +++ b/src/vmm/src/utils/sm.rs @@ -0,0 +1,144 @@ +// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::fmt::Debug; + +/// Simple abstraction of a state machine. +/// +/// `StateMachine` is a wrapper over `T` that also encodes state information for `T`. +/// +/// Each state for `T` is represented by a `StateFn` which is a function that acts as +/// the state handler for that particular state of `T`. +/// +/// `StateFn` returns exactly one other `StateMachine` thus each state gets clearly +/// defined transitions to other states. +pub struct StateMachine { + function: Option>, +} +impl Debug for StateMachine { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("StateMachine") + .field("function", &self.function.map(|f| f as usize)) + .finish() + } +} + +/// Type representing a state handler of a `StateMachine` machine. Each state handler +/// is a function from `T` that handles a specific state of `T`. +type StateFn = fn(&mut T) -> StateMachine; + +impl StateMachine { + /// Creates a new state wrapper. + /// + /// # Arguments + /// + /// `function` - the state handler for this state. + pub fn new(function: Option>) -> StateMachine { + StateMachine { function } + } + + /// Creates a new state wrapper that has further possible transitions. + /// + /// # Arguments + /// + /// `function` - the state handler for this state. + pub fn next(function: StateFn) -> StateMachine { + StateMachine::new(Some(function)) + } + + /// Creates a new state wrapper that has no further transitions. The state machine + /// will finish after running this handler. + /// + /// # Arguments + /// + /// `function` - the state handler for this last state. + pub fn finish() -> StateMachine { + StateMachine::new(None) + } + + /// Runs a state machine for `T` starting from the provided state. + /// + /// # Arguments + /// + /// `machine` - a mutable reference to the object running through the various states. + /// `starting_state_fn` - a `fn(&mut T) -> StateMachine` that should be the handler for + /// the initial state. + pub fn run(machine: &mut T, starting_state_fn: StateFn) { + // Start off in the `starting_state` state. + let mut state_machine = StateMachine::new(Some(starting_state_fn)); + // While current state is not a final/end state, keep churning. + while let Some(state_fn) = state_machine.function { + // Run the current state handler, and get the next one. + state_machine = state_fn(machine); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // DummyMachine with states `s1`, `s2` and `s3`. + #[derive(Debug)] + struct DummyMachine { + private_data_s1: bool, + private_data_s2: bool, + private_data_s3: bool, + } + + impl DummyMachine { + fn new() -> Self { + DummyMachine { + private_data_s1: false, + private_data_s2: false, + private_data_s3: false, + } + } + + // DummyMachine functions here. + + // Simple state-machine: start->s1->s2->s3->done. + fn run(&mut self) { + // Verify the machine has not run yet. + assert!(!self.private_data_s1); + assert!(!self.private_data_s2); + assert!(!self.private_data_s3); + + // Run the state-machine. + StateMachine::run(self, Self::s1); + + // Verify the machine went through all states. + assert!(self.private_data_s1); + assert!(self.private_data_s2); + assert!(self.private_data_s3); + } + + fn s1(&mut self) -> StateMachine { + // Verify private data mutates along with the states. + assert!(!self.private_data_s1); + self.private_data_s1 = true; + StateMachine::next(Self::s2) + } + + fn s2(&mut self) -> StateMachine { + // Verify private data mutates along with the states. + assert!(!self.private_data_s2); + self.private_data_s2 = true; + StateMachine::next(Self::s3) + } + + fn s3(&mut self) -> StateMachine { + // Verify private data mutates along with the states. + assert!(!self.private_data_s3); + self.private_data_s3 = true; + // The machine ends here, adding `s1` as next state to validate this. + StateMachine::finish() + } + } + + #[test] + fn test_sm() { + let mut machine = DummyMachine::new(); + machine.run(); + } +} diff --git a/src/vmm/src/vmm_config/boot_source.rs b/src/vmm/src/vmm_config/boot_source.rs index 8374ae335a8..37c9a32ed79 100644 --- a/src/vmm/src/vmm_config/boot_source.rs +++ b/src/vmm/src/vmm_config/boot_source.rs @@ -99,10 +99,9 @@ impl BootConfig { #[cfg(test)] pub(crate) mod tests { - use utils::tempfile::TempFile; - use super::*; use crate::snapshot::Snapshot; + use crate::utils::tempfile::TempFile; #[test] fn test_boot_config() { diff --git a/src/vmm/src/vmm_config/drive.rs b/src/vmm/src/vmm_config/drive.rs index 9e0c2efd7a1..83c4ef5d066 100644 --- a/src/vmm/src/vmm_config/drive.rs +++ b/src/vmm/src/vmm_config/drive.rs @@ -177,10 +177,9 @@ impl BlockBuilder { #[cfg(test)] mod tests { - use utils::tempfile::TempFile; - use super::*; use crate::devices::virtio::block::virtio::VirtioBlockError; + use crate::utils::tempfile::TempFile; impl PartialEq for DriveError { fn eq(&self, other: &DriveError) -> bool { diff --git a/src/vmm/src/vmm_config/metrics.rs b/src/vmm/src/vmm_config/metrics.rs index 9e25af4562c..abe6ede92db 100644 --- a/src/vmm/src/vmm_config/metrics.rs +++ b/src/vmm/src/vmm_config/metrics.rs @@ -36,9 +36,8 @@ pub fn init_metrics(metrics_cfg: MetricsConfig) -> Result<(), MetricsConfigError #[cfg(test)] mod tests { - use utils::tempfile::TempFile; - use super::*; + use crate::utils::tempfile::TempFile; #[test] fn test_init_metrics() { diff --git a/src/vmm/src/vmm_config/net.rs b/src/vmm/src/vmm_config/net.rs index 5782face4b5..4b917c2ca48 100644 --- a/src/vmm/src/vmm_config/net.rs +++ b/src/vmm/src/vmm_config/net.rs @@ -6,10 +6,10 @@ use std::ops::Deref; use std::sync::{Arc, Mutex}; use serde::{Deserialize, Serialize}; -use utils::net::mac::MacAddr; use super::RateLimiterConfig; use crate::devices::virtio::net::{Net, TapError}; +use crate::utils::net::mac::MacAddr; use crate::VmmError; /// This struct represents the strongly typed equivalent of the json body from net iface diff --git a/src/vmm/src/vmm_config/vsock.rs b/src/vmm/src/vmm_config/vsock.rs index 8c170bd97a7..ed38b1e8de3 100644 --- a/src/vmm/src/vmm_config/vsock.rs +++ b/src/vmm/src/vmm_config/vsock.rs @@ -112,10 +112,9 @@ impl VsockBuilder { #[cfg(test)] pub(crate) mod tests { - use utils::tempfile::TempFile; - use super::*; use crate::devices::virtio::vsock::VSOCK_DEV_ID; + use crate::utils::tempfile::TempFile; pub(crate) fn default_config(tmp_sock_file: &TempFile) -> VsockDeviceConfig { VsockDeviceConfig { diff --git a/src/vmm/src/vstate/memory.rs b/src/vmm/src/vstate/memory.rs index 5f0390ac72d..f2f1bf8445a 100644 --- a/src/vmm/src/vstate/memory.rs +++ b/src/vmm/src/vstate/memory.rs @@ -9,7 +9,6 @@ use std::fs::File; use std::io::SeekFrom; use serde::{Deserialize, Serialize}; -use utils::{errno, get_page_size, u64_to_usize}; pub use vm_memory::bitmap::{AtomicBitmap, Bitmap, BitmapSlice, BS}; pub use vm_memory::mmap::MmapRegionBuilder; use vm_memory::mmap::{MmapRegionError, NewBitmap}; @@ -19,6 +18,7 @@ pub use vm_memory::{ }; use vm_memory::{Error as VmMemoryError, GuestMemoryError, WriteVolatile}; +use crate::utils::{errno, get_page_size, u64_to_usize}; use crate::vmm_config::machine_config::HugePageConfig; use crate::DirtyBitmap; @@ -425,11 +425,10 @@ mod tests { use std::collections::HashMap; use std::io::{Read, Seek}; - use utils::get_page_size; - use utils::tempfile::TempFile; - use super::*; use crate::snapshot::Snapshot; + use crate::utils::get_page_size; + use crate::utils::tempfile::TempFile; #[test] fn test_from_raw_regions() { diff --git a/src/vmm/src/vstate/vcpu/mod.rs b/src/vmm/src/vstate/vcpu/mod.rs index 7760166d089..cd56eb66ce0 100644 --- a/src/vmm/src/vstate/vcpu/mod.rs +++ b/src/vmm/src/vstate/vcpu/mod.rs @@ -16,13 +16,13 @@ use kvm_ioctls::VcpuExit; use libc::{c_int, c_void, siginfo_t}; use log::{error, info, warn}; use seccompiler::{BpfProgram, BpfProgramRef}; -use utils::errno; -use utils::eventfd::EventFd; -use utils::signal::{register_signal_handler, sigrtmin, Killable}; -use utils::sm::StateMachine; use crate::cpu_config::templates::{CpuConfiguration, GuestConfigError}; use crate::logger::{IncMetric, METRICS}; +use crate::utils::errno; +use crate::utils::eventfd::EventFd; +use crate::utils::signal::{register_signal_handler, sigrtmin, Killable}; +use crate::utils::sm::StateMachine; use crate::vstate::vm::Vm; use crate::FcExitCode; @@ -49,7 +49,7 @@ pub enum VcpuError { /// Received error signaling kvm exit: {0} FaultyKvmExit(String), /// Failed to signal vcpu: {0} - SignalVcpu(utils::errno::Error), + SignalVcpu(crate::utils::errno::Error), /// Unexpected kvm exit received: {0} UnhandledKvmExit(String), /// Failed to run action on vcpu: {0} @@ -620,7 +620,7 @@ pub struct VcpuHandle { /// Error type for [`VcpuHandle::send_event`]. #[derive(Debug, derive_more::From, thiserror::Error)] #[error("Failed to signal vCPU: {0}")] -pub struct VcpuSendEventError(pub utils::errno::Error); +pub struct VcpuSendEventError(pub crate::utils::errno::Error); impl VcpuHandle { /// Creates a new [`VcpuHandle`]. @@ -699,14 +699,14 @@ pub mod tests { use std::sync::{Arc, Barrier, Mutex}; use linux_loader::loader::KernelLoader; - use utils::errno; - use utils::signal::validate_signal_num; use super::*; use crate::builder::StartMicrovmError; use crate::devices::bus::DummyDevice; use crate::devices::BusDevice; use crate::seccomp_filters::get_empty_filters; + use crate::utils::errno; + use crate::utils::signal::validate_signal_num; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; use crate::vstate::vcpu::VcpuError as EmulationError; use crate::vstate::vm::tests::setup_vm; @@ -898,7 +898,7 @@ pub mod tests { entry_addr.unwrap().kernel_load } - fn vcpu_configured_for_boot() -> (VcpuHandle, utils::eventfd::EventFd) { + fn vcpu_configured_for_boot() -> (VcpuHandle, crate::utils::eventfd::EventFd) { Vcpu::register_kick_signal_handler(); // Need enough mem to boot linux. let mem_size = 64 << 20; diff --git a/src/vmm/src/vstate/vcpu/x86_64.rs b/src/vmm/src/vstate/vcpu/x86_64.rs index 899bbff1123..bf8b13bf268 100644 --- a/src/vmm/src/vstate/vcpu/x86_64.rs +++ b/src/vmm/src/vstate/vcpu/x86_64.rs @@ -15,7 +15,6 @@ use kvm_bindings::{ use kvm_ioctls::{VcpuExit, VcpuFd}; use log::{error, warn}; use serde::{Deserialize, Serialize}; -use utils::fam; use crate::arch::x86_64::gen::msr_index::{MSR_IA32_TSC, MSR_IA32_TSC_DEADLINE}; use crate::arch::x86_64::interrupts; @@ -23,6 +22,7 @@ use crate::arch::x86_64::msr::{create_boot_msr_entries, MsrError}; use crate::arch::x86_64::regs::{SetupFpuError, SetupRegistersError, SetupSpecialRegistersError}; use crate::cpu_config::x86_64::{cpuid, CpuConfiguration}; use crate::logger::{IncMetric, METRICS}; +use crate::utils::fam; use crate::vstate::memory::{Address, GuestAddress, GuestMemoryMmap}; use crate::vstate::vcpu::{VcpuConfig, VcpuEmulation}; use crate::vstate::vm::Vm; @@ -50,7 +50,7 @@ pub enum KvmVcpuError { /// Failed to convert `kvm_bindings::CpuId` to `Cpuid`: {0} ConvertCpuidType(#[from] cpuid::CpuidTryFromKvmCpuid), /// Failed FamStructWrapper operation: {0} - Fam(#[from] utils::fam::Error), + Fam(#[from] crate::utils::fam::Error), /// Failed to get dumpable MSR index list: {0} GetMsrsToDump(#[from] crate::arch::x86_64::msr::MsrError), /// Cannot open the VCPU file descriptor: {0} @@ -106,7 +106,7 @@ pub enum KvmVcpuError { /// Error type for [`KvmVcpu::get_tsc_khz`] and [`KvmVcpu::is_tsc_scaling_required`]. #[derive(Debug, thiserror::Error, derive_more::From, Eq, PartialEq)] #[error("{0}")] -pub struct GetTscError(utils::errno::Error); +pub struct GetTscError(crate::utils::errno::Error); /// Error type for [`KvmVcpu::set_tsc_khz`]. #[derive(Debug, thiserror::Error, Eq, PartialEq)] @@ -117,11 +117,11 @@ pub struct SetTscError(#[from] kvm_ioctls::Error); #[derive(Debug, thiserror::Error, displaydoc::Display, Eq, PartialEq)] pub enum KvmVcpuConfigureError { /// Failed to convert `Cpuid` to `kvm_bindings::CpuId`: {0} - ConvertCpuidType(#[from] utils::fam::Error), + ConvertCpuidType(#[from] crate::utils::fam::Error), /// Failed to apply modifications to CPUID: {0} NormalizeCpuidError(#[from] cpuid::NormalizeCpuidError), /// Failed to set CPUID: {0} - SetCpuid(#[from] utils::errno::Error), + SetCpuid(#[from] crate::utils::errno::Error), /// Failed to set MSRs: {0} SetMsrs(#[from] MsrError), /// Failed to setup registers: {0} diff --git a/src/vmm/src/vstate/vm.rs b/src/vmm/src/vstate/vm.rs index c227fae0b7c..0f72abcf68f 100644 --- a/src/vmm/src/vstate/vm.rs +++ b/src/vmm/src/vstate/vm.rs @@ -17,14 +17,14 @@ use kvm_bindings::{ use kvm_bindings::{kvm_userspace_memory_region, KVM_API_VERSION, KVM_MEM_LOG_DIRTY_PAGES}; use kvm_ioctls::{Kvm, VmFd}; use serde::{Deserialize, Serialize}; -#[cfg(target_arch = "x86_64")] -use utils::u64_to_usize; #[cfg(target_arch = "aarch64")] use crate::arch::aarch64::gic::GICDevice; #[cfg(target_arch = "aarch64")] use crate::arch::aarch64::gic::GicState; use crate::cpu_config::templates::KvmCapability; +#[cfg(target_arch = "x86_64")] +use crate::utils::u64_to_usize; use crate::vstate::memory::{Address, GuestMemory, GuestMemoryMmap, GuestMemoryRegion}; /// Errors associated with the wrappers over KVM ioctls. diff --git a/src/vmm/tests/devices.rs b/src/vmm/tests/devices.rs index 3160a7cd3b9..28f5b1ed040 100644 --- a/src/vmm/tests/devices.rs +++ b/src/vmm/tests/devices.rs @@ -8,10 +8,10 @@ use std::sync::{Arc, Mutex}; use event_manager::{EventManager, SubscriberOps}; use libc::EFD_NONBLOCK; -use utils::eventfd::EventFd; use vm_superio::Serial; use vmm::devices::legacy::serial::SerialOut; use vmm::devices::legacy::{EventFdTrigger, SerialEventsWrapper, SerialWrapper}; +use vmm::utils::eventfd::EventFd; fn create_serial( pipe: c_int, diff --git a/src/vmm/tests/io_uring.rs b/src/vmm/tests/io_uring.rs index 37c0bd3f16d..5ee5a389d35 100644 --- a/src/vmm/tests/io_uring.rs +++ b/src/vmm/tests/io_uring.rs @@ -6,10 +6,10 @@ use std::os::unix::io::AsRawFd; use std::thread; use std::time::Duration; -use utils::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; -use utils::eventfd::EventFd; -use utils::tempfile::TempFile; use vm_memory::VolatileMemory; +use vmm::utils::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; +use vmm::utils::eventfd::EventFd; +use vmm::utils::tempfile::TempFile; use vmm::vstate::memory::{Bytes, MmapRegion}; mod test_utils { From af41523f708646dbd17498e521bbfdead9718cb4 Mon Sep 17 00:00:00 2001 From: Egor Lazarchuk Date: Sat, 24 Aug 2024 15:15:00 +0100 Subject: [PATCH 4/5] refactor: remove files from utils that are vmm specific In previous commit we moved `vmm` specific parts of `utils` into `vmm` crate, so now we can remove them from `utils`. Signed-off-by: Egor Lazarchuk --- src/firecracker/examples/uffd/uffd_utils.rs | 4 +- src/firecracker/src/api_server/mod.rs | 9 +- src/jailer/src/env.rs | 8 +- src/jailer/src/main.rs | 5 +- src/rebase-snap/src/main.rs | 3 +- src/snapshot-editor/src/edit_memory.rs | 2 +- src/snapshot-editor/src/utils.rs | 2 +- src/utils/src/byte_order.rs | 117 ------------- src/utils/src/lib.rs | 40 ----- src/utils/src/net/ipv4addr.rs | 63 ------- src/utils/src/net/mac.rs | 181 -------------------- src/utils/src/net/mod.rs | 16 -- src/utils/src/signal.rs | 20 --- src/utils/src/sm.rs | 144 ---------------- 14 files changed, 16 insertions(+), 598 deletions(-) delete mode 100644 src/utils/src/byte_order.rs delete mode 100644 src/utils/src/net/ipv4addr.rs delete mode 100644 src/utils/src/net/mac.rs delete mode 100644 src/utils/src/net/mod.rs delete mode 100644 src/utils/src/signal.rs delete mode 100644 src/utils/src/sm.rs diff --git a/src/firecracker/examples/uffd/uffd_utils.rs b/src/firecracker/examples/uffd/uffd_utils.rs index f5a5773e115..a0d63e253a4 100644 --- a/src/firecracker/examples/uffd/uffd_utils.rs +++ b/src/firecracker/examples/uffd/uffd_utils.rs @@ -299,8 +299,8 @@ mod tests { use std::mem::MaybeUninit; use std::os::unix::net::UnixListener; - use utils::tempdir::TempDir; - use utils::tempfile::TempFile; + use vmm::utils::tempdir::TempDir; + use vmm::utils::tempfile::TempFile; use super::*; diff --git a/src/firecracker/src/api_server/mod.rs b/src/firecracker/src/api_server/mod.rs index 80f5510abe1..35b01c4cbe2 100644 --- a/src/firecracker/src/api_server/mod.rs +++ b/src/firecracker/src/api_server/mod.rs @@ -17,6 +17,7 @@ use parsed_request::{ParsedRequest, RequestAction}; use seccompiler::BpfProgramRef; use serde_json::json; use utils::eventfd::EventFd; +use utils::time::{get_time_us, ClockType}; use vmm::logger::{ debug, error, info, update_metric_with_elapsed_time, warn, ProcessTimeReporter, METRICS, }; @@ -101,8 +102,7 @@ impl ApiServer { } }; for server_request in request_vec { - let request_processing_start_us = - utils::time::get_time_us(utils::time::ClockType::Monotonic); + let request_processing_start_us = get_time_us(ClockType::Monotonic); // Use `self.handle_request()` as the processing callback. let response = server_request .process(|request| self.handle_request(request, request_processing_start_us)); @@ -110,8 +110,7 @@ impl ApiServer { error!("API Server encountered an error on response: {}", err); }; - let delta_us = utils::time::get_time_us(utils::time::ClockType::Monotonic) - - request_processing_start_us; + let delta_us = get_time_us(ClockType::Monotonic) - request_processing_start_us; debug!("Total previous API call duration: {} us.", delta_us); } } @@ -259,7 +258,7 @@ mod tests { // latencies_us.pause_vm metric can be set to 0, failing the assertion below. By // subtracting 1 we assure that the metric will always be set to at least 1 (if it gets set // at all, which is what this test is trying to prove). - let start_time_us = utils::time::get_time_us(ClockType::Monotonic) - 1; + let start_time_us = get_time_us(ClockType::Monotonic) - 1; assert_eq!(METRICS.latencies_us.pause_vm.fetch(), 0); to_api.send(Box::new(Ok(VmmData::Empty))).unwrap(); let response = diff --git a/src/jailer/src/env.rs b/src/jailer/src/env.rs index 2e4efba0494..1f0cdb7b342 100644 --- a/src/jailer/src/env.rs +++ b/src/jailer/src/env.rs @@ -13,6 +13,7 @@ use std::{fmt, io}; use utils::arg_parser::UtilsArgParserError::MissingValue; use utils::syscall::SyscallReturnCode; +use utils::time::{get_time_us, ClockType}; use utils::{arg_parser, validators}; use crate::cgroup::{CgroupConfiguration, CgroupConfigurationBuilder}; @@ -663,7 +664,7 @@ impl Env { // Daemonize before exec, if so required (when the dev_null variable != None). if let Some(dev_null) = dev_null { // Meter CPU usage before fork() - self.jailer_cpu_time_us = utils::time::get_time_us(utils::time::ClockType::ProcessCpu); + self.jailer_cpu_time_us = get_time_us(ClockType::ProcessCpu); // We follow the double fork method to daemonize the jailer referring to // https://0xjet.github.io/3OHA/2022/04/11/post.html @@ -688,7 +689,7 @@ impl Env { .map_err(JailerError::SetSid)?; // Meter CPU usage before fork() - self.jailer_cpu_time_us += utils::time::get_time_us(utils::time::ClockType::ProcessCpu); + self.jailer_cpu_time_us += get_time_us(ClockType::ProcessCpu); // Daemons should not have controlling terminals. // If a daemon has a controlling terminal, it can receive signals @@ -714,8 +715,7 @@ impl Env { } // Compute jailer's total CPU time up to the current time. - self.jailer_cpu_time_us += - utils::time::get_time_us(utils::time::ClockType::ProcessCpu) - self.start_time_cpu_us; + self.jailer_cpu_time_us += get_time_us(ClockType::ProcessCpu) - self.start_time_cpu_us; // Reset process start time. self.start_time_cpu_us = 0; diff --git a/src/jailer/src/main.rs b/src/jailer/src/main.rs index 447f685d99d..a4132467248 100644 --- a/src/jailer/src/main.rs +++ b/src/jailer/src/main.rs @@ -9,6 +9,7 @@ use std::{env as p_env, fs, io}; use env::PROC_MOUNTS; use utils::arg_parser::{ArgParser, Argument, UtilsArgParserError as ParsingError}; use utils::syscall::SyscallReturnCode; +use utils::time::{get_time_us, ClockType}; use utils::validators; use crate::env::Env; @@ -334,8 +335,8 @@ fn main_exec() -> Result<(), JailerError> { Env::new( arguments, - utils::time::get_time_us(utils::time::ClockType::Monotonic), - utils::time::get_time_us(utils::time::ClockType::ProcessCpu), + get_time_us(ClockType::Monotonic), + get_time_us(ClockType::ProcessCpu), PROC_MOUNTS, ) .and_then(|env| { diff --git a/src/rebase-snap/src/main.rs b/src/rebase-snap/src/main.rs index 088b25c31bf..1909d9ea9c6 100644 --- a/src/rebase-snap/src/main.rs +++ b/src/rebase-snap/src/main.rs @@ -8,7 +8,6 @@ use std::os::unix::io::AsRawFd; use utils::arg_parser::{ArgParser, Argument, Arguments, UtilsArgParserError as ArgError}; use utils::seek_hole::SeekHole; -use utils::u64_to_usize; const REBASE_SNAP_VERSION: &str = env!("CARGO_PKG_VERSION"); const BASE_FILE: &str = "base-file"; @@ -104,7 +103,7 @@ fn rebase(base_file: &mut File, diff_file: &mut File) -> Result<(), FileError> { base_file.as_raw_fd(), diff_file.as_raw_fd(), (&mut cursor as *mut u64).cast::(), - u64_to_usize(block_end.saturating_sub(cursor)), + usize::try_from(block_end.saturating_sub(cursor)).unwrap(), ) }; if num_transferred_bytes < 0 { diff --git a/src/snapshot-editor/src/edit_memory.rs b/src/snapshot-editor/src/edit_memory.rs index 6b092931393..667f7af0960 100644 --- a/src/snapshot-editor/src/edit_memory.rs +++ b/src/snapshot-editor/src/edit_memory.rs @@ -8,7 +8,7 @@ use std::path::PathBuf; use clap::Subcommand; use fc_utils::seek_hole::SeekHole; -use fc_utils::u64_to_usize; +use vmm::utils::u64_to_usize; #[derive(Debug, thiserror::Error, displaydoc::Display)] pub enum EditMemoryError { diff --git a/src/snapshot-editor/src/utils.rs b/src/snapshot-editor/src/utils.rs index 3bccf46917b..bdbc6f48d6e 100644 --- a/src/snapshot-editor/src/utils.rs +++ b/src/snapshot-editor/src/utils.rs @@ -4,10 +4,10 @@ use std::fs::{File, OpenOptions}; use std::path::PathBuf; -use fc_utils::u64_to_usize; use semver::Version; use vmm::persist::MicrovmState; use vmm::snapshot::Snapshot; +use vmm::utils::u64_to_usize; // Some errors are only used in aarch64 code #[allow(unused)] diff --git a/src/utils/src/byte_order.rs b/src/utils/src/byte_order.rs deleted file mode 100644 index cfb057235c0..00000000000 --- a/src/utils/src/byte_order.rs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -macro_rules! generate_read_fn { - ($fn_name: ident, $data_type: ty, $byte_type: ty, $type_size: expr, $endian_type: ident) => { - pub fn $fn_name(input: &[$byte_type]) -> $data_type { - assert!($type_size == std::mem::size_of::<$data_type>()); - let mut array = [0u8; $type_size]; - #[allow(clippy::cast_sign_loss)] - #[allow(clippy::cast_possible_wrap)] - for (byte, read) in array.iter_mut().zip(input.iter().cloned()) { - *byte = read as u8; - } - <$data_type>::$endian_type(array) - } - }; -} - -macro_rules! generate_write_fn { - ($fn_name: ident, $data_type: ty, $byte_type: ty, $endian_type: ident) => { - pub fn $fn_name(buf: &mut [$byte_type], n: $data_type) { - #[allow(clippy::cast_sign_loss)] - #[allow(clippy::cast_possible_wrap)] - for (byte, read) in buf - .iter_mut() - .zip(<$data_type>::$endian_type(n).iter().cloned()) - { - *byte = read as $byte_type; - } - } - }; -} - -generate_read_fn!(read_le_u16, u16, u8, 2, from_le_bytes); -generate_read_fn!(read_le_u32, u32, u8, 4, from_le_bytes); -generate_read_fn!(read_le_u32_from_i8, u32, i8, 4, from_le_bytes); -generate_read_fn!(read_le_u64, u64, u8, 8, from_le_bytes); -generate_read_fn!(read_le_i32, i32, i8, 4, from_le_bytes); - -generate_read_fn!(read_be_u16, u16, u8, 2, from_be_bytes); -generate_read_fn!(read_be_u32, u32, u8, 4, from_be_bytes); - -generate_write_fn!(write_le_u16, u16, u8, to_le_bytes); -generate_write_fn!(write_le_u32, u32, u8, to_le_bytes); -generate_write_fn!(write_le_u32_to_i8, u32, i8, to_le_bytes); -generate_write_fn!(write_le_u64, u64, u8, to_le_bytes); -generate_write_fn!(write_le_i32, i32, i8, to_le_bytes); - -generate_write_fn!(write_be_u16, u16, u8, to_be_bytes); -generate_write_fn!(write_be_u32, u32, u8, to_be_bytes); - -#[cfg(test)] -mod tests { - use super::*; - macro_rules! byte_order_test_read_write { - ($test_name: ident, $write_fn_name: ident, $read_fn_name: ident, $is_be: expr, $data_type: ty) => { - #[test] - fn $test_name() { - #[allow(overflowing_literals)] - let test_cases = [ - ( - 0x0123_4567_89AB_CDEF as u64, - [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], - ), - ( - 0x0000_0000_0000_0000 as u64, - [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - ), - ( - 0x1923_2345_ABF3_CCD4 as u64, - [0x19, 0x23, 0x23, 0x45, 0xAB, 0xF3, 0xCC, 0xD4], - ), - ( - 0x0FF0_0FF0_0FF0_0FF0 as u64, - [0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0], - ), - ( - 0xFFFF_FFFF_FFFF_FFFF as u64, - [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], - ), - ( - 0x89AB_12D4_C2D2_09BB as u64, - [0x89, 0xAB, 0x12, 0xD4, 0xC2, 0xD2, 0x09, 0xBB], - ), - ]; - - let type_size = std::mem::size_of::<$data_type>(); - #[allow(clippy::cast_possible_truncation)] - #[allow(clippy::cast_sign_loss)] - for (test_val, v_arr) in &test_cases { - let v = *test_val as $data_type; - let cmp_iter: Box> = if $is_be { - Box::new(v_arr[(8 - type_size)..].iter()) - } else { - Box::new(v_arr.iter().rev()) - }; - // test write - let mut write_arr = vec![Default::default(); type_size]; - $write_fn_name(&mut write_arr, v); - for (cmp, cur) in cmp_iter.zip(write_arr.iter()) { - assert_eq!(*cmp, *cur as u8) - } - // test read - let read_val = $read_fn_name(&write_arr); - assert_eq!(v, read_val); - } - } - }; - } - - byte_order_test_read_write!(test_le_u16, write_le_u16, read_le_u16, false, u16); - byte_order_test_read_write!(test_le_u32, write_le_u32, read_le_u32, false, u32); - byte_order_test_read_write!(test_le_u64, write_le_u64, read_le_u64, false, u64); - byte_order_test_read_write!(test_le_i32, write_le_i32, read_le_i32, false, i32); - byte_order_test_read_write!(test_be_u16, write_be_u16, read_be_u16, true, u16); - byte_order_test_read_write!(test_be_u32, write_be_u32, read_be_u32, true, u32); -} diff --git a/src/utils/src/lib.rs b/src/utils/src/lib.rs index c16dddce0d4..c6e65bd2fe1 100644 --- a/src/utils/src/lib.rs +++ b/src/utils/src/lib.rs @@ -12,45 +12,5 @@ pub use vmm_sys_util::{ }; pub mod arg_parser; -pub mod byte_order; -pub mod net; -pub mod signal; -pub mod sm; pub mod time; pub mod validators; - -use std::num::Wrapping; -use std::result::Result; - -/// Return the default page size of the platform, in bytes. -pub fn get_page_size() -> Result { - // SAFETY: Safe because the parameters are valid. - match unsafe { libc::sysconf(libc::_SC_PAGESIZE) } { - -1 => Err(errno::Error::last()), - ps => Ok(usize::try_from(ps).unwrap()), - } -} - -/// Safely converts a u64 value to a usize value. -/// This bypasses the Clippy lint check because we only support 64-bit platforms. -#[cfg(target_pointer_width = "64")] -#[inline] -#[allow(clippy::cast_possible_truncation)] -pub const fn u64_to_usize(num: u64) -> usize { - num as usize -} - -/// Safely converts a usize value to a u64 value. -/// This bypasses the Clippy lint check because we only support 64-bit platforms. -#[cfg(target_pointer_width = "64")] -#[inline] -#[allow(clippy::cast_possible_truncation)] -pub const fn usize_to_u64(num: usize) -> u64 { - num as u64 -} - -/// Converts a usize into a wrapping u32. -#[inline] -pub const fn wrap_usize_to_u32(num: usize) -> Wrapping { - Wrapping(((num as u64) & 0xFFFFFFFF) as u32) -} diff --git a/src/utils/src/net/ipv4addr.rs b/src/utils/src/net/ipv4addr.rs deleted file mode 100644 index 9237d4004c9..00000000000 --- a/src/utils/src/net/ipv4addr.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -use std::net::Ipv4Addr; - -/// Checks if an IPv4 address is RFC 3927 compliant. -/// # Examples -/// -/// ``` -/// use std::net::Ipv4Addr; -/// use utils::net::ipv4addr::is_link_local_valid; -/// -/// is_link_local_valid(Ipv4Addr::new(169, 254, 1, 1)); -pub fn is_link_local_valid(ipv4_addr: Ipv4Addr) -> bool { - match ipv4_addr.octets() { - [169, 254, 0, _] => false, - [169, 254, 255, _] => false, - [169, 254, _, _] => true, - _ => false, - } -} - -#[cfg(test)] -mod tests { - use std::net::Ipv4Addr; - - use crate::net::ipv4addr::is_link_local_valid; - - #[test] - fn test_is_link_local_valid() { - // Outside link-local IPv4 address range (169.254.0.0/16 - 169.254.255.255/16). - let mut ipv4_addr = Ipv4Addr::new(1, 1, 1, 1); - assert!(!is_link_local_valid(ipv4_addr)); - - // First 256 addresses can not be used, per RFC 3927. - ipv4_addr = Ipv4Addr::new(169, 254, 0, 0); - assert!(!is_link_local_valid(ipv4_addr)); - ipv4_addr = Ipv4Addr::new(169, 254, 0, 10); - assert!(!is_link_local_valid(ipv4_addr)); - ipv4_addr = Ipv4Addr::new(169, 254, 0, 255); - assert!(!is_link_local_valid(ipv4_addr)); - - // Last 256 addresses can not be used, per RFC 3927. - ipv4_addr = Ipv4Addr::new(169, 254, 255, 0); - assert!(!is_link_local_valid(ipv4_addr)); - ipv4_addr = Ipv4Addr::new(169, 254, 255, 194); - assert!(!is_link_local_valid(ipv4_addr)); - ipv4_addr = Ipv4Addr::new(169, 254, 255, 255); - assert!(!is_link_local_valid(ipv4_addr)); - - // First valid IPv4 link-local address. - ipv4_addr = Ipv4Addr::new(169, 254, 1, 0); - assert!(is_link_local_valid(ipv4_addr)); - - // Last valid IPv4 link-local address. - ipv4_addr = Ipv4Addr::new(169, 254, 254, 255); - assert!(is_link_local_valid(ipv4_addr)); - - // In between valid IPv4 link-local address. - ipv4_addr = Ipv4Addr::new(169, 254, 170, 2); - assert!(is_link_local_valid(ipv4_addr)); - } -} diff --git a/src/utils/src/net/mac.rs b/src/utils/src/net/mac.rs deleted file mode 100644 index 3ffba73874d..00000000000 --- a/src/utils/src/net/mac.rs +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -// -// Portions Copyright 2017 The Chromium OS Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the THIRD-PARTY file. - -//! Contains support for parsing and constructing MAC addresses -//! More information about MAC addresses can be found [here] -//! -//! [here]: https://en.wikipedia.org/wiki/MAC_address - -use std::fmt; -use std::result::Result; -use std::str::FromStr; - -use serde::de::{Deserialize, Deserializer, Error}; -use serde::ser::{Serialize, Serializer}; - -/// The number of tuples (the ones separated by ":") contained in a MAC address. -pub const MAC_ADDR_LEN: u8 = 6; - -/// Represents a MAC address -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -#[repr(transparent)] -/// Representation of a MAC address. -pub struct MacAddr { - bytes: [u8; MAC_ADDR_LEN as usize], -} - -impl fmt::Display for MacAddr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let b = &self.bytes; - write!( - f, - "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}", - b[0], b[1], b[2], b[3], b[4], b[5] - ) - } -} - -impl From<[u8; 6]> for MacAddr { - fn from(bytes: [u8; 6]) -> Self { - Self { bytes } - } -} - -impl From for [u8; 6] { - fn from(mac: MacAddr) -> Self { - mac.bytes - } -} - -impl FromStr for MacAddr { - type Err = String; - /// Try to turn a `&str` into a `MacAddr` object. The method will return the `str` that failed - /// to be parsed. - /// # Arguments - /// - /// * `s` - reference that can be converted to &str. - /// # Example - /// - /// ``` - /// use std::str::FromStr; - /// - /// use self::utils::net::mac::MacAddr; - /// MacAddr::from_str("12:34:56:78:9a:BC").unwrap(); - /// ``` - fn from_str(s: &str) -> Result { - let v: Vec<&str> = s.split(':').collect(); - let mut bytes = [0u8; MAC_ADDR_LEN as usize]; - - if v.len() != MAC_ADDR_LEN as usize { - return Err(String::from(s)); - } - - for i in 0..MAC_ADDR_LEN as usize { - if v[i].len() != 2 { - return Err(String::from(s)); - } - bytes[i] = u8::from_str_radix(v[i], 16).map_err(|_| String::from(s))?; - } - - Ok(MacAddr { bytes }) - } -} - -impl MacAddr { - /// Create a `MacAddr` from a slice. - /// Does not check whether `src.len()` == `MAC_ADDR_LEN`. - /// # Arguments - /// - /// * `src` - slice from which to copy MAC address content. - /// # Example - /// - /// ``` - /// use self::utils::net::mac::MacAddr; - /// let mac = MacAddr::from_bytes_unchecked(&[0x01, 0x02, 0x03, 0x04, 0x05, 0x06]); - /// println!("{}", mac.to_string()); - /// ``` - #[inline] - pub fn from_bytes_unchecked(src: &[u8]) -> MacAddr { - // TODO: using something like std::mem::uninitialized could avoid the extra initialization, - // if this ever becomes a performance bottleneck. - let mut bytes = [0u8; MAC_ADDR_LEN as usize]; - bytes[..].copy_from_slice(src); - - MacAddr { bytes } - } - - /// Return the underlying content of this `MacAddr` in bytes. - /// # Example - /// - /// ``` - /// use self::utils::net::mac::MacAddr; - /// let mac = MacAddr::from([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]); - /// assert_eq!([0x01, 0x02, 0x03, 0x04, 0x05, 0x06], mac.get_bytes()); - /// ``` - #[inline] - pub fn get_bytes(&self) -> &[u8] { - &self.bytes - } -} - -impl Serialize for MacAddr { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(&self.to_string(), serializer) - } -} - -impl<'de> Deserialize<'de> for MacAddr { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let s = ::deserialize(deserializer)?; - MacAddr::from_str(&s).map_err(|_| D::Error::custom("The provided MAC address is invalid.")) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_mac_addr() { - // too long - MacAddr::from_str("aa:aa:aa:aa:aa:aa:aa").unwrap_err(); - - // invalid hex - MacAddr::from_str("aa:aa:aa:aa:aa:ax").unwrap_err(); - - // single digit mac address component should be invalid - MacAddr::from_str("aa:aa:aa:aa:aa:b").unwrap_err(); - - // components with more than two digits should also be invalid - MacAddr::from_str("aa:aa:aa:aa:aa:bbb").unwrap_err(); - - let mac = MacAddr::from_str("12:34:56:78:9a:BC").unwrap(); - - println!("parsed MAC address: {}", mac); - - let bytes = mac.get_bytes(); - assert_eq!(bytes, [0x12u8, 0x34, 0x56, 0x78, 0x9a, 0xbc]); - } - - #[test] - fn test_mac_addr_serialization_and_deserialization() { - let mac: MacAddr = - serde_json::from_str("\"12:34:56:78:9a:bc\"").expect("MacAddr deserialization failed."); - - let bytes = mac.get_bytes(); - assert_eq!(bytes, [0x12u8, 0x34, 0x56, 0x78, 0x9a, 0xbc]); - - let s = serde_json::to_string(&mac).expect("MacAddr serialization failed."); - assert_eq!(s, "\"12:34:56:78:9a:bc\""); - } -} diff --git a/src/utils/src/net/mod.rs b/src/utils/src/net/mod.rs deleted file mode 100644 index abf3b516f21..00000000000 --- a/src/utils/src/net/mod.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -// -// Portions Copyright 2017 The Chromium OS Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the THIRD-PARTY file. - -#![warn(missing_docs)] -//! # Network-related utilities -//! -//! Provides tools for representing and handling network related concepts like MAC addresses and -//! network interfaces. - -/// Provides IPv4 address utility methods. -pub mod ipv4addr; -pub mod mac; diff --git a/src/utils/src/signal.rs b/src/utils/src/signal.rs deleted file mode 100644 index c20981cd531..00000000000 --- a/src/utils/src/signal.rs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -use libc::c_int; -pub use vmm_sys_util::signal::*; - -extern "C" { - fn __libc_current_sigrtmin() -> c_int; - fn __libc_current_sigrtmax() -> c_int; -} - -pub fn sigrtmin() -> c_int { - // SAFETY: Function has no invariants that can be broken. - unsafe { __libc_current_sigrtmin() } -} - -pub fn sigrtmax() -> c_int { - // SAFETY: Function has no invariants that can be broken. - unsafe { __libc_current_sigrtmax() } -} diff --git a/src/utils/src/sm.rs b/src/utils/src/sm.rs deleted file mode 100644 index 6e64e8f1ef4..00000000000 --- a/src/utils/src/sm.rs +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -use std::fmt::Debug; - -/// Simple abstraction of a state machine. -/// -/// `StateMachine` is a wrapper over `T` that also encodes state information for `T`. -/// -/// Each state for `T` is represented by a `StateFn` which is a function that acts as -/// the state handler for that particular state of `T`. -/// -/// `StateFn` returns exactly one other `StateMachine` thus each state gets clearly -/// defined transitions to other states. -pub struct StateMachine { - function: Option>, -} -impl Debug for StateMachine { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("StateMachine") - .field("function", &self.function.map(|f| f as usize)) - .finish() - } -} - -/// Type representing a state handler of a `StateMachine` machine. Each state handler -/// is a function from `T` that handles a specific state of `T`. -type StateFn = fn(&mut T) -> StateMachine; - -impl StateMachine { - /// Creates a new state wrapper. - /// - /// # Arguments - /// - /// `function` - the state handler for this state. - pub fn new(function: Option>) -> StateMachine { - StateMachine { function } - } - - /// Creates a new state wrapper that has further possible transitions. - /// - /// # Arguments - /// - /// `function` - the state handler for this state. - pub fn next(function: StateFn) -> StateMachine { - StateMachine::new(Some(function)) - } - - /// Creates a new state wrapper that has no further transitions. The state machine - /// will finish after running this handler. - /// - /// # Arguments - /// - /// `function` - the state handler for this last state. - pub fn finish() -> StateMachine { - StateMachine::new(None) - } - - /// Runs a state machine for `T` starting from the provided state. - /// - /// # Arguments - /// - /// `machine` - a mutable reference to the object running through the various states. - /// `starting_state_fn` - a `fn(&mut T) -> StateMachine` that should be the handler for - /// the initial state. - pub fn run(machine: &mut T, starting_state_fn: StateFn) { - // Start off in the `starting_state` state. - let mut state_machine = StateMachine::new(Some(starting_state_fn)); - // While current state is not a final/end state, keep churning. - while let Some(state_fn) = state_machine.function { - // Run the current state handler, and get the next one. - state_machine = state_fn(machine); - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - // DummyMachine with states `s1`, `s2` and `s3`. - #[derive(Debug)] - struct DummyMachine { - private_data_s1: bool, - private_data_s2: bool, - private_data_s3: bool, - } - - impl DummyMachine { - fn new() -> Self { - DummyMachine { - private_data_s1: false, - private_data_s2: false, - private_data_s3: false, - } - } - - // DummyMachine functions here. - - // Simple state-machine: start->s1->s2->s3->done. - fn run(&mut self) { - // Verify the machine has not run yet. - assert!(!self.private_data_s1); - assert!(!self.private_data_s2); - assert!(!self.private_data_s3); - - // Run the state-machine. - StateMachine::run(self, Self::s1); - - // Verify the machine went through all states. - assert!(self.private_data_s1); - assert!(self.private_data_s2); - assert!(self.private_data_s3); - } - - fn s1(&mut self) -> StateMachine { - // Verify private data mutates along with the states. - assert!(!self.private_data_s1); - self.private_data_s1 = true; - StateMachine::next(Self::s2) - } - - fn s2(&mut self) -> StateMachine { - // Verify private data mutates along with the states. - assert!(!self.private_data_s2); - self.private_data_s2 = true; - StateMachine::next(Self::s3) - } - - fn s3(&mut self) -> StateMachine { - // Verify private data mutates along with the states. - assert!(!self.private_data_s3); - self.private_data_s3 = true; - // The machine ends here, adding `s1` as next state to validate this. - StateMachine::finish() - } - } - - #[test] - fn test_sm() { - let mut machine = DummyMachine::new(); - machine.run(); - } -} From 33e07b9d5969ce5060eaa915849f2ecb41bd6b20 Mon Sep 17 00:00:00 2001 From: Egor Lazarchuk Date: Sat, 24 Aug 2024 15:40:42 +0100 Subject: [PATCH 5/5] refactor: remove reexport of vmm-sys-util It is better not to reexport `vmm-sys-util` as it entangles the code. Additionally, the original reason of having one place to update this dependency does not hold any more as now we rely on dependabot for updates, so specifying dependency in multiple crates is not an issue. Signed-off-by: Egor Lazarchuk --- Cargo.lock | 5 +++++ src/cpu-template-helper/Cargo.toml | 2 +- src/firecracker/Cargo.toml | 1 + src/firecracker/examples/uffd/uffd_utils.rs | 6 +++--- src/firecracker/src/api_server/mod.rs | 4 ++-- src/firecracker/src/api_server_adapter.rs | 4 ++-- src/firecracker/src/main.rs | 4 ++-- src/firecracker/src/metrics.rs | 2 +- src/firecracker/src/seccomp.rs | 2 +- src/jailer/Cargo.toml | 1 + src/jailer/src/cgroup.rs | 6 +++--- src/jailer/src/chroot.rs | 2 +- src/jailer/src/env.rs | 8 ++++---- src/jailer/src/main.rs | 4 ++-- src/jailer/src/resource_limits.rs | 2 +- src/rebase-snap/Cargo.toml | 1 + src/rebase-snap/src/main.rs | 4 ++-- src/seccompiler/Cargo.toml | 3 +++ src/seccompiler/src/seccompiler_bin.rs | 2 +- src/snapshot-editor/Cargo.toml | 1 + src/snapshot-editor/src/edit_memory.rs | 4 ++-- src/utils/Cargo.toml | 2 +- src/utils/src/lib.rs | 10 ---------- src/vmm/src/arch/aarch64/vcpu.rs | 2 +- src/vmm/src/arch/x86_64/interrupts.rs | 2 +- src/vmm/src/arch/x86_64/msr.rs | 2 +- src/vmm/src/arch/x86_64/regs.rs | 8 ++++---- src/vmm/src/builder.rs | 6 +++--- src/vmm/src/cpu_config/x86_64/cpuid/mod.rs | 2 +- src/vmm/src/device_manager/legacy.rs | 2 +- src/vmm/src/device_manager/mmio.rs | 3 ++- src/vmm/src/device_manager/persist.rs | 3 ++- src/vmm/src/devices/acpi/vmgenid.rs | 2 +- src/vmm/src/devices/legacy/i8042.rs | 2 +- src/vmm/src/devices/legacy/mod.rs | 2 +- src/vmm/src/devices/legacy/serial.rs | 7 ++++--- src/vmm/src/devices/virtio/balloon/device.rs | 2 +- .../devices/virtio/balloon/event_handler.rs | 2 +- src/vmm/src/devices/virtio/block/device.rs | 2 +- .../devices/virtio/block/vhost_user/device.rs | 17 +++++++++-------- .../virtio/block/vhost_user/event_handler.rs | 2 +- .../src/devices/virtio/block/virtio/device.rs | 7 ++++--- .../virtio/block/virtio/event_handler.rs | 2 +- .../virtio/block/virtio/io/async_io.rs | 2 +- .../src/devices/virtio/block/virtio/io/mod.rs | 7 ++++--- .../devices/virtio/block/virtio/persist.rs | 5 +++-- .../devices/virtio/block/virtio/test_utils.rs | 3 ++- src/vmm/src/devices/virtio/device.rs | 3 ++- src/vmm/src/devices/virtio/mmio.rs | 3 ++- src/vmm/src/devices/virtio/net/device.rs | 2 +- .../src/devices/virtio/net/event_handler.rs | 2 +- src/vmm/src/devices/virtio/net/tap.rs | 13 +++++++------ src/vmm/src/devices/virtio/net/test_utils.rs | 6 +++--- src/vmm/src/devices/virtio/persist.rs | 3 ++- src/vmm/src/devices/virtio/rng/device.rs | 2 +- .../src/devices/virtio/rng/event_handler.rs | 2 +- src/vmm/src/devices/virtio/test_utils.rs | 2 +- src/vmm/src/devices/virtio/vhost_user.rs | 5 +++-- .../src/devices/virtio/vhost_user_metrics.rs | 6 ++++-- .../devices/virtio/vsock/csm/connection.rs | 4 ++-- src/vmm/src/devices/virtio/vsock/device.rs | 2 +- .../src/devices/virtio/vsock/event_handler.rs | 2 +- src/vmm/src/devices/virtio/vsock/mod.rs | 2 +- .../src/devices/virtio/vsock/test_utils.rs | 5 +++-- .../src/devices/virtio/vsock/unix/muxer.rs | 5 +++-- src/vmm/src/dumbo/tcp/connection.rs | 2 +- src/vmm/src/io_uring/mod.rs | 9 ++++----- src/vmm/src/io_uring/probe.rs | 5 +++-- src/vmm/src/io_uring/queue/submission.rs | 2 +- src/vmm/src/lib.rs | 12 ++++++------ src/vmm/src/logger/logging.rs | 2 +- src/vmm/src/logger/metrics.rs | 19 ++++++++----------- src/vmm/src/logger/mod.rs | 3 ++- src/vmm/src/persist.rs | 7 ++++--- src/vmm/src/resources.rs | 2 +- src/vmm/src/rpc_interface.rs | 11 ++++++----- src/vmm/src/signal_handler.rs | 2 +- src/vmm/src/utils/mod.rs | 14 ++------------ src/vmm/src/vmm_config/boot_source.rs | 3 ++- src/vmm/src/vmm_config/drive.rs | 3 ++- src/vmm/src/vmm_config/metrics.rs | 3 ++- src/vmm/src/vmm_config/vsock.rs | 3 ++- src/vmm/src/vstate/memory.rs | 6 ++++-- src/vmm/src/vstate/vcpu/mod.rs | 12 ++++++------ src/vmm/src/vstate/vcpu/x86_64.rs | 10 +++++----- src/vmm/tests/devices.rs | 2 +- src/vmm/tests/integration_tests.rs | 2 +- src/vmm/tests/io_uring.rs | 6 +++--- 88 files changed, 199 insertions(+), 184 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ea7b5c40621..13b02fe4cfb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -618,6 +618,7 @@ dependencies = [ "userfaultfd", "utils", "vmm", + "vmm-sys-util", ] [[package]] @@ -785,6 +786,7 @@ dependencies = [ "regex", "thiserror", "utils", + "vmm-sys-util", ] [[package]] @@ -1117,6 +1119,7 @@ dependencies = [ "log-instrument", "thiserror", "utils", + "vmm-sys-util", ] [[package]] @@ -1194,6 +1197,7 @@ dependencies = [ "serde_json", "thiserror", "utils", + "vmm-sys-util", ] [[package]] @@ -1280,6 +1284,7 @@ dependencies = [ "thiserror", "utils", "vmm", + "vmm-sys-util", ] [[package]] diff --git a/src/cpu-template-helper/Cargo.toml b/src/cpu-template-helper/Cargo.toml index 72d1c7fc213..1136e7ad6bc 100644 --- a/src/cpu-template-helper/Cargo.toml +++ b/src/cpu-template-helper/Cargo.toml @@ -19,7 +19,7 @@ serde_json = "1.0.128" thiserror = "1.0.63" vmm = { path = "../vmm" } -vmm-sys-util = { version = "0.12.1", features = ["with-serde"] } +vmm-sys-util = "0.12.1" [features] tracing = ["log-instrument", "vmm/tracing"] diff --git a/src/firecracker/Cargo.toml b/src/firecracker/Cargo.toml index 16d670e81e7..828e4e7eefe 100644 --- a/src/firecracker/Cargo.toml +++ b/src/firecracker/Cargo.toml @@ -30,6 +30,7 @@ thiserror = "1.0.63" timerfd = "1.6.0" utils = { path = "../utils" } vmm = { path = "../vmm" } +vmm-sys-util = { version = "0.12.1", features = ["with-serde"] } [dev-dependencies] cargo_toml = "0.20.4" diff --git a/src/firecracker/examples/uffd/uffd_utils.rs b/src/firecracker/examples/uffd/uffd_utils.rs index a0d63e253a4..52d33765bd8 100644 --- a/src/firecracker/examples/uffd/uffd_utils.rs +++ b/src/firecracker/examples/uffd/uffd_utils.rs @@ -12,7 +12,7 @@ use std::ptr; use serde::{Deserialize, Serialize}; use userfaultfd::{Error, Event, Uffd}; -use utils::sock_ctrl_msg::ScmSocket; +use vmm_sys_util::sock_ctrl_msg::ScmSocket; // This is the same with the one used in src/vmm. /// This describes the mapping between Firecracker base virtual address and offset in the @@ -299,8 +299,8 @@ mod tests { use std::mem::MaybeUninit; use std::os::unix::net::UnixListener; - use vmm::utils::tempdir::TempDir; - use vmm::utils::tempfile::TempFile; + use vmm_sys_util::tempdir::TempDir; + use vmm_sys_util::tempfile::TempFile; use super::*; diff --git a/src/firecracker/src/api_server/mod.rs b/src/firecracker/src/api_server/mod.rs index 35b01c4cbe2..6ac2955af8f 100644 --- a/src/firecracker/src/api_server/mod.rs +++ b/src/firecracker/src/api_server/mod.rs @@ -16,13 +16,13 @@ pub use micro_http::{Body, HttpServer, Request, Response, ServerError, StatusCod use parsed_request::{ParsedRequest, RequestAction}; use seccompiler::BpfProgramRef; use serde_json::json; -use utils::eventfd::EventFd; use utils::time::{get_time_us, ClockType}; use vmm::logger::{ debug, error, info, update_metric_with_elapsed_time, warn, ProcessTimeReporter, METRICS, }; use vmm::rpc_interface::{ApiRequest, ApiResponse, VmmAction}; use vmm::vmm_config::snapshot::SnapshotType; +use vmm_sys_util::eventfd::EventFd; /// Structure associated with the API server implementation. #[derive(Debug)] @@ -204,7 +204,6 @@ mod tests { use std::thread; use micro_http::HttpConnection; - use utils::tempfile::TempFile; use utils::time::ClockType; use vmm::builder::StartMicrovmError; use vmm::logger::StoreMetric; @@ -212,6 +211,7 @@ mod tests { use vmm::seccomp_filters::get_empty_filters; use vmm::vmm_config::instance_info::InstanceInfo; use vmm::vmm_config::snapshot::CreateSnapshotParams; + use vmm_sys_util::tempfile::TempFile; use super::request::cpu_configuration::parse_put_cpu_config; use super::*; diff --git a/src/firecracker/src/api_server_adapter.rs b/src/firecracker/src/api_server_adapter.rs index e50ebd09c17..ffc4732025d 100644 --- a/src/firecracker/src/api_server_adapter.rs +++ b/src/firecracker/src/api_server_adapter.rs @@ -9,8 +9,6 @@ use std::thread; use event_manager::{EventOps, Events, MutEventSubscriber, SubscriberOps}; use seccompiler::BpfThreadMap; -use utils::epoll::EventSet; -use utils::eventfd::EventFd; use vmm::logger::{error, warn, ProcessTimeReporter}; use vmm::resources::VmResources; use vmm::rpc_interface::{ @@ -19,6 +17,8 @@ use vmm::rpc_interface::{ }; use vmm::vmm_config::instance_info::InstanceInfo; use vmm::{EventManager, FcExitCode, Vmm}; +use vmm_sys_util::epoll::EventSet; +use vmm_sys_util::eventfd::EventFd; use super::api_server::{ApiServer, HttpServer, ServerError}; diff --git a/src/firecracker/src/main.rs b/src/firecracker/src/main.rs index e2b8a3fb9e2..8fb5392afcf 100644 --- a/src/firecracker/src/main.rs +++ b/src/firecracker/src/main.rs @@ -19,7 +19,6 @@ use event_manager::SubscriberOps; use seccomp::FilterError; use seccompiler::BpfThreadMap; use utils::arg_parser::{ArgParser, Argument}; -use utils::terminal::Terminal; use utils::validators::validate_instance_id; use vmm::builder::StartMicrovmError; use vmm::logger::{ @@ -32,6 +31,7 @@ use vmm::snapshot::{Snapshot, SnapshotError}; use vmm::vmm_config::instance_info::{InstanceInfo, VmState}; use vmm::vmm_config::metrics::{init_metrics, MetricsConfig, MetricsConfigError}; use vmm::{EventManager, FcExitCode, HTTP_MAX_PAYLOAD_SIZE}; +use vmm_sys_util::terminal::Terminal; use crate::seccomp::SeccompConfig; @@ -47,7 +47,7 @@ enum MainError { /// Failed to set the logger: {0} SetLogger(vmm::logger::LoggerInitError), /// Failed to register signal handlers: {0} - RegisterSignalHandlers(#[source] utils::errno::Error), + RegisterSignalHandlers(#[source] vmm_sys_util::errno::Error), /// Arguments parsing error: {0} \n\nFor more information try --help. ParseArguments(#[from] utils::arg_parser::UtilsArgParserError), /// When printing Snapshot Data format: {0} diff --git a/src/firecracker/src/metrics.rs b/src/firecracker/src/metrics.rs index a5fdfdd351b..9eaffd47811 100644 --- a/src/firecracker/src/metrics.rs +++ b/src/firecracker/src/metrics.rs @@ -6,8 +6,8 @@ use std::time::Duration; use event_manager::{EventOps, Events, MutEventSubscriber}; use timerfd::{ClockId, SetTimeFlags, TimerFd, TimerState}; -use utils::epoll::EventSet; use vmm::logger::{error, warn, IncMetric, METRICS}; +use vmm_sys_util::epoll::EventSet; /// Metrics reporting period. pub(crate) const WRITE_METRICS_PERIOD_MS: u64 = 60000; diff --git a/src/firecracker/src/seccomp.rs b/src/firecracker/src/seccomp.rs index 5b7e5cc4695..5794d6498a8 100644 --- a/src/firecracker/src/seccomp.rs +++ b/src/firecracker/src/seccomp.rs @@ -119,7 +119,7 @@ mod tests { use std::sync::Arc; use seccompiler::BpfThreadMap; - use utils::tempfile::TempFile; + use vmm_sys_util::tempfile::TempFile; use super::*; diff --git a/src/jailer/Cargo.toml b/src/jailer/Cargo.toml index 95b02784ec7..aeda2959c13 100644 --- a/src/jailer/Cargo.toml +++ b/src/jailer/Cargo.toml @@ -17,6 +17,7 @@ log-instrument = { path = "../log-instrument", optional = true } nix = { version = "0.29.0", default-features = false, features = ["dir"] } regex = { version = "1.10.6", default-features = false, features = ["std"] } thiserror = "1.0.63" +vmm-sys-util = "0.12.1" utils = { path = "../utils" } diff --git a/src/jailer/src/cgroup.rs b/src/jailer/src/cgroup.rs index 57c5b60dda9..e49b1acb317 100644 --- a/src/jailer/src/cgroup.rs +++ b/src/jailer/src/cgroup.rs @@ -504,7 +504,7 @@ pub mod test_util { use std::io::Write; use std::path::{Path, PathBuf}; - use utils::rand; + use vmm_sys_util::rand; #[derive(Debug)] pub struct MockCgroupFs { @@ -617,8 +617,8 @@ mod tests { use std::io::{BufReader, Write}; use std::path::PathBuf; - use utils::tempdir::TempDir; - use utils::tempfile::TempFile; + use vmm_sys_util::tempdir::TempDir; + use vmm_sys_util::tempfile::TempFile; use super::*; use crate::cgroup::test_util::MockCgroupFs; diff --git a/src/jailer/src/chroot.rs b/src/jailer/src/chroot.rs index 85b072a5cf1..44386729196 100644 --- a/src/jailer/src/chroot.rs +++ b/src/jailer/src/chroot.rs @@ -6,7 +6,7 @@ use std::ffi::CStr; use std::path::Path; use std::ptr::null; -use utils::syscall::SyscallReturnCode; +use vmm_sys_util::syscall::SyscallReturnCode; use super::{to_cstring, JailerError}; diff --git a/src/jailer/src/env.rs b/src/jailer/src/env.rs index 1f0cdb7b342..a0c37eac540 100644 --- a/src/jailer/src/env.rs +++ b/src/jailer/src/env.rs @@ -12,9 +12,9 @@ use std::process::{exit, id, Command, Stdio}; use std::{fmt, io}; use utils::arg_parser::UtilsArgParserError::MissingValue; -use utils::syscall::SyscallReturnCode; use utils::time::{get_time_us, ClockType}; use utils::{arg_parser, validators}; +use vmm_sys_util::syscall::SyscallReturnCode; use crate::cgroup::{CgroupConfiguration, CgroupConfigurationBuilder}; use crate::chroot::chroot; @@ -736,9 +736,9 @@ mod tests { use std::fs::create_dir_all; use std::os::linux::fs::MetadataExt; - use utils::rand; - use utils::tempdir::TempDir; - use utils::tempfile::TempFile; + use vmm_sys_util::rand; + use vmm_sys_util::tempdir::TempDir; + use vmm_sys_util::tempfile::TempFile; use super::*; use crate::build_arg_parser; diff --git a/src/jailer/src/main.rs b/src/jailer/src/main.rs index a4132467248..4e00c14762a 100644 --- a/src/jailer/src/main.rs +++ b/src/jailer/src/main.rs @@ -8,9 +8,9 @@ use std::{env as p_env, fs, io}; use env::PROC_MOUNTS; use utils::arg_parser::{ArgParser, Argument, UtilsArgParserError as ParsingError}; -use utils::syscall::SyscallReturnCode; use utils::time::{get_time_us, ClockType}; use utils::validators; +use vmm_sys_util::syscall::SyscallReturnCode; use crate::env::Env; @@ -357,7 +357,7 @@ mod tests { use std::fs::File; use std::os::unix::io::IntoRawFd; - use utils::rand; + use vmm_sys_util::rand; use super::*; diff --git a/src/jailer/src/resource_limits.rs b/src/jailer/src/resource_limits.rs index 4c3f488b9fb..0ca4c3460db 100644 --- a/src/jailer/src/resource_limits.rs +++ b/src/jailer/src/resource_limits.rs @@ -4,7 +4,7 @@ use std::fmt; use std::fmt::{Display, Formatter}; -use utils::syscall::SyscallReturnCode; +use vmm_sys_util::syscall::SyscallReturnCode; use super::JailerError; diff --git a/src/rebase-snap/Cargo.toml b/src/rebase-snap/Cargo.toml index 80dac38f862..4058ccb7a18 100644 --- a/src/rebase-snap/Cargo.toml +++ b/src/rebase-snap/Cargo.toml @@ -14,6 +14,7 @@ displaydoc = "0.2.5" libc = "0.2.158" log-instrument = { path = "../log-instrument", optional = true } thiserror = "1.0.63" +vmm-sys-util = "0.12.1" utils = { path = "../utils" } diff --git a/src/rebase-snap/src/main.rs b/src/rebase-snap/src/main.rs index 1909d9ea9c6..20fd23c416d 100644 --- a/src/rebase-snap/src/main.rs +++ b/src/rebase-snap/src/main.rs @@ -7,7 +7,7 @@ use std::io::{Seek, SeekFrom}; use std::os::unix::io::AsRawFd; use utils::arg_parser::{ArgParser, Argument, Arguments, UtilsArgParserError as ArgError}; -use utils::seek_hole::SeekHole; +use vmm_sys_util::seek_hole::SeekHole; const REBASE_SNAP_VERSION: &str = env!("CARGO_PKG_VERSION"); const BASE_FILE: &str = "base-file"; @@ -160,7 +160,7 @@ mod tests { use std::io::{Seek, SeekFrom, Write}; use std::os::unix::fs::FileExt; - use utils::{rand, tempfile}; + use vmm_sys_util::{rand, tempfile}; use super::*; diff --git a/src/seccompiler/Cargo.toml b/src/seccompiler/Cargo.toml index 2d997696a04..19d86ddefb4 100644 --- a/src/seccompiler/Cargo.toml +++ b/src/seccompiler/Cargo.toml @@ -26,6 +26,9 @@ thiserror = "1.0.63" utils = { path = "../utils" } +[dev-dependencies] +vmm-sys-util = "0.12.1" + [features] tracing = ["log-instrument", "utils/tracing"] diff --git a/src/seccompiler/src/seccompiler_bin.rs b/src/seccompiler/src/seccompiler_bin.rs index c6c97690bf6..890a2a3ecdb 100644 --- a/src/seccompiler/src/seccompiler_bin.rs +++ b/src/seccompiler/src/seccompiler_bin.rs @@ -214,7 +214,7 @@ mod tests { use std::path::PathBuf; use bincode::Error as BincodeError; - use utils::tempfile::TempFile; + use vmm_sys_util::tempfile::TempFile; use super::compiler::CompilationError as FilterFormatError; use super::{ diff --git a/src/snapshot-editor/Cargo.toml b/src/snapshot-editor/Cargo.toml index a042b7a829f..1449e8b9f93 100644 --- a/src/snapshot-editor/Cargo.toml +++ b/src/snapshot-editor/Cargo.toml @@ -19,6 +19,7 @@ log-instrument = { path = "../log-instrument", optional = true } semver = "1.0.23" thiserror = "1.0.63" vmm = { path = "../vmm" } +vmm-sys-util = "0.12.1" [target.'cfg(target_arch = "aarch64")'.dependencies] clap-num = "1.0.2" diff --git a/src/snapshot-editor/src/edit_memory.rs b/src/snapshot-editor/src/edit_memory.rs index 667f7af0960..015354adfc0 100644 --- a/src/snapshot-editor/src/edit_memory.rs +++ b/src/snapshot-editor/src/edit_memory.rs @@ -7,8 +7,8 @@ use std::os::fd::AsRawFd; use std::path::PathBuf; use clap::Subcommand; -use fc_utils::seek_hole::SeekHole; use vmm::utils::u64_to_usize; +use vmm_sys_util::seek_hole::SeekHole; #[derive(Debug, thiserror::Error, displaydoc::Display)] pub enum EditMemoryError { @@ -108,7 +108,7 @@ mod tests { use std::io::{Seek, SeekFrom, Write}; use std::os::unix::fs::FileExt; - use fc_utils::{rand, tempfile}; + use vmm_sys_util::{rand, tempfile}; use super::*; diff --git a/src/utils/Cargo.toml b/src/utils/Cargo.toml index ce6827d0c82..72bda2503de 100644 --- a/src/utils/Cargo.toml +++ b/src/utils/Cargo.toml @@ -16,7 +16,7 @@ log-instrument = { path = "../log-instrument", optional = true } serde = { version = "1.0.210", features = ["derive"] } thiserror = "1.0.63" vm-memory = { version = "0.14.1", features = ["backend-mmap", "backend-bitmap"] } -vmm-sys-util = { version = "0.12.1", features = ["with-serde"] } +vmm-sys-util = "0.12.1" [dev-dependencies] serde_json = "1.0.128" diff --git a/src/utils/src/lib.rs b/src/utils/src/lib.rs index c6e65bd2fe1..5c0b8271b5c 100644 --- a/src/utils/src/lib.rs +++ b/src/utils/src/lib.rs @@ -1,16 +1,6 @@ // Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -// We use `utils` as a wrapper over `vmm_sys_util` to control the latter -// dependency easier (i.e. update only in one place `vmm_sys_util` version). -// More specifically, we are re-exporting modules from `vmm_sys_util` as part -// of the `utils` crate. -pub use vmm_sys_util::ioctl::ioctl_expr; -pub use vmm_sys_util::{ - epoll, errno, eventfd, fam, generate_fam_struct_impl, ioctl, ioctl_ioc_nr, ioctl_iow_nr, rand, - seek_hole, sock_ctrl_msg, syscall, tempdir, tempfile, terminal, -}; - pub mod arg_parser; pub mod time; pub mod validators; diff --git a/src/vmm/src/arch/aarch64/vcpu.rs b/src/vmm/src/arch/aarch64/vcpu.rs index 66700917065..5c08f95351a 100644 --- a/src/vmm/src/arch/aarch64/vcpu.rs +++ b/src/vmm/src/arch/aarch64/vcpu.rs @@ -29,7 +29,7 @@ pub enum VcpuError { /// Failed to set multiprocessor state: {0} SetMp(kvm_ioctls::Error), /// Failed FamStructWrapper operation: {0} - Fam(crate::utils::fam::Error), + Fam(vmm_sys_util::fam::Error), /// {0} GetMidrEl1(String), } diff --git a/src/vmm/src/arch/x86_64/interrupts.rs b/src/vmm/src/arch/x86_64/interrupts.rs index 09a2dc6ec84..8b7bf8bc793 100644 --- a/src/vmm/src/arch/x86_64/interrupts.rs +++ b/src/vmm/src/arch/x86_64/interrupts.rs @@ -105,7 +105,7 @@ mod tests { #[test] fn test_apic_delivery_mode() { let mut v: Vec = (0..20) - .map(|_| crate::utils::rand::xor_pseudo_rng_u32()) + .map(|_| vmm_sys_util::rand::xor_pseudo_rng_u32()) .collect(); v.iter_mut() diff --git a/src/vmm/src/arch/x86_64/msr.rs b/src/vmm/src/arch/x86_64/msr.rs index a05fac79961..325d6ed6b29 100644 --- a/src/vmm/src/arch/x86_64/msr.rs +++ b/src/vmm/src/arch/x86_64/msr.rs @@ -16,7 +16,7 @@ use crate::cpu_config::x86_64::cpuid::common::GetCpuidError; /// MSR related errors. pub enum MsrError { /// Failed to create `vmm_sys_util::fam::FamStructWrapper` for MSRs - Fam(#[from] crate::utils::fam::Error), + Fam(#[from] vmm_sys_util::fam::Error), /// Failed to get MSR index list: {0} GetMsrIndexList(kvm_ioctls::Error), /// Invalid CPU vendor: {0} diff --git a/src/vmm/src/arch/x86_64/regs.rs b/src/vmm/src/arch/x86_64/regs.rs index 30e4bf2cc82..aec47677c4c 100644 --- a/src/vmm/src/arch/x86_64/regs.rs +++ b/src/vmm/src/arch/x86_64/regs.rs @@ -44,7 +44,7 @@ pub enum RegsError { /// Error type for [`setup_fpu`]. #[derive(Debug, derive_more::From, PartialEq, Eq, thiserror::Error)] #[error("Failed to setup FPU: {0}")] -pub struct SetupFpuError(crate::utils::errno::Error); +pub struct SetupFpuError(vmm_sys_util::errno::Error); /// Configure Floating-Point Unit (FPU) registers for a given CPU. /// @@ -68,7 +68,7 @@ pub fn setup_fpu(vcpu: &VcpuFd) -> Result<(), SetupFpuError> { /// Error type of [`setup_regs`]. #[derive(Debug, derive_more::From, PartialEq, Eq, thiserror::Error)] #[error("Failed to setup registers: {0}")] -pub struct SetupRegistersError(crate::utils::errno::Error); +pub struct SetupRegistersError(vmm_sys_util::errno::Error); /// Configure base registers for a given CPU. /// @@ -103,13 +103,13 @@ pub fn setup_regs(vcpu: &VcpuFd, boot_ip: u64) -> Result<(), SetupRegistersError #[derive(Debug, thiserror::Error, displaydoc::Display, PartialEq, Eq)] pub enum SetupSpecialRegistersError { /// Failed to get special registers: {0} - GetSpecialRegisters(crate::utils::errno::Error), + GetSpecialRegisters(vmm_sys_util::errno::Error), /// Failed to configure segments and special registers: {0} ConfigureSegmentsAndSpecialRegisters(RegsError), /// Failed to setup page tables: {0} SetupPageTables(RegsError), /// Failed to set special registers: {0} - SetSpecialRegisters(crate::utils::errno::Error), + SetSpecialRegisters(vmm_sys_util::errno::Error), } /// Configures the special registers and system page tables for a given CPU. diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs index a14c55f35ab..9ef8b4f620c 100644 --- a/src/vmm/src/builder.rs +++ b/src/vmm/src/builder.rs @@ -24,6 +24,7 @@ use vm_memory::ReadVolatile; #[cfg(target_arch = "aarch64")] use vm_superio::Rtc; use vm_superio::Serial; +use vmm_sys_util::eventfd::EventFd; #[cfg(target_arch = "x86_64")] use crate::acpi; @@ -59,7 +60,6 @@ use crate::logger::{debug, error}; use crate::persist::{MicrovmState, MicrovmStateError}; use crate::resources::VmResources; use crate::snapshot::Persist; -use crate::utils::eventfd::EventFd; use crate::utils::u64_to_usize; use crate::vmm_config::boot_source::BootConfig; use crate::vmm_config::instance_info::InstanceInfo; @@ -412,7 +412,7 @@ pub enum BuildMicrovmFromSnapshotError { /// Failed to create microVM and vCPUs: {0} CreateMicrovmAndVcpus(#[from] StartMicrovmError), /// Could not access KVM: {0} - KvmAccess(#[from] crate::utils::errno::Error), + KvmAccess(#[from] vmm_sys_util::errno::Error), /// Error configuring the TSC, frequency not present in the given snapshot. TscFrequencyNotPresent, #[cfg(target_arch = "x86_64")] @@ -1022,6 +1022,7 @@ pub mod tests { use std::io::Write; use linux_loader::cmdline::Cmdline; + use vmm_sys_util::tempfile::TempFile; use super::*; use crate::arch::DeviceType; @@ -1033,7 +1034,6 @@ pub mod tests { use crate::mmds::data_store::{Mmds, MmdsVersion}; use crate::mmds::ns::MmdsNetworkStack; use crate::test_utils::{arch_mem, single_region_mem, single_region_mem_at}; - use crate::utils::tempfile::TempFile; use crate::vmm_config::balloon::{BalloonBuilder, BalloonDeviceConfig, BALLOON_DEV_ID}; use crate::vmm_config::boot_source::DEFAULT_KERNEL_CMDLINE; use crate::vmm_config::drive::{BlockBuilder, BlockDeviceConfig}; diff --git a/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs b/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs index f557ed2e621..2350d30479d 100644 --- a/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs +++ b/src/vmm/src/cpu_config/x86_64/cpuid/mod.rs @@ -410,7 +410,7 @@ impl TryFrom for Cpuid { } impl TryFrom for kvm_bindings::CpuId { - type Error = crate::utils::fam::Error; + type Error = vmm_sys_util::fam::Error; fn try_from(cpuid: Cpuid) -> Result { let entries = cpuid diff --git a/src/vmm/src/device_manager/legacy.rs b/src/vmm/src/device_manager/legacy.rs index 035756f261e..dc46a5172d3 100644 --- a/src/vmm/src/device_manager/legacy.rs +++ b/src/vmm/src/device_manager/legacy.rs @@ -13,11 +13,11 @@ use acpi_tables::{aml, Aml}; use kvm_ioctls::VmFd; use libc::EFD_NONBLOCK; use vm_superio::Serial; +use vmm_sys_util::eventfd::EventFd; use crate::devices::bus::BusDevice; use crate::devices::legacy::serial::SerialOut; use crate::devices::legacy::{EventFdTrigger, SerialDevice, SerialEventsWrapper}; -use crate::utils::eventfd::EventFd; /// Errors corresponding to the `PortIODeviceManager`. #[derive(Debug, derive_more::From, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/device_manager/mmio.rs b/src/vmm/src/device_manager/mmio.rs index 91878babbb9..cba9047d564 100644 --- a/src/vmm/src/device_manager/mmio.rs +++ b/src/vmm/src/device_manager/mmio.rs @@ -529,12 +529,13 @@ mod tests { use std::sync::Arc; + use vmm_sys_util::eventfd::EventFd; + use super::*; use crate::devices::virtio::device::{IrqTrigger, VirtioDevice}; use crate::devices::virtio::queue::Queue; use crate::devices::virtio::ActivateError; use crate::test_utils::multi_region_mem; - use crate::utils::eventfd::EventFd; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; use crate::{builder, Vm}; diff --git a/src/vmm/src/device_manager/persist.rs b/src/vmm/src/device_manager/persist.rs index 8b16a2881d6..3a2a49c4811 100644 --- a/src/vmm/src/device_manager/persist.rs +++ b/src/vmm/src/device_manager/persist.rs @@ -652,12 +652,13 @@ impl<'a> Persist<'a> for MMIODeviceManager { #[cfg(test)] mod tests { + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::builder::tests::*; use crate::devices::virtio::block::CacheType; use crate::resources::VmmConfig; use crate::snapshot::Snapshot; - use crate::utils::tempfile::TempFile; use crate::vmm_config::balloon::BalloonDeviceConfig; use crate::vmm_config::entropy::EntropyDeviceConfig; use crate::vmm_config::net::NetworkInterfaceConfig; diff --git a/src/vmm/src/devices/acpi/vmgenid.rs b/src/vmm/src/devices/acpi/vmgenid.rs index b06d088e25e..24220577ccf 100644 --- a/src/vmm/src/devices/acpi/vmgenid.rs +++ b/src/vmm/src/devices/acpi/vmgenid.rs @@ -8,11 +8,11 @@ use log::{debug, error}; use serde::{Deserialize, Serialize}; use vm_memory::{GuestAddress, GuestMemoryError}; use vm_superio::Trigger; +use vmm_sys_util::eventfd::EventFd; use super::super::legacy::EventFdTrigger; use crate::device_manager::resources::ResourceAllocator; use crate::snapshot::Persist; -use crate::utils::eventfd::EventFd; use crate::vstate::memory::{Bytes, GuestMemoryMmap}; /// Bytes of memory we allocate for VMGenID device diff --git a/src/vmm/src/devices/legacy/i8042.rs b/src/vmm/src/devices/legacy/i8042.rs index 8ab97ce3e9d..8f965cab912 100644 --- a/src/vmm/src/devices/legacy/i8042.rs +++ b/src/vmm/src/devices/legacy/i8042.rs @@ -10,9 +10,9 @@ use std::num::Wrapping; use log::warn; use serde::Serialize; +use vmm_sys_util::eventfd::EventFd; use crate::logger::{error, IncMetric, SharedIncMetric}; -use crate::utils::eventfd::EventFd; /// Errors thrown by the i8042 device. #[derive(Debug, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/devices/legacy/mod.rs b/src/vmm/src/devices/legacy/mod.rs index f84c39207bf..25f332b9617 100644 --- a/src/vmm/src/devices/legacy/mod.rs +++ b/src/vmm/src/devices/legacy/mod.rs @@ -17,6 +17,7 @@ use std::ops::Deref; use serde::ser::SerializeMap; use serde::Serializer; use vm_superio::Trigger; +use vmm_sys_util::eventfd::EventFd; pub use self::i8042::{I8042Device, I8042Error as I8042DeviceError}; #[cfg(target_arch = "aarch64")] @@ -24,7 +25,6 @@ pub use self::rtc_pl031::RTCDevice; pub use self::serial::{ SerialDevice, SerialEventsWrapper, SerialWrapper, IER_RDA_BIT, IER_RDA_OFFSET, }; -use crate::utils::eventfd::EventFd; /// Wrapper for implementing the trigger functionality for `EventFd`. /// diff --git a/src/vmm/src/devices/legacy/serial.rs b/src/vmm/src/devices/legacy/serial.rs index 609afe79077..cd74159dbdc 100644 --- a/src/vmm/src/devices/legacy/serial.rs +++ b/src/vmm/src/devices/legacy/serial.rs @@ -16,10 +16,10 @@ use log::{error, warn}; use serde::Serialize; use vm_superio::serial::{Error as SerialError, SerialEvents}; use vm_superio::{Serial, Trigger}; +use vmm_sys_util::epoll::EventSet; use crate::devices::legacy::EventFdTrigger; use crate::logger::{IncMetric, SharedIncMetric}; -use crate::utils::epoll::EventSet; /// Received Data Available interrupt - for letting the driver know that /// there is some pending data to be processed. @@ -365,9 +365,10 @@ impl mod tests { #![allow(clippy::undocumented_unsafe_blocks)] + use vmm_sys_util::eventfd::EventFd; + use super::*; use crate::logger::IncMetric; - use crate::utils::eventfd::EventFd; #[test] fn test_serial_bus_read() { @@ -418,7 +419,7 @@ mod tests { assert!(is_fifo(fds[1])); // Files arent fifos - let tmp_file = crate::utils::tempfile::TempFile::new().unwrap(); + let tmp_file = vmm_sys_util::tempfile::TempFile::new().unwrap(); assert!(!is_fifo(tmp_file.as_file().as_raw_fd())); } diff --git a/src/vmm/src/devices/virtio/balloon/device.rs b/src/vmm/src/devices/virtio/balloon/device.rs index f4f91e36907..697928ae9c6 100644 --- a/src/vmm/src/devices/virtio/balloon/device.rs +++ b/src/vmm/src/devices/virtio/balloon/device.rs @@ -7,6 +7,7 @@ use std::time::Duration; use log::error; use serde::Serialize; use timerfd::{ClockId, SetTimeFlags, TimerFd, TimerState}; +use vmm_sys_util::eventfd::EventFd; use super::super::device::{DeviceState, VirtioDevice}; use super::super::queue::Queue; @@ -26,7 +27,6 @@ use crate::devices::virtio::balloon::BalloonError; use crate::devices::virtio::device::{IrqTrigger, IrqType}; use crate::devices::virtio::gen::virtio_blk::VIRTIO_F_VERSION_1; use crate::logger::IncMetric; -use crate::utils::eventfd::EventFd; use crate::utils::u64_to_usize; use crate::vstate::memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemoryMmap}; diff --git a/src/vmm/src/devices/virtio/balloon/event_handler.rs b/src/vmm/src/devices/virtio/balloon/event_handler.rs index d554a893e7a..3019d6877de 100644 --- a/src/vmm/src/devices/virtio/balloon/event_handler.rs +++ b/src/vmm/src/devices/virtio/balloon/event_handler.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; +use vmm_sys_util::epoll::EventSet; use super::{report_balloon_event_fail, DEFLATE_INDEX, INFLATE_INDEX, STATS_INDEX}; use crate::devices::virtio::balloon::device::Balloon; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; -use crate::utils::epoll::EventSet; impl Balloon { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/block/device.rs b/src/vmm/src/devices/virtio/block/device.rs index afb3c7febd0..7399fe39a0b 100644 --- a/src/vmm/src/devices/virtio/block/device.rs +++ b/src/vmm/src/devices/virtio/block/device.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; +use vmm_sys_util::eventfd::EventFd; use super::persist::{BlockConstructorArgs, BlockState}; use super::vhost_user::device::{VhostUserBlock, VhostUserBlockConfig}; @@ -12,7 +13,6 @@ use crate::devices::virtio::queue::Queue; use crate::devices::virtio::{ActivateError, TYPE_BLOCK}; use crate::rate_limiter::BucketUpdate; use crate::snapshot::Persist; -use crate::utils::eventfd::EventFd; use crate::vmm_config::drive::BlockDeviceConfig; use crate::vstate::memory::GuestMemoryMmap; diff --git a/src/vmm/src/devices/virtio/block/vhost_user/device.rs b/src/vmm/src/devices/virtio/block/vhost_user/device.rs index 9b6dda0bd57..62218157c8b 100644 --- a/src/vmm/src/devices/virtio/block/vhost_user/device.rs +++ b/src/vmm/src/devices/virtio/block/vhost_user/device.rs @@ -7,8 +7,10 @@ use std::sync::Arc; use log::error; +use utils::time::{get_time_us, ClockType}; use vhost::vhost_user::message::*; use vhost::vhost_user::Frontend; +use vmm_sys_util::eventfd::EventFd; use super::{VhostUserBlockError, NUM_QUEUES, QUEUE_SIZE}; use crate::devices::virtio::block::CacheType; @@ -24,7 +26,6 @@ use crate::devices::virtio::vhost_user_metrics::{ }; use crate::devices::virtio::{ActivateError, TYPE_BLOCK}; use crate::logger::{log_dev_preview_warning, IncMetric, StoreMetric}; -use crate::utils::eventfd::EventFd; use crate::utils::u64_to_usize; use crate::vmm_config::drive::BlockDeviceConfig; use crate::vstate::memory::GuestMemoryMmap; @@ -162,7 +163,7 @@ impl std::fmt::Debug for VhostUserBlockImpl { impl VhostUserBlockImpl { pub fn new(config: VhostUserBlockConfig) -> Result { log_dev_preview_warning("vhost-user-blk device", Option::None); - let start_time = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let start_time = get_time_us(ClockType::Monotonic); let mut requested_features = AVAILABLE_FEATURES; if config.cache_type == CacheType::Writeback { @@ -213,7 +214,7 @@ impl VhostUserBlockImpl { let vhost_user_block_metrics_name = format!("block_{}", config.drive_id); let metrics = VhostUserMetricsPerDevice::alloc(vhost_user_block_metrics_name); - let delta_us = utils::time::get_time_us(utils::time::ClockType::Monotonic) - start_time; + let delta_us = get_time_us(ClockType::Monotonic) - start_time; metrics.init_time_us.store(delta_us); Ok(Self { @@ -255,7 +256,7 @@ impl VhostUserBlockImpl { } pub fn config_update(&mut self) -> Result<(), VhostUserBlockError> { - let start_time = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let start_time = get_time_us(ClockType::Monotonic); // This buffer is used for config size check in vhost crate. let buffer = [0u8; BLOCK_CONFIG_SPACE_SIZE as usize]; @@ -274,7 +275,7 @@ impl VhostUserBlockImpl { .trigger_irq(IrqType::Config) .map_err(VhostUserBlockError::IrqTrigger)?; - let delta_us = utils::time::get_time_us(utils::time::ClockType::Monotonic) - start_time; + let delta_us = get_time_us(ClockType::Monotonic) - start_time; self.metrics.config_change_time_us.store(delta_us); Ok(()) @@ -336,7 +337,7 @@ impl VirtioDevice for VhostUserBlock .map_err(ActivateError::QueueMemoryError)?; } - let start_time = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let start_time = get_time_us(ClockType::Monotonic); // Setting features again, because now we negotiated them // with guest driver as well. self.vu_handle @@ -353,7 +354,7 @@ impl VirtioDevice for VhostUserBlock ActivateError::VhostUser(err) })?; self.device_state = DeviceState::Activated(mem); - let delta_us = utils::time::get_time_us(utils::time::ClockType::Monotonic) - start_time; + let delta_us = get_time_us(ClockType::Monotonic) - start_time; self.metrics.activate_time_us.store(delta_us); Ok(()) } @@ -371,12 +372,12 @@ mod tests { use std::sync::atomic::Ordering; use vhost::{VhostUserMemoryRegionInfo, VringConfigData}; + use vmm_sys_util::tempfile::TempFile; use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; use crate::devices::virtio::mmio::VIRTIO_MMIO_INT_CONFIG; use crate::test_utils::create_tmp_socket; - use crate::utils::tempfile::TempFile; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs b/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs index 8c57f6f599f..4f143995630 100644 --- a/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs +++ b/src/vmm/src/devices/virtio/block/vhost_user/event_handler.rs @@ -1,11 +1,11 @@ // Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; +use vmm_sys_util::epoll::EventSet; use super::VhostUserBlock; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; -use crate::utils::epoll::EventSet; impl VhostUserBlock { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/block/virtio/device.rs b/src/vmm/src/devices/virtio/block/virtio/device.rs index 57524157043..fd352fe2539 100644 --- a/src/vmm/src/devices/virtio/block/virtio/device.rs +++ b/src/vmm/src/devices/virtio/block/virtio/device.rs @@ -15,6 +15,7 @@ use std::sync::Arc; use block_io::FileEngine; use serde::{Deserialize, Serialize}; +use vmm_sys_util::eventfd::EventFd; use super::io::async_io; use super::request::*; @@ -33,7 +34,6 @@ use crate::devices::virtio::queue::Queue; use crate::devices::virtio::{ActivateError, TYPE_BLOCK}; use crate::logger::{error, warn, IncMetric}; use crate::rate_limiter::{BucketUpdate, RateLimiter}; -use crate::utils::eventfd::EventFd; use crate::utils::u64_to_usize; use crate::vmm_config::drive::BlockDeviceConfig; use crate::vmm_config::RateLimiterConfig; @@ -678,6 +678,8 @@ mod tests { use std::thread; use std::time::Duration; + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::check_metric_after_block; use crate::devices::virtio::block::virtio::test_utils::{ @@ -689,7 +691,6 @@ mod tests { use crate::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::{default_mem, VirtQueue}; use crate::rate_limiter::TokenType; - use crate::utils::tempfile::TempFile; use crate::vstate::memory::{Address, Bytes, GuestAddress}; #[test] @@ -1083,7 +1084,7 @@ mod tests { let status_addr = GuestAddress(vq.dtable[2].addr.get()); let empty_data = vec![0; 512]; - let rand_data = crate::utils::rand::rand_alphanumerics(1024) + let rand_data = vmm_sys_util::rand::rand_alphanumerics(1024) .as_bytes() .to_vec(); diff --git a/src/vmm/src/devices/virtio/block/virtio/event_handler.rs b/src/vmm/src/devices/virtio/block/virtio/event_handler.rs index 67fe519044c..8400766e06b 100644 --- a/src/vmm/src/devices/virtio/block/virtio/event_handler.rs +++ b/src/vmm/src/devices/virtio/block/virtio/event_handler.rs @@ -1,12 +1,12 @@ // Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; +use vmm_sys_util::epoll::EventSet; use super::io::FileEngine; use crate::devices::virtio::block::virtio::device::VirtioBlock; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; -use crate::utils::epoll::EventSet; impl VirtioBlock { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs b/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs index 7ed9a9f18d1..515ff9ca32c 100644 --- a/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs +++ b/src/vmm/src/devices/virtio/block/virtio/io/async_io.rs @@ -7,6 +7,7 @@ use std::os::fd::RawFd; use std::os::unix::io::AsRawFd; use vm_memory::GuestMemoryError; +use vmm_sys_util::eventfd::EventFd; use crate::devices::virtio::block::virtio::io::UserDataError; use crate::devices::virtio::block::virtio::IO_URING_NUM_ENTRIES; @@ -14,7 +15,6 @@ use crate::io_uring::operation::{Cqe, OpCode, Operation}; use crate::io_uring::restriction::Restriction; use crate::io_uring::{self, IoUring, IoUringError}; use crate::logger::log_dev_preview_warning; -use crate::utils::eventfd::EventFd; use crate::vstate::memory::{GuestAddress, GuestMemory, GuestMemoryExtension, GuestMemoryMmap}; #[derive(Debug, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/devices/virtio/block/virtio/io/mod.rs b/src/vmm/src/devices/virtio/block/virtio/io/mod.rs index 1cb30aeae56..de970986da2 100644 --- a/src/vmm/src/devices/virtio/block/virtio/io/mod.rs +++ b/src/vmm/src/devices/virtio/block/virtio/io/mod.rs @@ -189,9 +189,10 @@ pub mod tests { use std::os::unix::ffi::OsStrExt; use std::os::unix::io::FromRawFd; + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; - use crate::utils::tempfile::TempFile; use crate::utils::u64_to_usize; use crate::vmm_config::machine_config::HugePageConfig; use crate::vstate::memory::{Bitmap, Bytes, GuestMemory, GuestMemoryExtension}; @@ -279,7 +280,7 @@ pub mod tests { let file = TempFile::new().unwrap().into_file(); let mut engine = FileEngine::from_file(file, FileEngineType::Sync).unwrap(); - let data = crate::utils::rand::rand_alphanumerics(FILE_LEN as usize) + let data = vmm_sys_util::rand::rand_alphanumerics(FILE_LEN as usize) .as_bytes() .to_vec(); @@ -349,7 +350,7 @@ pub mod tests { let file = TempFile::new().unwrap().into_file(); let mut engine = FileEngine::<()>::from_file(file, FileEngineType::Async).unwrap(); - let data = crate::utils::rand::rand_alphanumerics(FILE_LEN as usize) + let data = vmm_sys_util::rand::rand_alphanumerics(FILE_LEN as usize) .as_bytes() .to_vec(); diff --git a/src/vmm/src/devices/virtio/block/virtio/persist.rs b/src/vmm/src/devices/virtio/block/virtio/persist.rs index 712a83332b2..61bffbeaa40 100644 --- a/src/vmm/src/devices/virtio/block/virtio/persist.rs +++ b/src/vmm/src/devices/virtio/block/virtio/persist.rs @@ -7,6 +7,7 @@ use std::sync::atomic::AtomicU32; use std::sync::Arc; use serde::{Deserialize, Serialize}; +use vmm_sys_util::eventfd::EventFd; use super::device::DiskProperties; use super::*; @@ -20,7 +21,6 @@ use crate::devices::virtio::TYPE_BLOCK; use crate::rate_limiter::persist::RateLimiterState; use crate::rate_limiter::RateLimiter; use crate::snapshot::Persist; -use crate::utils::eventfd::EventFd; /// Holds info about block's file engine type. Gets saved in snapshot. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] @@ -151,12 +151,13 @@ impl Persist<'_> for VirtioBlock { mod tests { use std::sync::atomic::Ordering; + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::devices::virtio::block::virtio::device::VirtioBlockConfig; use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::test_utils::default_mem; use crate::snapshot::Snapshot; - use crate::utils::tempfile::TempFile; #[test] fn test_cache_semantic_ser() { diff --git a/src/vmm/src/devices/virtio/block/virtio/test_utils.rs b/src/vmm/src/devices/virtio/block/virtio/test_utils.rs index e92d53c05bc..106da8177cd 100644 --- a/src/vmm/src/devices/virtio/block/virtio/test_utils.rs +++ b/src/vmm/src/devices/virtio/block/virtio/test_utils.rs @@ -8,6 +8,8 @@ use std::thread; #[cfg(test)] use std::time::Duration; +use vmm_sys_util::tempfile::TempFile; + use super::device::VirtioBlockConfig; use super::RequestHeader; use crate::devices::virtio::block::virtio::device::FileEngineType; @@ -19,7 +21,6 @@ use crate::devices::virtio::device::IrqType; use crate::devices::virtio::queue::{Queue, VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::{VirtQueue, VirtqDesc}; use crate::rate_limiter::RateLimiter; -use crate::utils::tempfile::TempFile; use crate::vmm_config::{RateLimiterConfig, TokenBucketConfig}; use crate::vstate::memory::{Bytes, GuestAddress}; diff --git a/src/vmm/src/devices/virtio/device.rs b/src/vmm/src/devices/virtio/device.rs index 759a37a93ca..b5af6862af9 100644 --- a/src/vmm/src/devices/virtio/device.rs +++ b/src/vmm/src/devices/virtio/device.rs @@ -9,12 +9,13 @@ use std::fmt; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; +use vmm_sys_util::eventfd::EventFd; + use super::mmio::{VIRTIO_MMIO_INT_CONFIG, VIRTIO_MMIO_INT_VRING}; use super::queue::{Queue, QueueError}; use super::ActivateError; use crate::devices::virtio::AsAny; use crate::logger::{error, warn}; -use crate::utils::eventfd::EventFd; use crate::vstate::memory::GuestMemoryMmap; /// Enum that indicates if a VirtioDevice is inactive or has been activated diff --git a/src/vmm/src/devices/virtio/mmio.rs b/src/vmm/src/devices/virtio/mmio.rs index 585c3c62f33..463d11ca2e2 100644 --- a/src/vmm/src/devices/virtio/mmio.rs +++ b/src/vmm/src/devices/virtio/mmio.rs @@ -373,13 +373,14 @@ impl MmioTransport { #[cfg(test)] pub(crate) mod tests { + use vmm_sys_util::eventfd::EventFd; + use super::*; use crate::devices::virtio::device::IrqTrigger; use crate::devices::virtio::device_status::DEVICE_NEEDS_RESET; use crate::devices::virtio::ActivateError; use crate::test_utils::single_region_mem; use crate::utils::byte_order::{read_le_u32, write_le_u32}; - use crate::utils::eventfd::EventFd; use crate::utils::u64_to_usize; use crate::vstate::memory::GuestMemoryMmap; diff --git a/src/vmm/src/devices/virtio/net/device.rs b/src/vmm/src/devices/virtio/net/device.rs index 5c27ac71267..feb7488cc05 100755 --- a/src/vmm/src/devices/virtio/net/device.rs +++ b/src/vmm/src/devices/virtio/net/device.rs @@ -13,6 +13,7 @@ use std::sync::{Arc, Mutex}; use libc::EAGAIN; use log::{error, warn}; use vm_memory::GuestMemoryError; +use vmm_sys_util::eventfd::EventFd; use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice}; use crate::devices::virtio::gen::virtio_blk::VIRTIO_F_VERSION_1; @@ -37,7 +38,6 @@ use crate::logger::{IncMetric, METRICS}; use crate::mmds::data_store::Mmds; use crate::mmds::ns::MmdsNetworkStack; use crate::rate_limiter::{BucketUpdate, RateLimiter, TokenType}; -use crate::utils::eventfd::EventFd; use crate::utils::net::mac::MacAddr; use crate::utils::u64_to_usize; use crate::vstate::memory::{ByteValued, Bytes, GuestMemoryMmap}; diff --git a/src/vmm/src/devices/virtio/net/event_handler.rs b/src/vmm/src/devices/virtio/net/event_handler.rs index 7f0eae195d3..1d8805e93fe 100644 --- a/src/vmm/src/devices/virtio/net/event_handler.rs +++ b/src/vmm/src/devices/virtio/net/event_handler.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; +use vmm_sys_util::epoll::EventSet; use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::net::device::Net; use crate::devices::virtio::net::{RX_INDEX, TX_INDEX}; use crate::logger::{error, warn, IncMetric}; -use crate::utils::epoll::EventSet; impl Net { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/net/tap.rs b/src/vmm/src/devices/virtio/net/tap.rs index 056a615833c..20024a1ae8e 100644 --- a/src/vmm/src/devices/virtio/net/tap.rs +++ b/src/vmm/src/devices/virtio/net/tap.rs @@ -11,10 +11,11 @@ use std::io::{Error as IoError, Read}; use std::os::raw::*; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; +use vmm_sys_util::ioctl::{ioctl_with_mut_ref, ioctl_with_ref, ioctl_with_val}; +use vmm_sys_util::{ioctl_ioc_nr, ioctl_iow_nr}; + use crate::devices::virtio::iovec::IoVecBuffer; use crate::devices::virtio::net::gen; -use crate::utils::ioctl::{ioctl_with_mut_ref, ioctl_with_ref, ioctl_with_val}; -use crate::utils::{ioctl_ioc_nr, ioctl_iow_nr}; // As defined in the Linux UAPI: // https://elixir.bootlin.com/linux/v4.17/source/include/uapi/linux/if.h#L33 @@ -292,7 +293,7 @@ pub mod tests { enable(&tap); let tap_traffic_simulator = TapTrafficSimulator::new(if_index(&tap)); - let packet = crate::utils::rand::rand_alphanumerics(PAYLOAD_SIZE); + let packet = vmm_sys_util::rand::rand_alphanumerics(PAYLOAD_SIZE); tap_traffic_simulator.push_tx_packet(packet.as_bytes()); let mut buf = [0u8; PACKET_SIZE]; @@ -309,11 +310,11 @@ pub mod tests { enable(&tap); let tap_traffic_simulator = TapTrafficSimulator::new(if_index(&tap)); - let mut fragment1 = crate::utils::rand::rand_bytes(PAYLOAD_SIZE); + let mut fragment1 = vmm_sys_util::rand::rand_bytes(PAYLOAD_SIZE); fragment1.as_mut_slice()[..gen::ETH_HLEN as usize] .copy_from_slice(&[0; gen::ETH_HLEN as usize]); - let fragment2 = crate::utils::rand::rand_bytes(PAYLOAD_SIZE); - let fragment3 = crate::utils::rand::rand_bytes(PAYLOAD_SIZE); + let fragment2 = vmm_sys_util::rand::rand_bytes(PAYLOAD_SIZE); + let fragment3 = vmm_sys_util::rand::rand_bytes(PAYLOAD_SIZE); let scattered = IoVecBuffer::from(vec![ fragment1.as_slice(), diff --git a/src/vmm/src/devices/virtio/net/test_utils.rs b/src/vmm/src/devices/virtio/net/test_utils.rs index 04a00ecb2ba..07808bbb44b 100644 --- a/src/vmm/src/devices/virtio/net/test_utils.rs +++ b/src/vmm/src/devices/virtio/net/test_utils.rs @@ -250,7 +250,7 @@ pub(crate) fn inject_tap_tx_frame(net: &Net, len: usize) -> Vec { assert!(len >= vnet_hdr_len()); let tap_traffic_simulator = TapTrafficSimulator::new(if_index(&net.tap)); - let mut frame = crate::utils::rand::rand_alphanumerics(len - vnet_hdr_len()) + let mut frame = vmm_sys_util::rand::rand_alphanumerics(len - vnet_hdr_len()) .as_bytes() .to_vec(); tap_traffic_simulator.push_tx_packet(&frame); @@ -418,7 +418,7 @@ pub mod test { addr += u64::from(len); // Add small random gaps between descriptor addresses in order to make sure we // don't blindly read contiguous memory. - addr += u64::from(crate::utils::rand::xor_pseudo_rng_u32()) % 10; + addr += u64::from(vmm_sys_util::rand::xor_pseudo_rng_u32()) % 10; } // Mark the chain as available. @@ -480,7 +480,7 @@ pub mod test { // Generates a frame of `frame_len` and writes it to the provided descriptor chain. // Doesn't generate an error if the descriptor chain is longer than `frame_len`. pub fn write_tx_frame(&self, desc_list: &[(u16, u32, u16)], frame_len: usize) -> Vec { - let mut frame = crate::utils::rand::rand_alphanumerics(frame_len) + let mut frame = vmm_sys_util::rand::rand_alphanumerics(frame_len) .as_bytes() .to_vec(); let prefix_len = vnet_hdr_len() + ETH_HLEN as usize; diff --git a/src/vmm/src/devices/virtio/persist.rs b/src/vmm/src/devices/virtio/persist.rs index abf39739fd3..23293a25eab 100644 --- a/src/vmm/src/devices/virtio/persist.rs +++ b/src/vmm/src/devices/virtio/persist.rs @@ -255,6 +255,8 @@ impl Persist<'_> for MmioTransport { #[cfg(test)] mod tests { + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::devices::virtio::block::virtio::device::FileEngineType; use crate::devices::virtio::block::virtio::test_utils::default_block_with_path; @@ -265,7 +267,6 @@ mod tests { use crate::devices::virtio::test_utils::default_mem; use crate::devices::virtio::vsock::{Vsock, VsockUnixBackend}; use crate::snapshot::Snapshot; - use crate::utils::tempfile::TempFile; const DEFAULT_QUEUE_MAX_SIZE: u16 = 256; impl Default for QueueState { diff --git a/src/vmm/src/devices/virtio/rng/device.rs b/src/vmm/src/devices/virtio/rng/device.rs index 5adadd60b25..4bdea1c40f6 100644 --- a/src/vmm/src/devices/virtio/rng/device.rs +++ b/src/vmm/src/devices/virtio/rng/device.rs @@ -7,6 +7,7 @@ use std::sync::Arc; use aws_lc_rs::rand; use vm_memory::GuestMemoryError; +use vmm_sys_util::eventfd::EventFd; use super::metrics::METRICS; use super::{RNG_NUM_QUEUES, RNG_QUEUE}; @@ -18,7 +19,6 @@ use crate::devices::virtio::{ActivateError, TYPE_RNG}; use crate::devices::DeviceError; use crate::logger::{debug, error, IncMetric}; use crate::rate_limiter::{RateLimiter, TokenType}; -use crate::utils::eventfd::EventFd; use crate::vstate::memory::GuestMemoryMmap; pub const ENTROPY_DEV_ID: &str = "rng"; diff --git a/src/vmm/src/devices/virtio/rng/event_handler.rs b/src/vmm/src/devices/virtio/rng/event_handler.rs index 0d3c6061955..dffda5d8845 100644 --- a/src/vmm/src/devices/virtio/rng/event_handler.rs +++ b/src/vmm/src/devices/virtio/rng/event_handler.rs @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 use event_manager::{EventOps, Events, MutEventSubscriber}; +use vmm_sys_util::epoll::EventSet; use super::{Entropy, RNG_QUEUE}; use crate::devices::virtio::device::VirtioDevice; use crate::logger::{error, warn}; -use crate::utils::epoll::EventSet; impl Entropy { const PROCESS_ACTIVATE: u32 = 0; diff --git a/src/vmm/src/devices/virtio/test_utils.rs b/src/vmm/src/devices/virtio/test_utils.rs index 031ecf84427..9bb66db82ae 100644 --- a/src/vmm/src/devices/virtio/test_utils.rs +++ b/src/vmm/src/devices/virtio/test_utils.rs @@ -469,7 +469,7 @@ pub(crate) mod test { addr += u64::from(len); // Add small random gaps between descriptor addresses in order to make sure we // don't blindly read contiguous memory. - addr += u64::from(crate::utils::rand::xor_pseudo_rng_u32()) % 10; + addr += u64::from(vmm_sys_util::rand::xor_pseudo_rng_u32()) % 10; } // Mark the chain as available. diff --git a/src/vmm/src/devices/virtio/vhost_user.rs b/src/vmm/src/devices/virtio/vhost_user.rs index a63eed50c57..ad86c9942af 100644 --- a/src/vmm/src/devices/virtio/vhost_user.rs +++ b/src/vmm/src/devices/virtio/vhost_user.rs @@ -11,10 +11,10 @@ use vhost::vhost_user::message::*; use vhost::vhost_user::{Frontend, VhostUserFrontend}; use vhost::{Error as VhostError, VhostBackend, VhostUserMemoryRegionInfo, VringConfigData}; use vm_memory::{Address, Error as MmapError, GuestMemory, GuestMemoryError, GuestMemoryRegion}; +use vmm_sys_util::eventfd::EventFd; use crate::devices::virtio::device::IrqTrigger; use crate::devices::virtio::queue::Queue; -use crate::utils::eventfd::EventFd; use crate::vstate::memory::GuestMemoryMmap; /// vhost-user error. @@ -462,9 +462,10 @@ impl VhostUserHandleImpl { mod tests { #![allow(clippy::undocumented_unsafe_blocks)] + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::test_utils::create_tmp_socket; - use crate::utils::tempfile::TempFile; use crate::vstate::memory::{FileOffset, GuestAddress, GuestMemoryExtension}; #[test] diff --git a/src/vmm/src/devices/virtio/vhost_user_metrics.rs b/src/vmm/src/devices/virtio/vhost_user_metrics.rs index 87c86e847fb..73b41e6a86c 100644 --- a/src/vmm/src/devices/virtio/vhost_user_metrics.rs +++ b/src/vmm/src/devices/virtio/vhost_user_metrics.rs @@ -143,6 +143,8 @@ pub struct VhostUserDeviceMetrics { #[cfg(test)] pub mod tests { + use utils::time::{get_time_us, ClockType}; + use super::*; use crate::logger::{IncMetric, StoreMetric}; @@ -158,10 +160,10 @@ pub mod tests { #[test] fn test_vhost_user_basic_metrics() { let vhost_user_dev_name: String = String::from("vhost_user_block_drvN"); - let start_time = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let start_time = get_time_us(ClockType::Monotonic); let vhost_user_metrics: Arc = VhostUserMetricsPerDevice::alloc(vhost_user_dev_name.clone()); - let delta_us = utils::time::get_time_us(utils::time::ClockType::Monotonic) - start_time; + let delta_us = get_time_us(ClockType::Monotonic) - start_time; vhost_user_metrics.activate_fails.inc(); assert_eq!(vhost_user_metrics.activate_fails.count(), 1); diff --git a/src/vmm/src/devices/virtio/vsock/csm/connection.rs b/src/vmm/src/devices/virtio/vsock/csm/connection.rs index e43d80eff72..32bb220c3fc 100644 --- a/src/vmm/src/devices/virtio/vsock/csm/connection.rs +++ b/src/vmm/src/devices/virtio/vsock/csm/connection.rs @@ -85,6 +85,7 @@ use std::time::{Duration, Instant}; use log::{debug, error, info, warn}; use vm_memory::io::{ReadVolatile, WriteVolatile}; use vm_memory::GuestMemoryError; +use vmm_sys_util::epoll::EventSet; use super::super::defs::uapi; use super::super::packet::VsockPacket; @@ -93,7 +94,6 @@ use super::txbuf::TxBuf; use super::{defs, ConnState, PendingRx, PendingRxSet, VsockCsmError}; use crate::devices::virtio::vsock::metrics::METRICS; use crate::logger::IncMetric; -use crate::utils::epoll::EventSet; use crate::utils::wrap_usize_to_u32; /// Trait that vsock connection backends need to implement. @@ -685,6 +685,7 @@ mod tests { use std::time::{Duration, Instant}; use vm_memory::{VolatileMemoryError, VolatileSlice}; + use vmm_sys_util::eventfd::EventFd; use super::super::super::defs::uapi; use super::super::defs as csm_defs; @@ -692,7 +693,6 @@ mod tests { use crate::devices::virtio::vsock::device::{RXQ_INDEX, TXQ_INDEX}; use crate::devices::virtio::vsock::test_utils; use crate::devices::virtio::vsock::test_utils::TestContext; - use crate::utils::eventfd::EventFd; use crate::vstate::memory::BitmapSlice; const LOCAL_CID: u64 = 2; diff --git a/src/vmm/src/devices/virtio/vsock/device.rs b/src/vmm/src/devices/virtio/vsock/device.rs index 47b5f5861f6..afd1d8348d4 100644 --- a/src/vmm/src/devices/virtio/vsock/device.rs +++ b/src/vmm/src/devices/virtio/vsock/device.rs @@ -23,6 +23,7 @@ use std::fmt::Debug; use log::{error, warn}; +use vmm_sys_util::eventfd::EventFd; use super::super::super::DeviceError; use super::defs::uapi; @@ -35,7 +36,6 @@ use crate::devices::virtio::vsock::VsockError; use crate::devices::virtio::ActivateError; use crate::logger::IncMetric; use crate::utils::byte_order; -use crate::utils::eventfd::EventFd; use crate::vstate::memory::{Bytes, GuestMemoryMmap}; pub(crate) const RXQ_INDEX: usize = 0; diff --git a/src/vmm/src/devices/virtio/vsock/event_handler.rs b/src/vmm/src/devices/virtio/vsock/event_handler.rs index 03df6a195d6..c35fa1ba77c 100755 --- a/src/vmm/src/devices/virtio/vsock/event_handler.rs +++ b/src/vmm/src/devices/virtio/vsock/event_handler.rs @@ -28,13 +28,13 @@ use std::fmt::Debug; /// buffers. use event_manager::{EventOps, Events, MutEventSubscriber}; use log::{error, warn}; +use vmm_sys_util::epoll::EventSet; use super::device::{Vsock, EVQ_INDEX, RXQ_INDEX, TXQ_INDEX}; use super::VsockBackend; use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::vsock::metrics::METRICS; use crate::logger::IncMetric; -use crate::utils::epoll::EventSet; impl Vsock where diff --git a/src/vmm/src/devices/virtio/vsock/mod.rs b/src/vmm/src/devices/virtio/vsock/mod.rs index b3b384c9c0b..7fdc86aed2e 100644 --- a/src/vmm/src/devices/virtio/vsock/mod.rs +++ b/src/vmm/src/devices/virtio/vsock/mod.rs @@ -24,6 +24,7 @@ use std::os::unix::io::AsRawFd; use packet::VsockPacket; use vm_memory::GuestMemoryError; +use vmm_sys_util::epoll::EventSet; pub use self::defs::uapi::VIRTIO_ID_VSOCK as TYPE_VSOCK; pub use self::defs::VSOCK_DEV_ID; @@ -31,7 +32,6 @@ pub use self::device::Vsock; pub use self::unix::{VsockUnixBackend, VsockUnixBackendError}; use crate::devices::virtio::iovec::IoVecError; use crate::devices::virtio::persist::PersistError as VirtioStateError; -use crate::utils::epoll::EventSet; mod defs { use crate::devices::virtio::queue::FIRECRACKER_MAX_QUEUE_SIZE; diff --git a/src/vmm/src/devices/virtio/vsock/test_utils.rs b/src/vmm/src/devices/virtio/vsock/test_utils.rs index 87821f0de17..1e240bcf268 100644 --- a/src/vmm/src/devices/virtio/vsock/test_utils.rs +++ b/src/vmm/src/devices/virtio/vsock/test_utils.rs @@ -6,6 +6,9 @@ use std::os::unix::io::{AsRawFd, RawFd}; +use vmm_sys_util::epoll::EventSet; +use vmm_sys_util::eventfd::EventFd; + use crate::devices::virtio::device::VirtioDevice; use crate::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE}; use crate::devices::virtio::test_utils::VirtQueue as GuestQ; @@ -15,8 +18,6 @@ use crate::devices::virtio::vsock::{ Vsock, VsockBackend, VsockChannel, VsockEpollListener, VsockError, }; use crate::test_utils::single_region_mem; -use crate::utils::epoll::EventSet; -use crate::utils::eventfd::EventFd; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; #[derive(Debug)] diff --git a/src/vmm/src/devices/virtio/vsock/unix/muxer.rs b/src/vmm/src/devices/virtio/vsock/unix/muxer.rs index 1dfb3a5296f..b9403a83eea 100644 --- a/src/vmm/src/devices/virtio/vsock/unix/muxer.rs +++ b/src/vmm/src/devices/virtio/vsock/unix/muxer.rs @@ -36,6 +36,7 @@ use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::net::{UnixListener, UnixStream}; use log::{debug, error, info, warn}; +use vmm_sys_util::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; use super::super::csm::ConnState; use super::super::defs::uapi; @@ -46,7 +47,6 @@ use super::muxer_rxq::MuxerRxQ; use super::{defs, MuxerConnection, VsockUnixBackendError}; use crate::devices::virtio::vsock::metrics::METRICS; use crate::logger::IncMetric; -use crate::utils::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; /// A unique identifier of a `MuxerConnection` object. Connections are stored in a hash map, /// keyed by a `ConnMapKey` object. @@ -791,12 +791,13 @@ mod tests { use std::os::unix::net::{UnixListener, UnixStream}; use std::path::{Path, PathBuf}; + use vmm_sys_util::tempfile::TempFile; + use super::super::super::csm::defs as csm_defs; use super::*; use crate::devices::virtio::vsock::device::{RXQ_INDEX, TXQ_INDEX}; use crate::devices::virtio::vsock::test_utils; use crate::devices::virtio::vsock::test_utils::TestContext as VsockTestContext; - use crate::utils::tempfile::TempFile; const PEER_CID: u64 = 3; const PEER_BUF_ALLOC: u32 = 64 * 1024; diff --git a/src/vmm/src/dumbo/tcp/connection.rs b/src/vmm/src/dumbo/tcp/connection.rs index c0c8bf36d4e..8036f428318 100644 --- a/src/vmm/src/dumbo/tcp/connection.rs +++ b/src/vmm/src/dumbo/tcp/connection.rs @@ -10,6 +10,7 @@ use std::fmt::Debug; use std::num::{NonZeroU16, NonZeroU64, NonZeroUsize, Wrapping}; use bitflags::bitflags; +use vmm_sys_util::rand::xor_pseudo_rng_u32; use crate::dumbo::pdu::bytes::NetworkBytes; use crate::dumbo::pdu::tcp::{Flags as TcpFlags, TcpError as TcpSegmentError, TcpSegment}; @@ -18,7 +19,6 @@ use crate::dumbo::tcp::{ seq_after, seq_at_or_after, NextSegmentStatus, RstConfig, MAX_WINDOW_SIZE, MSS_DEFAULT, }; use crate::dumbo::ByteBuffer; -use crate::utils::rand::xor_pseudo_rng_u32; bitflags! { // We use a set of flags, instead of a state machine, to represent the connection status. Some diff --git a/src/vmm/src/io_uring/mod.rs b/src/vmm/src/io_uring/mod.rs index 89e44c45166..3466fd01aa5 100644 --- a/src/vmm/src/io_uring/mod.rs +++ b/src/vmm/src/io_uring/mod.rs @@ -22,8 +22,7 @@ use queue::completion::CompletionQueue; pub use queue::submission::SQueueError; use queue::submission::SubmissionQueue; use restriction::Restriction; - -use crate::utils::syscall::SyscallReturnCode; +use vmm_sys_util::syscall::SyscallReturnCode; // IO_uring operations that we require to be supported by the host kernel. const REQUIRED_OPS: [OpCode; 2] = [OpCode::Read, OpCode::Write]; @@ -38,7 +37,7 @@ pub enum IoUringError { /// Could not enable the ring: {0} Enable(IOError), /// A FamStructWrapper operation has failed: {0} - Fam(crate::utils::fam::Error), + Fam(vmm_sys_util::fam::Error), /// The number of ops in the ring is >= CQ::count FullCQueue, /// Fd was not registered: {0} @@ -389,12 +388,12 @@ mod tests { use proptest::strategy::Strategy; use proptest::test_runner::{Config, TestRunner}; use vm_memory::VolatileMemory; + use vmm_sys_util::syscall::SyscallReturnCode; + use vmm_sys_util::tempfile::TempFile; /// ------------------------------------- /// BEGIN PROPERTY BASED TESTING use super::*; - use crate::utils::syscall::SyscallReturnCode; - use crate::utils::tempfile::TempFile; use crate::vstate::memory::{Bytes, MmapRegion}; fn drain_cqueue(ring: &mut IoUring) { diff --git a/src/vmm/src/io_uring/probe.rs b/src/vmm/src/io_uring/probe.rs index 12f6fb03608..a1f74385815 100644 --- a/src/vmm/src/io_uring/probe.rs +++ b/src/vmm/src/io_uring/probe.rs @@ -1,9 +1,10 @@ // Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +use vmm_sys_util::fam::{FamStruct, FamStructWrapper}; +use vmm_sys_util::generate_fam_struct_impl; + use crate::io_uring::gen::{io_uring_probe, io_uring_probe_op}; -use crate::utils::fam::{FamStruct, FamStructWrapper}; -use crate::utils::generate_fam_struct_impl; // There is no max for the number of operations returned by probing. So we fallback to using the // number of values representable in a u8; diff --git a/src/vmm/src/io_uring/queue/submission.rs b/src/vmm/src/io_uring/queue/submission.rs index d9956b9583d..c8306b40d26 100644 --- a/src/vmm/src/io_uring/queue/submission.rs +++ b/src/vmm/src/io_uring/queue/submission.rs @@ -9,11 +9,11 @@ use std::os::unix::io::RawFd; use std::sync::atomic::Ordering; use vm_memory::{VolatileMemory, VolatileMemoryError}; +use vmm_sys_util::syscall::SyscallReturnCode; use super::mmap::{mmap, MmapError}; use crate::io_uring::gen; use crate::io_uring::operation::Sqe; -use crate::utils::syscall::SyscallReturnCode; use crate::vstate::memory::{Bytes, MmapRegion}; #[derive(Debug, thiserror::Error, displaydoc::Display)] diff --git a/src/vmm/src/lib.rs b/src/vmm/src/lib.rs index 075fb45d173..94dfcfbf409 100644 --- a/src/vmm/src/lib.rs +++ b/src/vmm/src/lib.rs @@ -121,6 +121,9 @@ use devices::acpi::vmgenid::VmGenIdError; use event_manager::{EventManager as BaseEventManager, EventOps, Events, MutEventSubscriber}; use seccompiler::BpfProgram; use userfaultfd::Uffd; +use vmm_sys_util::epoll::EventSet; +use vmm_sys_util::eventfd::EventFd; +use vmm_sys_util::terminal::Terminal; use vstate::vcpu::{self, KvmVcpuConfigureError, StartThreadedError, VcpuSendEventError}; use crate::arch::DeviceType; @@ -139,9 +142,6 @@ use crate::logger::{error, info, warn, MetricsError, METRICS}; use crate::persist::{MicrovmState, MicrovmStateError, VmInfo}; use crate::rate_limiter::BucketUpdate; use crate::snapshot::Persist; -use crate::utils::epoll::EventSet; -use crate::utils::eventfd::EventFd; -use crate::utils::terminal::Terminal; use crate::utils::u64_to_usize; use crate::vmm_config::instance_info::{InstanceInfo, VmState}; use crate::vstate::memory::{ @@ -253,9 +253,9 @@ pub enum VmmError { /// Vm error: {0} Vm(vstate::vm::VmError), /// Error thrown by observer object on Vmm initialization: {0} - VmmObserverInit(crate::utils::errno::Error), + VmmObserverInit(vmm_sys_util::errno::Error), /// Error thrown by observer object on Vmm teardown: {0} - VmmObserverTeardown(crate::utils::errno::Error), + VmmObserverTeardown(vmm_sys_util::errno::Error), /// VMGenID error: {0} VMGenID(#[from] VmGenIdError), } @@ -277,7 +277,7 @@ pub struct EmulateSerialInitError(#[from] std::io::Error); #[derive(Debug, thiserror::Error, displaydoc::Display)] pub enum StartVcpusError { /// VMM observer init error: {0} - VmmObserverInit(#[from] crate::utils::errno::Error), + VmmObserverInit(#[from] vmm_sys_util::errno::Error), /// Vcpu handle error: {0} VcpuHandle(#[from] StartThreadedError), } diff --git a/src/vmm/src/logger/logging.rs b/src/vmm/src/logger/logging.rs index 9a2c2fecdd9..45e8f94d1b0 100644 --- a/src/vmm/src/logger/logging.rs +++ b/src/vmm/src/logger/logging.rs @@ -351,7 +351,7 @@ mod tests { #[test] fn logger() { // Get temp file path. - let file = crate::utils::tempfile::TempFile::new().unwrap(); + let file = vmm_sys_util::tempfile::TempFile::new().unwrap(); let path = file.as_path().to_str().unwrap().to_string(); drop(file); diff --git a/src/vmm/src/logger/metrics.rs b/src/vmm/src/logger/metrics.rs index b07f391ef56..083881645a5 100644 --- a/src/vmm/src/logger/metrics.rs +++ b/src/vmm/src/logger/metrics.rs @@ -68,6 +68,7 @@ use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::{Mutex, OnceLock}; use serde::{Serialize, Serializer}; +use utils::time::{get_time_ns, get_time_us, ClockType}; use super::FcLineWriter; use crate::devices::legacy; @@ -324,7 +325,7 @@ impl ProcessTimeReporter { /// Obtain process start time in microseconds. pub fn report_start_time(&self) { if let Some(start_time) = self.start_time_us { - let delta_us = utils::time::get_time_us(utils::time::ClockType::Monotonic) - start_time; + let delta_us = get_time_us(ClockType::Monotonic) - start_time; METRICS.api_server.process_startup_time_us.store(delta_us); } } @@ -332,8 +333,7 @@ impl ProcessTimeReporter { /// Obtain process CPU start time in microseconds. pub fn report_cpu_start_time(&self) { if let Some(cpu_start_time) = self.start_time_cpu_us { - let delta_us = utils::time::get_time_us(utils::time::ClockType::ProcessCpu) - - cpu_start_time + let delta_us = get_time_us(ClockType::ProcessCpu) - cpu_start_time + self.parent_cpu_time_us.unwrap_or_default(); METRICS .api_server @@ -701,7 +701,7 @@ impl<'a> LatencyMetricsRecorder<'a> { /// Const default construction. fn new(metric: &'a LatencyAggregateMetrics) -> Self { Self { - start_time: utils::time::get_time_us(utils::time::ClockType::Monotonic), + start_time: get_time_us(ClockType::Monotonic), metric, } } @@ -712,8 +712,7 @@ impl<'a> Drop for LatencyMetricsRecorder<'a> { /// and updates min/max/sum metrics. /// self.start_time is recorded in new() and metrics are updated in drop fn drop(&mut self) { - let delta_us = - utils::time::get_time_us(utils::time::ClockType::Monotonic) - self.start_time; + let delta_us = get_time_us(ClockType::Monotonic) - self.start_time; self.metric.sum_us.add(delta_us); let min_us = self.metric.min_us.fetch(); let max_us = self.metric.max_us.fetch(); @@ -836,10 +835,7 @@ impl SerializeToUtcTimestampMs { impl Serialize for SerializeToUtcTimestampMs { fn serialize(&self, serializer: S) -> Result { - serializer.serialize_i64( - i64::try_from(utils::time::get_time_ns(utils::time::ClockType::Real) / 1_000_000) - .unwrap(), - ) + serializer.serialize_i64(i64::try_from(get_time_ns(ClockType::Real) / 1_000_000).unwrap()) } } @@ -956,8 +952,9 @@ mod tests { use std::sync::Arc; use std::thread; + use vmm_sys_util::tempfile::TempFile; + use super::*; - use crate::utils::tempfile::TempFile; #[test] fn test_init() { diff --git a/src/vmm/src/logger/mod.rs b/src/vmm/src/logger/mod.rs index 2c5144e5033..49d765b597b 100644 --- a/src/vmm/src/logger/mod.rs +++ b/src/vmm/src/logger/mod.rs @@ -16,6 +16,7 @@ pub use metrics::{ IncMetric, LatencyAggregateMetrics, MetricsError, ProcessTimeReporter, SharedIncMetric, SharedStoreMetric, StoreMetric, METRICS, }; +use utils::time::{get_time_us, ClockType}; /// Alias for `std::io::LineWriter`. pub type FcLineWriter = std::io::LineWriter; @@ -38,7 +39,7 @@ pub fn log_dev_preview_warning(feature_name: &str, msg_opt: Option) { /// Helper function for updating the value of a store metric with elapsed time since some time in a /// past. pub fn update_metric_with_elapsed_time(metric: &SharedStoreMetric, start_time_us: u64) -> u64 { - let delta_us = utils::time::get_time_us(utils::time::ClockType::Monotonic) - start_time_us; + let delta_us = get_time_us(ClockType::Monotonic) - start_time_us; metric.store(delta_us); delta_us } diff --git a/src/vmm/src/persist.rs b/src/vmm/src/persist.rs index 0c5c5f49037..6410e4d6c9b 100644 --- a/src/vmm/src/persist.rs +++ b/src/vmm/src/persist.rs @@ -15,6 +15,7 @@ use seccompiler::BpfThreadMap; use semver::Version; use serde::{Deserialize, Serialize}; use userfaultfd::{FeatureFlags, Uffd, UffdBuilder}; +use vmm_sys_util::sock_ctrl_msg::ScmSocket; #[cfg(target_arch = "aarch64")] use crate::arch::aarch64::vcpu::{get_manufacturer_id_from_host, get_manufacturer_id_from_state}; @@ -28,7 +29,6 @@ use crate::device_manager::persist::{ACPIDeviceManagerState, DevicePersistError, use crate::logger::{info, warn}; use crate::resources::VmResources; use crate::snapshot::Snapshot; -use crate::utils::sock_ctrl_msg::ScmSocket; use crate::utils::u64_to_usize; use crate::vmm_config::boot_source::BootSourceConfig; use crate::vmm_config::instance_info::InstanceInfo; @@ -534,7 +534,7 @@ pub enum GuestMemoryFromUffdError { /// Failed to connect to UDS Unix stream: {0} Connect(#[from] std::io::Error), /// Failed to sends file descriptor: {0} - Send(#[from] crate::utils::errno::Error), + Send(#[from] vmm_sys_util::errno::Error), } fn guest_memory_from_uffd( @@ -643,6 +643,8 @@ fn send_uffd_handshake( mod tests { use std::os::unix::net::UnixListener; + use vmm_sys_util::tempfile::TempFile; + use super::*; #[cfg(target_arch = "x86_64")] use crate::builder::tests::insert_vmgenid_device; @@ -654,7 +656,6 @@ mod tests { use crate::construct_kvm_mpidrs; use crate::devices::virtio::block::CacheType; use crate::snapshot::Persist; - use crate::utils::tempfile::TempFile; use crate::vmm_config::balloon::BalloonDeviceConfig; use crate::vmm_config::net::NetworkInterfaceConfig; use crate::vmm_config::vsock::tests::default_config; diff --git a/src/vmm/src/resources.rs b/src/vmm/src/resources.rs index d1ac27ee199..c2d2b1c7a9e 100644 --- a/src/vmm/src/resources.rs +++ b/src/vmm/src/resources.rs @@ -501,6 +501,7 @@ mod tests { use std::str::FromStr; use serde_json::{Map, Value}; + use vmm_sys_util::tempfile::TempFile; use super::*; use crate::cpu_config::templates::{CpuTemplateType, StaticCpuTemplate}; @@ -510,7 +511,6 @@ mod tests { use crate::devices::virtio::vsock::VSOCK_DEV_ID; use crate::resources::VmResources; use crate::utils::net::mac::MacAddr; - use crate::utils::tempfile::TempFile; use crate::vmm_config::boot_source::{ BootConfig, BootSource, BootSourceConfig, DEFAULT_KERNEL_CMDLINE, }; diff --git a/src/vmm/src/rpc_interface.rs b/src/vmm/src/rpc_interface.rs index 0a2c6257faa..68fd1a7c37b 100644 --- a/src/vmm/src/rpc_interface.rs +++ b/src/vmm/src/rpc_interface.rs @@ -6,6 +6,7 @@ use std::sync::{Arc, Mutex, MutexGuard}; use seccompiler::BpfThreadMap; use serde_json::Value; +use utils::time::{get_time_us, ClockType}; use super::builder::build_and_boot_microvm; use super::persist::{create_snapshot, restore_from_snapshot}; @@ -324,7 +325,7 @@ impl<'a> PrebootApiController<'a> { instance_info: InstanceInfo, from_api: &std::sync::mpsc::Receiver, to_api: &std::sync::mpsc::Sender, - api_event_fd: &crate::utils::eventfd::EventFd, + api_event_fd: &vmm_sys_util::eventfd::EventFd, boot_timer_enabled: bool, mmds_size_limit: usize, metadata_json: Option<&str>, @@ -555,7 +556,7 @@ impl<'a> PrebootApiController<'a> { ) -> Result { log_dev_preview_warning("Virtual machine snapshots", Option::None); - let load_start_us = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let load_start_us = get_time_us(ClockType::Monotonic); if self.boot_path { let err = LoadSnapshotError::LoadSnapshotNotAllowed; @@ -698,7 +699,7 @@ impl RuntimeApiController { /// Pauses the microVM by pausing the vCPUs. pub fn pause(&mut self) -> Result { - let pause_start_us = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let pause_start_us = get_time_us(ClockType::Monotonic); self.vmm.lock().expect("Poisoned lock").pause_vm()?; @@ -711,7 +712,7 @@ impl RuntimeApiController { /// Resumes the microVM by resuming the vCPUs. pub fn resume(&mut self) -> Result { - let resume_start_us = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let resume_start_us = get_time_us(ClockType::Monotonic); self.vmm.lock().expect("Poisoned lock").resume_vm()?; @@ -764,7 +765,7 @@ impl RuntimeApiController { let mut locked_vmm = self.vmm.lock().unwrap(); let vm_info = VmInfo::from(&self.vm_resources); - let create_start_us = utils::time::get_time_us(utils::time::ClockType::Monotonic); + let create_start_us = get_time_us(ClockType::Monotonic); create_snapshot(&mut locked_vmm, &vm_info, create_params)?; diff --git a/src/vmm/src/signal_handler.rs b/src/vmm/src/signal_handler.rs index 139fb4828ed..5bcfd41fd06 100644 --- a/src/vmm/src/signal_handler.rs +++ b/src/vmm/src/signal_handler.rs @@ -155,7 +155,7 @@ extern "C" fn sigpipe_handler(num: c_int, info: *mut siginfo_t, _unused: *mut c_ /// /// Custom handlers are installed for: `SIGBUS`, `SIGSEGV`, `SIGSYS` /// `SIGXFSZ` `SIGXCPU` `SIGPIPE` `SIGHUP` and `SIGILL`. -pub fn register_signal_handlers() -> crate::utils::errno::Result<()> { +pub fn register_signal_handlers() -> vmm_sys_util::errno::Result<()> { // Call to unsafe register_signal_handler which is considered unsafe because it will // register a signal handler which will be called in the current thread and will interrupt // whatever work is done on the current thread, so we have to keep in mind that the registered diff --git a/src/vmm/src/utils/mod.rs b/src/vmm/src/utils/mod.rs index 447a7260774..a0ee2e90b6b 100644 --- a/src/vmm/src/utils/mod.rs +++ b/src/vmm/src/utils/mod.rs @@ -1,16 +1,6 @@ // Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -// We use `utils` as a wrapper over `vmm_sys_util` to control the latter -// dependency easier (i.e. update only in one place `vmm_sys_util` version). -// More specifically, we are re-exporting modules from `vmm_sys_util` as part -// of the `utils` crate. -pub use vmm_sys_util::ioctl::ioctl_expr; -pub use vmm_sys_util::{ - epoll, errno, eventfd, fam, generate_fam_struct_impl, ioctl, ioctl_ioc_nr, ioctl_iow_nr, rand, - seek_hole, sock_ctrl_msg, syscall, tempdir, tempfile, terminal, -}; - /// Module with helpers to read/write bytes into slices pub mod byte_order; /// Module with network related helpers @@ -24,10 +14,10 @@ use std::num::Wrapping; use std::result::Result; /// Return the default page size of the platform, in bytes. -pub fn get_page_size() -> Result { +pub fn get_page_size() -> Result { // SAFETY: Safe because the parameters are valid. match unsafe { libc::sysconf(libc::_SC_PAGESIZE) } { - -1 => Err(errno::Error::last()), + -1 => Err(vmm_sys_util::errno::Error::last()), ps => Ok(usize::try_from(ps).unwrap()), } } diff --git a/src/vmm/src/vmm_config/boot_source.rs b/src/vmm/src/vmm_config/boot_source.rs index 37c9a32ed79..c40a0fde014 100644 --- a/src/vmm/src/vmm_config/boot_source.rs +++ b/src/vmm/src/vmm_config/boot_source.rs @@ -99,9 +99,10 @@ impl BootConfig { #[cfg(test)] pub(crate) mod tests { + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::snapshot::Snapshot; - use crate::utils::tempfile::TempFile; #[test] fn test_boot_config() { diff --git a/src/vmm/src/vmm_config/drive.rs b/src/vmm/src/vmm_config/drive.rs index 83c4ef5d066..cdfc732d48b 100644 --- a/src/vmm/src/vmm_config/drive.rs +++ b/src/vmm/src/vmm_config/drive.rs @@ -177,9 +177,10 @@ impl BlockBuilder { #[cfg(test)] mod tests { + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::devices::virtio::block::virtio::VirtioBlockError; - use crate::utils::tempfile::TempFile; impl PartialEq for DriveError { fn eq(&self, other: &DriveError) -> bool { diff --git a/src/vmm/src/vmm_config/metrics.rs b/src/vmm/src/vmm_config/metrics.rs index abe6ede92db..604c30e07b3 100644 --- a/src/vmm/src/vmm_config/metrics.rs +++ b/src/vmm/src/vmm_config/metrics.rs @@ -36,8 +36,9 @@ pub fn init_metrics(metrics_cfg: MetricsConfig) -> Result<(), MetricsConfigError #[cfg(test)] mod tests { + use vmm_sys_util::tempfile::TempFile; + use super::*; - use crate::utils::tempfile::TempFile; #[test] fn test_init_metrics() { diff --git a/src/vmm/src/vmm_config/vsock.rs b/src/vmm/src/vmm_config/vsock.rs index ed38b1e8de3..920e4a4d217 100644 --- a/src/vmm/src/vmm_config/vsock.rs +++ b/src/vmm/src/vmm_config/vsock.rs @@ -112,9 +112,10 @@ impl VsockBuilder { #[cfg(test)] pub(crate) mod tests { + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::devices::virtio::vsock::VSOCK_DEV_ID; - use crate::utils::tempfile::TempFile; pub(crate) fn default_config(tmp_sock_file: &TempFile) -> VsockDeviceConfig { VsockDeviceConfig { diff --git a/src/vmm/src/vstate/memory.rs b/src/vmm/src/vstate/memory.rs index f2f1bf8445a..a84fd6c4be4 100644 --- a/src/vmm/src/vstate/memory.rs +++ b/src/vmm/src/vstate/memory.rs @@ -17,8 +17,9 @@ pub use vm_memory::{ GuestUsize, MemoryRegionAddress, MmapRegion, }; use vm_memory::{Error as VmMemoryError, GuestMemoryError, WriteVolatile}; +use vmm_sys_util::errno; -use crate::utils::{errno, get_page_size, u64_to_usize}; +use crate::utils::{get_page_size, u64_to_usize}; use crate::vmm_config::machine_config::HugePageConfig; use crate::DirtyBitmap; @@ -425,10 +426,11 @@ mod tests { use std::collections::HashMap; use std::io::{Read, Seek}; + use vmm_sys_util::tempfile::TempFile; + use super::*; use crate::snapshot::Snapshot; use crate::utils::get_page_size; - use crate::utils::tempfile::TempFile; #[test] fn test_from_raw_regions() { diff --git a/src/vmm/src/vstate/vcpu/mod.rs b/src/vmm/src/vstate/vcpu/mod.rs index cd56eb66ce0..89b167bbd5b 100644 --- a/src/vmm/src/vstate/vcpu/mod.rs +++ b/src/vmm/src/vstate/vcpu/mod.rs @@ -16,11 +16,11 @@ use kvm_ioctls::VcpuExit; use libc::{c_int, c_void, siginfo_t}; use log::{error, info, warn}; use seccompiler::{BpfProgram, BpfProgramRef}; +use vmm_sys_util::errno; +use vmm_sys_util::eventfd::EventFd; use crate::cpu_config::templates::{CpuConfiguration, GuestConfigError}; use crate::logger::{IncMetric, METRICS}; -use crate::utils::errno; -use crate::utils::eventfd::EventFd; use crate::utils::signal::{register_signal_handler, sigrtmin, Killable}; use crate::utils::sm::StateMachine; use crate::vstate::vm::Vm; @@ -49,7 +49,7 @@ pub enum VcpuError { /// Received error signaling kvm exit: {0} FaultyKvmExit(String), /// Failed to signal vcpu: {0} - SignalVcpu(crate::utils::errno::Error), + SignalVcpu(vmm_sys_util::errno::Error), /// Unexpected kvm exit received: {0} UnhandledKvmExit(String), /// Failed to run action on vcpu: {0} @@ -620,7 +620,7 @@ pub struct VcpuHandle { /// Error type for [`VcpuHandle::send_event`]. #[derive(Debug, derive_more::From, thiserror::Error)] #[error("Failed to signal vCPU: {0}")] -pub struct VcpuSendEventError(pub crate::utils::errno::Error); +pub struct VcpuSendEventError(pub vmm_sys_util::errno::Error); impl VcpuHandle { /// Creates a new [`VcpuHandle`]. @@ -699,13 +699,13 @@ pub mod tests { use std::sync::{Arc, Barrier, Mutex}; use linux_loader::loader::KernelLoader; + use vmm_sys_util::errno; use super::*; use crate::builder::StartMicrovmError; use crate::devices::bus::DummyDevice; use crate::devices::BusDevice; use crate::seccomp_filters::get_empty_filters; - use crate::utils::errno; use crate::utils::signal::validate_signal_num; use crate::vstate::memory::{GuestAddress, GuestMemoryMmap}; use crate::vstate::vcpu::VcpuError as EmulationError; @@ -898,7 +898,7 @@ pub mod tests { entry_addr.unwrap().kernel_load } - fn vcpu_configured_for_boot() -> (VcpuHandle, crate::utils::eventfd::EventFd) { + fn vcpu_configured_for_boot() -> (VcpuHandle, vmm_sys_util::eventfd::EventFd) { Vcpu::register_kick_signal_handler(); // Need enough mem to boot linux. let mem_size = 64 << 20; diff --git a/src/vmm/src/vstate/vcpu/x86_64.rs b/src/vmm/src/vstate/vcpu/x86_64.rs index bf8b13bf268..6fee3933435 100644 --- a/src/vmm/src/vstate/vcpu/x86_64.rs +++ b/src/vmm/src/vstate/vcpu/x86_64.rs @@ -15,6 +15,7 @@ use kvm_bindings::{ use kvm_ioctls::{VcpuExit, VcpuFd}; use log::{error, warn}; use serde::{Deserialize, Serialize}; +use vmm_sys_util::fam; use crate::arch::x86_64::gen::msr_index::{MSR_IA32_TSC, MSR_IA32_TSC_DEADLINE}; use crate::arch::x86_64::interrupts; @@ -22,7 +23,6 @@ use crate::arch::x86_64::msr::{create_boot_msr_entries, MsrError}; use crate::arch::x86_64::regs::{SetupFpuError, SetupRegistersError, SetupSpecialRegistersError}; use crate::cpu_config::x86_64::{cpuid, CpuConfiguration}; use crate::logger::{IncMetric, METRICS}; -use crate::utils::fam; use crate::vstate::memory::{Address, GuestAddress, GuestMemoryMmap}; use crate::vstate::vcpu::{VcpuConfig, VcpuEmulation}; use crate::vstate::vm::Vm; @@ -50,7 +50,7 @@ pub enum KvmVcpuError { /// Failed to convert `kvm_bindings::CpuId` to `Cpuid`: {0} ConvertCpuidType(#[from] cpuid::CpuidTryFromKvmCpuid), /// Failed FamStructWrapper operation: {0} - Fam(#[from] crate::utils::fam::Error), + Fam(#[from] vmm_sys_util::fam::Error), /// Failed to get dumpable MSR index list: {0} GetMsrsToDump(#[from] crate::arch::x86_64::msr::MsrError), /// Cannot open the VCPU file descriptor: {0} @@ -106,7 +106,7 @@ pub enum KvmVcpuError { /// Error type for [`KvmVcpu::get_tsc_khz`] and [`KvmVcpu::is_tsc_scaling_required`]. #[derive(Debug, thiserror::Error, derive_more::From, Eq, PartialEq)] #[error("{0}")] -pub struct GetTscError(crate::utils::errno::Error); +pub struct GetTscError(vmm_sys_util::errno::Error); /// Error type for [`KvmVcpu::set_tsc_khz`]. #[derive(Debug, thiserror::Error, Eq, PartialEq)] @@ -117,11 +117,11 @@ pub struct SetTscError(#[from] kvm_ioctls::Error); #[derive(Debug, thiserror::Error, displaydoc::Display, Eq, PartialEq)] pub enum KvmVcpuConfigureError { /// Failed to convert `Cpuid` to `kvm_bindings::CpuId`: {0} - ConvertCpuidType(#[from] crate::utils::fam::Error), + ConvertCpuidType(#[from] vmm_sys_util::fam::Error), /// Failed to apply modifications to CPUID: {0} NormalizeCpuidError(#[from] cpuid::NormalizeCpuidError), /// Failed to set CPUID: {0} - SetCpuid(#[from] crate::utils::errno::Error), + SetCpuid(#[from] vmm_sys_util::errno::Error), /// Failed to set MSRs: {0} SetMsrs(#[from] MsrError), /// Failed to setup registers: {0} diff --git a/src/vmm/tests/devices.rs b/src/vmm/tests/devices.rs index 28f5b1ed040..1850bf540b0 100644 --- a/src/vmm/tests/devices.rs +++ b/src/vmm/tests/devices.rs @@ -11,7 +11,7 @@ use libc::EFD_NONBLOCK; use vm_superio::Serial; use vmm::devices::legacy::serial::SerialOut; use vmm::devices::legacy::{EventFdTrigger, SerialEventsWrapper, SerialWrapper}; -use vmm::utils::eventfd::EventFd; +use vmm_sys_util::eventfd::EventFd; fn create_serial( pipe: c_int, diff --git a/src/vmm/tests/integration_tests.rs b/src/vmm/tests/integration_tests.rs index 40e230496c4..4312c6345db 100644 --- a/src/vmm/tests/integration_tests.rs +++ b/src/vmm/tests/integration_tests.rs @@ -5,7 +5,6 @@ use std::io::{Seek, SeekFrom}; use std::thread; use std::time::Duration; -use utils::tempfile::TempFile; use vmm::builder::build_and_boot_microvm; use vmm::devices::virtio::block::CacheType; use vmm::persist::{snapshot_state_sanity_check, MicrovmState, MicrovmStateError, VmInfo}; @@ -30,6 +29,7 @@ use vmm::vmm_config::snapshot::{ }; use vmm::vmm_config::vsock::VsockDeviceConfig; use vmm::{DumpCpuConfigError, EventManager, FcExitCode}; +use vmm_sys_util::tempfile::TempFile; #[test] fn test_build_and_boot_microvm() { diff --git a/src/vmm/tests/io_uring.rs b/src/vmm/tests/io_uring.rs index 5ee5a389d35..0a4ba2301d1 100644 --- a/src/vmm/tests/io_uring.rs +++ b/src/vmm/tests/io_uring.rs @@ -7,10 +7,10 @@ use std::thread; use std::time::Duration; use vm_memory::VolatileMemory; -use vmm::utils::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; -use vmm::utils::eventfd::EventFd; -use vmm::utils::tempfile::TempFile; use vmm::vstate::memory::{Bytes, MmapRegion}; +use vmm_sys_util::epoll::{ControlOperation, Epoll, EpollEvent, EventSet}; +use vmm_sys_util::eventfd::EventFd; +use vmm_sys_util::tempfile::TempFile; mod test_utils { use vm_memory::VolatileMemory;