vmm/devices/virtio/block/vhost_user/
event_handler.rs

1// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3use event_manager::{EventOps, Events, MutEventSubscriber};
4use vmm_sys_util::epoll::EventSet;
5
6use super::VhostUserBlock;
7use crate::devices::virtio::device::VirtioDevice;
8use crate::logger::{error, warn};
9
10impl VhostUserBlock {
11    const PROCESS_ACTIVATE: u32 = 0;
12
13    fn register_activate_event(&self, ops: &mut EventOps) {
14        if let Err(err) = ops.add(Events::with_data(
15            &self.activate_evt,
16            Self::PROCESS_ACTIVATE,
17            EventSet::IN,
18        )) {
19            error!("Failed to register activate event: {}", err);
20        }
21    }
22
23    fn process_activate_event(&self, ops: &mut EventOps) {
24        if let Err(err) = self.activate_evt.read() {
25            error!("Failed to consume block activate event: {:?}", err);
26        }
27        if let Err(err) = ops.remove(Events::with_data(
28            &self.activate_evt,
29            Self::PROCESS_ACTIVATE,
30            EventSet::IN,
31        )) {
32            error!("Failed to un-register activate event: {}", err);
33        }
34    }
35}
36
37impl MutEventSubscriber for VhostUserBlock {
38    // Handle an event for queue or rate limiter.
39    fn process(&mut self, event: Events, ops: &mut EventOps) {
40        let source = event.data();
41        let event_set = event.event_set();
42        let supported_events = EventSet::IN;
43
44        if !supported_events.contains(event_set) {
45            warn!(
46                "Received unknown event: {:?} from source: {:?}",
47                event_set, source
48            );
49            return;
50        }
51
52        if self.is_activated() {
53            if Self::PROCESS_ACTIVATE == source {
54                self.process_activate_event(ops)
55            } else {
56                warn!("BlockVhost: Spurious event received: {:?}", source)
57            }
58        } else {
59            warn!(
60                "BlockVhost: The device is not yet activated. Spurious event received: {:?}",
61                source
62            );
63        }
64    }
65
66    fn init(&mut self, ops: &mut EventOps) {
67        // This function can be called during different points in the device lifetime:
68        //  - shortly after device creation,
69        //  - on device activation (is-activated already true at this point),
70        //  - on device restore from snapshot.
71        if self.is_activated() {
72            warn!("Vhost-user block: unexpected init event");
73        } else {
74            self.register_activate_event(ops);
75        }
76    }
77}