(
&mut self,
vcpu: Arc<Mutex<Vcpu>>,
vcpu_id: u32,
vcpu_thread_barrier: Arc<Barrier>,
inserting: bool,
)
| 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 |
no test coverage detected