vmm/devices/virtio/pmem/
event_handler.rs1use event_manager::{EventOps, EventSet, Events, MutEventSubscriber};
5use log::{error, warn};
6
7use super::device::Pmem;
8use crate::devices::virtio::device::VirtioDevice;
9
10impl Pmem {
11 const PROCESS_ACTIVATE: u32 = 0;
12 const PROCESS_PMEM_QUEUE: u32 = 1;
13
14 fn register_runtime_events(&self, ops: &mut EventOps) {
15 if let Err(err) = ops.add(Events::with_data(
16 &self.queue_events[0],
17 Self::PROCESS_PMEM_QUEUE,
18 EventSet::IN,
19 )) {
20 error!("pmem: Failed to register queue event: {err}");
21 }
22 }
23
24 fn register_activate_event(&self, ops: &mut EventOps) {
25 if let Err(err) = ops.add(Events::with_data(
26 &self.activate_event,
27 Self::PROCESS_ACTIVATE,
28 EventSet::IN,
29 )) {
30 error!("pmem: Failed to register activate event: {err}");
31 }
32 }
33
34 fn process_activate_event(&self, ops: &mut EventOps) {
35 if let Err(err) = self.activate_event.read() {
36 error!("pmem: Failed to consume activate event: {err}");
37 }
38
39 self.register_runtime_events(ops);
41
42 if let Err(err) = ops.remove(Events::with_data(
44 &self.activate_event,
45 Self::PROCESS_ACTIVATE,
46 EventSet::IN,
47 )) {
48 error!("pmem: Failed to unregister activate event: {err}");
49 }
50 }
51}
52
53impl MutEventSubscriber for Pmem {
54 fn init(&mut self, ops: &mut EventOps) {
55 if self.is_activated() {
56 self.register_runtime_events(ops)
57 } else {
58 self.register_activate_event(ops)
59 }
60 }
61
62 fn process(&mut self, events: Events, ops: &mut EventOps) {
63 let event_set = events.event_set();
64 let source = events.data();
65
66 if !event_set.contains(EventSet::IN) {
67 warn!("pmem: Received unknown event: {event_set:#?} from source {source}");
68 return;
69 }
70
71 if !self.is_activated() {
72 warn!("pmem: The device is not activated yet. Spurious event received from {source}");
73 return;
74 }
75
76 match source {
77 Self::PROCESS_ACTIVATE => self.process_activate_event(ops),
78 Self::PROCESS_PMEM_QUEUE => self.process_queue(),
79 _ => {
80 warn!("pmem: Unknown event received: {source}");
81 }
82 }
83 }
84}