firecracker-microvm/firecracker · error
vCPU already started
Error message
vCPU already started
What it means
Error "vCPU already started" thrown in firecracker-microvm/firecracker.
Source
Thrown at src/vmm/src/vstate/vcpu.rs:188
pub fn copy_kvm_vcpu_fd(&self, vm: &KvmVm) -> Result<VcpuFd, CopyKvmFdError> {
// SAFETY: We own this fd so it is considered safe to clone
let r = unsafe { libc::dup(self.kvm_vcpu.fd.as_raw_fd()) };
if r < 0 {
return Err(std::io::Error::last_os_error().into());
}
// SAFETY: We assert this is a valid fd by checking the result from the dup
unsafe { Ok(vm.fd().create_vcpu_from_rawfd(r)?) }
}
/// Moves the vcpu to its own thread and constructs a VcpuHandle.
/// The handle can be used to control the remote vcpu.
pub fn start_threaded(
mut self,
vm: &KvmVm,
seccomp_filter: Arc<BpfProgram>,
barrier: Arc<Barrier>,
) -> Result<VcpuHandle, StartThreadedError> {
let event_sender = self.event_sender.take().expect("vCPU already started");
let response_receiver = self.response_receiver.take().unwrap();
let vcpu_fd = self
.copy_kvm_vcpu_fd(vm)
.map_err(StartThreadedError::CopyFd)?;
let vcpu_thread = thread::Builder::new()
.name(format!("fc_vcpu {}", self.kvm_vcpu.index))
.spawn(move || {
let filter = &*seccomp_filter;
self.register_kick_signal_handler();
// Synchronization to make sure thread local data is initialized.
barrier.wait();
self.run(filter);
})
.map_err(StartThreadedError::Spawn)?;
Ok(VcpuHandle::new(
event_sender,
response_receiver,View on GitHub (pinned to 81b38b9dad)
Solutions
- Do not start a vCPU that has already been started; check vCPU state before issuing a start.
- Ensure resume/start API calls are idempotent or rejected when the vCPU is running.
When it happens
Trigger: Thrown at src/vmm/src/vstate/vcpu.rs:188 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of firecracker-microvm/firecracker@81b38b9dad (2026-08-19).
Data as JSON: /api/errors/f995386755d9b37a.
Report an issue: GitHub.