MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / start_vcpu

Method start_vcpu

vmm/src/cpu.rs:1126–1443  ·  view source on GitHub ↗
(
        &mut self,
        vcpu: Arc<Mutex<Vcpu>>,
        vcpu_id: u32,
        vcpu_thread_barrier: Arc<Barrier>,
        inserting: bool,
    )

Source from the content-addressed store, hash-verified

1124 }
1125
1126 fn start_vcpu(
1127 &mut self,
1128 vcpu: Arc<Mutex<Vcpu>>,
1129 vcpu_id: u32,
1130 vcpu_thread_barrier: Arc<Barrier>,
1131 inserting: bool,
1132 ) -> Result<()> {
1133 let reset_evt = self.reset_evt.try_clone().unwrap();
1134 let exit_evt = self.exit_evt.try_clone().unwrap();
1135 #[cfg(feature = "kvm")]
1136 let hypervisor_type = self.hypervisor.hypervisor_type();
1137 #[cfg(feature = "guest_debug")]
1138 let vm_debug_evt = self.vm_debug_evt.try_clone().unwrap();
1139 let panic_exit_evt = self.exit_evt.try_clone().unwrap();
1140 let vcpus_kill_signalled = self.vcpus_kill_signalled.clone();
1141 let vcpus_pause_signalled = self.vcpus_pause_signalled.clone();
1142 let vcpus_kick_signalled = self.vcpus_kick_signalled.clone();
1143
1144 let mut vcpu_states = self.vcpu_states.lock().unwrap();
1145
1146 let vcpu_kill = vcpu_states[usize::try_from(vcpu_id).unwrap()].kill.clone();
1147 let vcpu_run_interrupted = vcpu_states[usize::try_from(vcpu_id).unwrap()]
1148 .vcpu_run_interrupted
1149 .clone();
1150 let panic_vcpu_run_interrupted = vcpu_run_interrupted.clone();
1151 let vcpu_paused = vcpu_states[usize::try_from(vcpu_id).unwrap()]
1152 .paused
1153 .clone();
1154
1155 // Prepare the CPU set the current vCPU is expected to run onto.
1156 let cpuset = self.affinity.get(&vcpu_id).map(|host_cpus| {
1157 // SAFETY: all zeros is a valid pattern
1158 let mut cpuset: libc::cpu_set_t = unsafe { std::mem::zeroed() };
1159 // SAFETY: FFI call, trivially safe
1160 unsafe { libc::CPU_ZERO(&mut cpuset) };
1161 for host_cpu in host_cpus {
1162 // SAFETY: FFI call, trivially safe
1163 unsafe { libc::CPU_SET(*host_cpu, &mut cpuset) };
1164 }
1165 cpuset
1166 });
1167
1168 let core_scheduling = self.config.core_scheduling;
1169 let core_scheduling_group_leader = self.core_scheduling_group_leader.clone();
1170
1171 // Retrieve seccomp filter for vcpu thread
1172 let vcpu_seccomp_filter = get_seccomp_filter(
1173 &self.seccomp_action,
1174 Thread::Vcpu,
1175 self.hypervisor.hypervisor_type(),
1176 )
1177 .map_err(Error::CreateSeccompFilter)?;
1178
1179 #[cfg(target_arch = "x86_64")]
1180 let interrupt_controller_clone = self.interrupt_controller.as_ref().cloned();
1181
1182 info!("Starting vCPU: cpu_id = {vcpu_id}");
1183

Callers 1

activate_vcpusMethod · 0.80

Calls 15

newFunction · 0.85
core_scheduling_createFunction · 0.85
get_raw_tidFunction · 0.85
spawnMethod · 0.80
waitMethod · 0.80
okMethod · 0.80
end_of_interruptMethod · 0.80
get_seccomp_filterFunction · 0.70
try_cloneMethod · 0.45
hypervisor_typeMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected