vmm/devices/virtio/pmem/
event_handler.rs

1// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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        // Register runtime events
40        self.register_runtime_events(ops);
41
42        // Remove activate event
43        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}