(&mut self, context: crate::device::ActivationContext)
| 727 | } |
| 728 | |
| 729 | fn activate(&mut self, context: crate::device::ActivationContext) -> ActivateResult { |
| 730 | let crate::device::ActivationContext { |
| 731 | mem, |
| 732 | interrupt_cb, |
| 733 | mut queues, |
| 734 | device_status, |
| 735 | } = context; |
| 736 | self.common.activate(&queues, interrupt_cb.clone())?; |
| 737 | self.resizer |
| 738 | .acked_features |
| 739 | .store(self.common.acked_features, Ordering::Relaxed); |
| 740 | |
| 741 | if self.common.feature_acked(VIRTIO_CONSOLE_F_SIZE) |
| 742 | && let Err(e) = interrupt_cb.trigger(VirtioInterruptType::Config) |
| 743 | { |
| 744 | error!("Failed to signal console driver: {e:?}"); |
| 745 | } |
| 746 | |
| 747 | let (kill_evt, pause_evt) = self.common.dup_eventfds(); |
| 748 | |
| 749 | let (_, input_queue, input_queue_evt) = queues.remove(0); |
| 750 | let (_, output_queue, output_queue_evt) = queues.remove(0); |
| 751 | |
| 752 | let mut handler = ConsoleEpollHandler::new( |
| 753 | mem, |
| 754 | input_queue, |
| 755 | output_queue, |
| 756 | interrupt_cb.clone(), |
| 757 | self.in_buffer.clone(), |
| 758 | Arc::clone(&self.resizer), |
| 759 | self.endpoint.clone(), |
| 760 | input_queue_evt, |
| 761 | output_queue_evt, |
| 762 | self.resizer.config_evt.try_clone().unwrap(), |
| 763 | self.resize_pipe.as_ref().map(|p| p.try_clone().unwrap()), |
| 764 | kill_evt, |
| 765 | pause_evt, |
| 766 | self.common.access_platform(), |
| 767 | ); |
| 768 | |
| 769 | let paused = self.common.paused.clone(); |
| 770 | let paused_sync = self.common.paused_sync.clone(); |
| 771 | let mut epoll_threads = Vec::new(); |
| 772 | |
| 773 | spawn_virtio_thread( |
| 774 | &self.id, |
| 775 | &self.seccomp_action, |
| 776 | Thread::VirtioConsole, |
| 777 | &mut epoll_threads, |
| 778 | &self.exit_evt, |
| 779 | device_status.clone(), |
| 780 | interrupt_cb.clone(), |
| 781 | move || handler.run(&paused, paused_sync.as_ref().unwrap()), |
| 782 | )?; |
| 783 | |
| 784 | self.common.epoll_threads = Some(epoll_threads); |
| 785 | |
| 786 | event!("virtio-device", "activated", "id", &self.id); |
nothing calls this directly
no test coverage detected