| 476 | } |
| 477 | |
| 478 | fn activate(&mut self, context: crate::device::ActivationContext) -> ActivateResult { |
| 479 | let crate::device::ActivationContext { |
| 480 | mem, |
| 481 | interrupt_cb, |
| 482 | queues, |
| 483 | device_status, |
| 484 | } = context; |
| 485 | self.common.activate(&queues, interrupt_cb.clone())?; |
| 486 | let (kill_evt, pause_evt) = self.common.dup_eventfds(); |
| 487 | |
| 488 | let mut virtqueues = Vec::new(); |
| 489 | let mut queue_evts = Vec::new(); |
| 490 | for (_, queue, queue_evt) in queues { |
| 491 | virtqueues.push(queue); |
| 492 | queue_evts.push(queue_evt); |
| 493 | } |
| 494 | |
| 495 | let mut handler = VsockEpollHandler { |
| 496 | mem, |
| 497 | queues: virtqueues, |
| 498 | queue_evts, |
| 499 | kill_evt, |
| 500 | pause_evt, |
| 501 | interrupt_cb: interrupt_cb.clone(), |
| 502 | backend: self.backend.clone(), |
| 503 | access_platform: self.common.access_platform(), |
| 504 | }; |
| 505 | |
| 506 | let paused = self.common.paused.clone(); |
| 507 | let paused_sync = self.common.paused_sync.clone(); |
| 508 | let mut epoll_threads = Vec::new(); |
| 509 | |
| 510 | spawn_virtio_thread( |
| 511 | &self.id, |
| 512 | &self.seccomp_action, |
| 513 | Thread::VirtioVsock, |
| 514 | &mut epoll_threads, |
| 515 | &self.exit_evt, |
| 516 | device_status.clone(), |
| 517 | interrupt_cb.clone(), |
| 518 | move || handler.run(&paused, paused_sync.as_ref().unwrap()), |
| 519 | )?; |
| 520 | |
| 521 | self.common.epoll_threads = Some(epoll_threads); |
| 522 | |
| 523 | event!("virtio-device", "activated", "id", &self.id); |
| 524 | Ok(()) |
| 525 | } |
| 526 | |
| 527 | fn reset(&mut self) { |
| 528 | self.common.reset(); |