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

Method activate

virtio-devices/src/net.rs:687–825  ·  view source on GitHub ↗
(&mut self, context: crate::device::ActivationContext)

Source from the content-addressed store, hash-verified

685 }
686
687 fn activate(&mut self, context: crate::device::ActivationContext) -> ActivateResult {
688 let crate::device::ActivationContext {
689 mem,
690 interrupt_cb,
691 mut queues,
692 device_status,
693 } = context;
694 self.device_status = device_status;
695 self.common.activate(&queues, interrupt_cb.clone())?;
696
697 let num_queues = queues.len();
698 let event_idx = self.common.feature_acked(VIRTIO_RING_F_EVENT_IDX.into());
699
700 // Recompute the barrier size from the queues that are actually activated.
701 let has_ctrl_queue =
702 self.common.feature_acked(VIRTIO_NET_F_CTRL_VQ.into()) && !num_queues.is_multiple_of(2);
703 let ctrl_threads = if has_ctrl_queue { 1 } else { 0 };
704 let qp_threads = (num_queues - ctrl_threads) / 2;
705 self.common.paused_sync = Some(Arc::new(Barrier::new(1 + qp_threads + ctrl_threads)));
706
707 if has_ctrl_queue {
708 let ctrl_queue_index = num_queues - 1;
709 let (_, mut ctrl_queue, ctrl_queue_evt) = queues.remove(ctrl_queue_index);
710
711 ctrl_queue.set_event_idx(event_idx);
712
713 let (kill_evt, pause_evt) = self.common.dup_eventfds();
714 let mut ctrl_handler = NetCtrlEpollHandler {
715 mem: mem.clone(),
716 kill_evt,
717 pause_evt,
718 ctrl_q: CtrlQueue::new(self.taps.clone()),
719 queue: ctrl_queue,
720 queue_evt: ctrl_queue_evt,
721 access_platform: self.common.access_platform(),
722 queue_index: ctrl_queue_index as u16,
723 interrupt_cb: interrupt_cb.clone(),
724 };
725
726 let paused = self.common.paused.clone();
727 let paused_sync = self.common.paused_sync.clone();
728
729 let mut epoll_threads = Vec::new();
730 spawn_virtio_thread(
731 &format!("{}_ctrl", &self.id),
732 &self.seccomp_action,
733 Thread::VirtioNetCtl,
734 &mut epoll_threads,
735 &self.exit_evt,
736 self.device_status.clone(),
737 interrupt_cb.clone(),
738 move || ctrl_handler.run_ctrl(&paused, paused_sync.as_ref().unwrap()),
739 )?;
740 self.ctrl_queue_epoll_thread = Some(epoll_threads.remove(0));
741 }
742
743 let mut epoll_threads = Vec::new();
744 let mut taps = self.taps.clone();

Callers

nothing calls this directly

Calls 14

newFunction · 0.85
spawn_virtio_threadFunction · 0.85
feature_ackedMethod · 0.80
dup_eventfdsMethod · 0.80
run_ctrlMethod · 0.80
set_offloadMethod · 0.80
cloneMethod · 0.45
lenMethod · 0.45
removeMethod · 0.45
set_event_idxMethod · 0.45
access_platformMethod · 0.45

Tested by

no test coverage detected