Skip to content

Refactor vmm builder code to simplify logic that creates the microVM to boot #4547

@bchalios

Description

@bchalios

Updated on 05/09/2025:

Currently, the logic to create a Vm and a Vmm objects is scattered across vmm/lib.rs and vmm.builder.rs files and it is quite convoluted and some times difficult to follow. Moreover, there is a lot of architecture specific code inserted in arbitrary places which further increases the un-readability.

Currently Vmm object is a mix bag of Vm related fields and miscellaneous management fields. This makes the whole differentiation between Vm and Vmm more difficult and testing more convoluted.
The goal of this issue is to move all Vm related fields (vcpus_handles, device_manager and device_manager) into Vm. This also goes for all attach_*_device functions and unit tests from builder.rs
The final solution should have approximately this look:

pub fn build_microvm_for_boot(
    instance_info: &InstanceInfo,
    vm_resources: &super::resources::VmResources,
    event_manager: &mut EventManager,
    seccomp_filters: &BpfThreadMap,
) -> Result<Arc<Mutex<Vmm>>, StartMicrovmError> {
    // vm_resources verification

    // All Kvm, Vcpu creation and device attachment can
    // happen here
    let vm = Vm::new(vm_resources, event_manager)?;
    // or move registration into separate function
    let vm = Vm::new(vm_resources)?;
    vm.register_device_events(event_manager)?;

    let vmm = Vmm {
        vm,
        ...
    };

    // GDB configuration

    vmm.vm.start_vcpus(...vcpu seccomp filter)?;
    ...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority: LowIndicates that an issue or pull request should be resolved behind issues or pull requests labelled `Status: ParkedIndicates that an issues or pull request will be revisited later

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions