vmm/devices/virtio/block/vhost_user/
event_handler.rs1use 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 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 if self.is_activated() {
72 warn!("Vhost-user block: unexpected init event");
73 } else {
74 self.register_activate_event(ops);
75 }
76 }
77}