Skip to content

Commit 478864f

Browse files
committed
Expose VringPollEvent to replace mio::Interest
Signed-off-by: Wenyu Huang <huangwenyuu@outlook.com>
1 parent e489d2b commit 478864f

File tree

3 files changed

+72
-15
lines changed

3 files changed

+72
-15
lines changed

vhost-user-backend/src/event_loop.rs

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use vmm_sys_util::eventfd::EventFd;
1717

1818
use super::backend::VhostUserBackend;
1919
use super::vring::VringT;
20+
use bitflags::bitflags;
2021

2122
/// Errors related to vring epoll event handling.
2223
#[derive(Debug)]
@@ -57,6 +58,44 @@ impl std::error::Error for VringPollError {}
5758
/// Result of vring epoll operations.
5859
pub type VringEpollResult<T> = std::result::Result<T, VringPollError>;
5960

61+
bitflags! {
62+
#[derive(Debug, PartialEq, PartialOrd)]
63+
pub struct VringPollEvent: u32 {
64+
const READABLE = 1u32;
65+
const WRITABLE = 2u32;
66+
}
67+
}
68+
69+
impl From<Interest> for VringPollEvent {
70+
fn from(value: Interest) -> Self {
71+
let mut event = VringPollEvent::empty();
72+
if value.is_readable() {
73+
event |= VringPollEvent::READABLE;
74+
}
75+
if value.is_writable() {
76+
event |= VringPollEvent::WRITABLE;
77+
}
78+
return event;
79+
}
80+
}
81+
82+
impl From<VringPollEvent> for Interest {
83+
fn from(value: VringPollEvent) -> Self {
84+
let mut interest = None;
85+
if value == VringPollEvent::READABLE {
86+
interest = interest
87+
.map(|interest| Interest::READABLE | interest)
88+
.or(Some(Interest::READABLE));
89+
}
90+
if value == VringPollEvent::WRITABLE {
91+
interest = interest
92+
.map(|interest| Interest::WRITABLE | interest)
93+
.or(Some(Interest::WRITABLE));
94+
}
95+
return interest.expect("Interest is invalid");
96+
}
97+
}
98+
6099
// According https://github.com/tokio-rs/mio/blob/cd972977e7a8234e62c7ba8bd4d4ec1da208e576/src/interest.rs#L27
61100
// the function is implemented to convert Event into Interest
62101
fn convert_event_to_interest(value: &Event) -> Option<Interest> {
@@ -175,7 +214,7 @@ where
175214
///
176215
/// When this event is later triggered, the backend implementation of `handle_event` will be
177216
/// called.
178-
pub fn register_listener(&self, fd: RawFd, ev_type: Interest, data: u64) -> Result<()> {
217+
pub fn register_listener(&self, fd: RawFd, ev_type: VringPollEvent, data: u64) -> Result<()> {
179218
// `data` range [0...num_queues] is reserved for queues and exit event.
180219
if data <= self.backend.num_queues() as u64 {
181220
Err(io::Error::from_raw_os_error(libc::EINVAL))
@@ -188,7 +227,7 @@ where
188227
///
189228
/// If the event is triggered after this function has been called, the event will be silently
190229
/// dropped.
191-
pub fn unregister_listener(&self, fd: RawFd, ev_type: Interest, data: u64) -> Result<()> {
230+
pub fn unregister_listener(&self, fd: RawFd, ev_type: VringPollEvent, data: u64) -> Result<()> {
192231
// `data` range [0...num_queues] is reserved for queues and exit event.
193232
if data <= self.backend.num_queues() as u64 {
194233
Err(io::Error::from_raw_os_error(libc::EINVAL))
@@ -197,19 +236,29 @@ where
197236
}
198237
}
199238

200-
pub(crate) fn register_event(&self, fd: RawFd, ev_type: Interest, data: u64) -> Result<()> {
239+
pub(crate) fn register_event(
240+
&self,
241+
fd: RawFd,
242+
ev_type: VringPollEvent,
243+
data: u64,
244+
) -> Result<()> {
201245
let mut fd_set = self.fd_set.lock().unwrap();
202246
if fd_set.contains(&fd) {
203247
return Err(io::Error::from_raw_os_error(libc::EEXIST));
204248
}
205249
self.registry
206-
.register(&mut SourceFd(&fd), Token(data as usize), ev_type)
250+
.register(&mut SourceFd(&fd), Token(data as usize), ev_type.into())
207251
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
208252
fd_set.insert(fd);
209253
Ok(())
210254
}
211255

212-
pub(crate) fn unregister_event(&self, fd: RawFd, _ev_type: Interest, _data: u64) -> Result<()> {
256+
pub(crate) fn unregister_event(
257+
&self,
258+
fd: RawFd,
259+
_ev_type: VringPollEvent,
260+
_data: u64,
261+
) -> Result<()> {
213262
let mut fd_set = self.fd_set.lock().unwrap();
214263
if !fd_set.contains(&fd) {
215264
return Err(io::Error::from_raw_os_error(libc::ENOENT));
@@ -306,27 +355,27 @@ mod tests {
306355

307356
let eventfd = EventFd::new(0).unwrap();
308357
handler
309-
.register_listener(eventfd.as_raw_fd(), Interest::READABLE, 3)
358+
.register_listener(eventfd.as_raw_fd(), VringPollEvent::READABLE, 3)
310359
.unwrap();
311360
// Register an already registered fd.
312361
handler
313-
.register_listener(eventfd.as_raw_fd(), Interest::READABLE, 3)
362+
.register_listener(eventfd.as_raw_fd(), VringPollEvent::READABLE, 3)
314363
.unwrap_err();
315364
// Register an invalid data.
316365
handler
317-
.register_listener(eventfd.as_raw_fd(), Interest::READABLE, 1)
366+
.register_listener(eventfd.as_raw_fd(), VringPollEvent::READABLE, 1)
318367
.unwrap_err();
319368

320369
handler
321-
.unregister_listener(eventfd.as_raw_fd(), Interest::READABLE, 3)
370+
.unregister_listener(eventfd.as_raw_fd(), VringPollEvent::READABLE, 3)
322371
.unwrap();
323372
// unregister an already unregistered fd.
324373
handler
325-
.unregister_listener(eventfd.as_raw_fd(), Interest::READABLE, 3)
374+
.unregister_listener(eventfd.as_raw_fd(), VringPollEvent::READABLE, 3)
326375
.unwrap_err();
327376
// unregister an invalid data.
328377
handler
329-
.unregister_listener(eventfd.as_raw_fd(), Interest::READABLE, 1)
378+
.unregister_listener(eventfd.as_raw_fd(), VringPollEvent::READABLE, 1)
330379
.unwrap_err();
331380
// Check we retrieve the correct file descriptor
332381
assert_eq!(

vhost-user-backend/src/handler.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use std::sync::Arc;
1414
use std::thread;
1515

1616
use crate::bitmap::{BitmapReplace, MemRegionBitmap, MmapLogReg};
17-
use mio::Interest;
17+
use crate::event_loop::VringPollEvent;
1818
#[cfg(feature = "postcopy")]
1919
use userfaultfd::{Uffd, UffdBuilder};
2020
use vhost::vhost_user::message::{
@@ -212,7 +212,11 @@ where
212212
if shifted_queues_mask & 1u64 == 1u64 {
213213
let evt_idx = queues_mask.count_ones() - shifted_queues_mask.count_ones();
214214
self.handlers[thread_index]
215-
.register_event(fd.as_raw_fd(), Interest::READABLE, u64::from(evt_idx))
215+
.register_event(
216+
fd.as_raw_fd(),
217+
VringPollEvent::READABLE,
218+
u64::from(evt_idx),
219+
)
216220
.map_err(VhostUserError::ReqHandlerError)?;
217221
break;
218222
}
@@ -436,7 +440,11 @@ where
436440
if shifted_queues_mask & 1u64 == 1u64 {
437441
let evt_idx = queues_mask.count_ones() - shifted_queues_mask.count_ones();
438442
self.handlers[thread_index]
439-
.unregister_event(fd.as_raw_fd(), Interest::READABLE, u64::from(evt_idx))
443+
.unregister_event(
444+
fd.as_raw_fd(),
445+
VringPollEvent::READABLE,
446+
u64::from(evt_idx),
447+
)
440448
.map_err(VhostUserError::ReqHandlerError)?;
441449
break;
442450
}

vhost-user-backend/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ mod backend;
2323
pub use self::backend::{VhostUserBackend, VhostUserBackendMut};
2424

2525
mod event_loop;
26-
pub use self::event_loop::VringEpollHandler;
26+
pub use self::event_loop::{VringEpollHandler, VringPollEvent};
2727

2828
mod handler;
2929
pub use self::handler::VhostUserHandlerError;

0 commit comments

Comments
 (0)