epoll: use epoll wrapper from vmm-sys-util

There's a wrapper for epoll from vmm-sys-util, so use the wrapper
instead of the epoll crate directly. It may help to ease dependency
management.

Signed-off-by: Liu Jiang <gerry@linux.alibaba.com>
This commit is contained in:
Liu Jiang 2021-10-15 10:11:07 +08:00 committed by Jiang Liu
parent f22c4af539
commit 6d5fccefc7
6 changed files with 44 additions and 57 deletions

View file

@ -8,7 +8,6 @@ edition = "2018"
license = "Apache-2.0"
[dependencies]
epoll = ">=4.0.1"
libc = ">=0.2.39"
log = ">=0.4.6"
vhost = { version = "0.2", features = ["vhost-user-slave"] }

View file

@ -1,5 +1,5 @@
{
"coverage_score": 78.8,
"coverage_score": 78.5,
"exclude_path": "",
"crate_features": ""
}

@ -1 +1 @@
Subproject commit 68d4dbf85c2ef54a440afa635d2f0db8635dcfb7
Subproject commit 8901e7752288ae1061e2ee888a104c083a451668

View file

@ -26,6 +26,7 @@ use std::sync::{Arc, Mutex, RwLock};
use vhost::vhost_user::message::VhostUserProtocolFeatures;
use vhost::vhost_user::SlaveFsCacheReq;
use vm_memory::bitmap::Bitmap;
use vmm_sys_util::epoll::EventSet;
use vmm_sys_util::eventfd::EventFd;
use super::vring::VringT;
@ -111,7 +112,7 @@ where
fn handle_event(
&self,
device_event: u16,
evset: epoll::Events,
evset: EventSet,
vrings: &[V],
thread_id: usize,
) -> result::Result<bool, io::Error>;
@ -194,7 +195,7 @@ where
fn handle_event(
&mut self,
device_event: u16,
evset: epoll::Events,
evset: EventSet,
vrings: &[V],
thread_id: usize,
) -> result::Result<bool, io::Error>;
@ -256,7 +257,7 @@ where
fn handle_event(
&self,
device_event: u16,
evset: epoll::Events,
evset: EventSet,
vrings: &[V],
thread_id: usize,
) -> Result<bool, io::Error> {
@ -321,7 +322,7 @@ where
fn handle_event(
&self,
device_event: u16,
evset: epoll::Events,
evset: EventSet,
vrings: &[V],
thread_id: usize,
) -> Result<bool, io::Error> {
@ -387,7 +388,7 @@ where
fn handle_event(
&self,
device_event: u16,
evset: epoll::Events,
evset: EventSet,
vrings: &[V],
thread_id: usize,
) -> Result<bool, io::Error> {
@ -401,7 +402,6 @@ where
pub mod tests {
use super::*;
use crate::VringRwLock;
use epoll::Events;
use std::io::Error;
use std::sync::Mutex;
use vm_memory::{GuestMemoryAtomic, GuestMemoryMmap};
@ -484,7 +484,7 @@ pub mod tests {
fn handle_event(
&mut self,
_device_event: u16,
_evset: Events,
_evset: EventSet,
_vrings: &[VringRwLock],
_thread_id: usize,
) -> Result<bool, Error> {

View file

@ -4,13 +4,13 @@
// SPDX-License-Identifier: Apache-2.0
use std::fmt::{Display, Formatter};
use std::fs::File;
use std::io;
use std::marker::PhantomData;
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
use std::os::unix::io::{AsRawFd, RawFd};
use std::result;
use vm_memory::bitmap::Bitmap;
use vmm_sys_util::epoll::{ControlOperation, Epoll, EpollEvent, EventSet};
use vmm_sys_util::eventfd::EventFd;
use super::backend::VhostUserBackend;
@ -65,7 +65,7 @@ where
V: VringT<GM<B>>,
B: Bitmap + 'static,
{
epoll_file: File,
epoll: Epoll,
backend: S,
vrings: Vec<V>,
thread_id: usize,
@ -81,22 +81,21 @@ where
{
/// Create a `VringEpollHandler` instance.
pub(crate) fn new(backend: S, vrings: Vec<V>, thread_id: usize) -> VringEpollResult<Self> {
let epoll_fd = epoll::create(true).map_err(VringEpollError::EpollCreateFd)?;
let epoll_file = unsafe { File::from_raw_fd(epoll_fd) };
let epoll = Epoll::new().map_err(VringEpollError::EpollCreateFd)?;
let handler = match backend.exit_event(thread_id) {
Some(exit_event_fd) => {
let id = backend.num_queues();
epoll::ctl(
epoll_file.as_raw_fd(),
epoll::ControlOptions::EPOLL_CTL_ADD,
exit_event_fd.as_raw_fd(),
epoll::Event::new(epoll::Events::EPOLLIN, id as u64),
)
.map_err(VringEpollError::RegisterExitEvent)?;
epoll
.ctl(
ControlOperation::Add,
exit_event_fd.as_raw_fd(),
EpollEvent::new(EventSet::IN, id as u64),
)
.map_err(VringEpollError::RegisterExitEvent)?;
VringEpollHandler {
epoll_file,
epoll,
backend,
vrings,
thread_id,
@ -105,7 +104,7 @@ where
}
}
None => VringEpollHandler {
epoll_file,
epoll,
backend,
vrings,
thread_id,
@ -131,7 +130,7 @@ where
pub fn register_listener(
&self,
fd: RawFd,
ev_type: epoll::Events,
ev_type: EventSet,
data: u64,
) -> result::Result<(), io::Error> {
// `data` range [0...num_queues] is reserved for queues and exit event.
@ -149,7 +148,7 @@ where
pub fn unregister_listener(
&self,
fd: RawFd,
ev_type: epoll::Events,
ev_type: EventSet,
data: u64,
) -> result::Result<(), io::Error> {
// `data` range [0...num_queues] is reserved for queues and exit event.
@ -163,29 +162,21 @@ where
pub(crate) fn register_event(
&self,
fd: RawFd,
ev_type: epoll::Events,
ev_type: EventSet,
data: u64,
) -> result::Result<(), io::Error> {
epoll::ctl(
self.epoll_file.as_raw_fd(),
epoll::ControlOptions::EPOLL_CTL_ADD,
fd,
epoll::Event::new(ev_type, data),
)
self.epoll
.ctl(ControlOperation::Add, fd, EpollEvent::new(ev_type, data))
}
pub(crate) fn unregister_event(
&self,
fd: RawFd,
ev_type: epoll::Events,
ev_type: EventSet,
data: u64,
) -> result::Result<(), io::Error> {
epoll::ctl(
self.epoll_file.as_raw_fd(),
epoll::ControlOptions::EPOLL_CTL_DEL,
fd,
epoll::Event::new(ev_type, data),
)
self.epoll
.ctl(ControlOperation::Delete, fd, EpollEvent::new(ev_type, data))
}
/// Run the event poll loop to handle all pending events on registered fds.
@ -194,10 +185,10 @@ where
/// associated with the backend.
pub(crate) fn run(&self) -> VringEpollResult<()> {
const EPOLL_EVENTS_LEN: usize = 100;
let mut events = vec![epoll::Event::new(epoll::Events::empty(), 0); EPOLL_EVENTS_LEN];
let mut events = vec![EpollEvent::new(EventSet::empty(), 0); EPOLL_EVENTS_LEN];
'epoll: loop {
let num_events = match epoll::wait(self.epoll_file.as_raw_fd(), -1, &mut events[..]) {
let num_events = match self.epoll.wait(-1, &mut events[..]) {
Ok(res) => res,
Err(e) => {
if e.kind() == io::ErrorKind::Interrupted {
@ -215,7 +206,7 @@ where
};
for event in events.iter().take(num_events) {
let evset = match epoll::Events::from_bits(event.events) {
let evset = match EventSet::from_bits(event.events) {
Some(evset) => evset,
None => {
let evbits = event.events;
@ -224,7 +215,7 @@ where
}
};
let ev_type = event.data as u16;
let ev_type = event.data() as u16;
// handle_event() returns true if an event is received from the exit event fd.
if self.handle_event(ev_type, evset)? {
@ -236,7 +227,7 @@ where
Ok(())
}
fn handle_event(&self, device_event: u16, evset: epoll::Events) -> VringEpollResult<bool> {
fn handle_event(&self, device_event: u16, evset: EventSet) -> VringEpollResult<bool> {
if self.exit_event_fd.is_some() && device_event as usize == self.backend.num_queues() {
return Ok(true);
}
@ -280,27 +271,27 @@ mod tests {
let eventfd = EventFd::new(0).unwrap();
handler
.register_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 3)
.register_listener(eventfd.as_raw_fd(), EventSet::IN, 3)
.unwrap();
// Register an already registered fd.
handler
.register_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 3)
.register_listener(eventfd.as_raw_fd(), EventSet::IN, 3)
.unwrap_err();
// Register an invalid data.
handler
.register_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 1)
.register_listener(eventfd.as_raw_fd(), EventSet::IN, 1)
.unwrap_err();
handler
.unregister_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 3)
.unregister_listener(eventfd.as_raw_fd(), EventSet::IN, 3)
.unwrap();
// unregister an already unregistered fd.
handler
.unregister_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 3)
.unregister_listener(eventfd.as_raw_fd(), EventSet::IN, 3)
.unwrap_err();
// unregister an invalid data.
handler
.unregister_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 1)
.unregister_listener(eventfd.as_raw_fd(), EventSet::IN, 1)
.unwrap_err();
}
}

View file

@ -25,6 +25,7 @@ use vm_memory::mmap::NewBitmap;
use vm_memory::{
FileOffset, GuestAddress, GuestAddressSpace, GuestMemoryMmap, GuestRegionMmap, MmapRegion,
};
use vmm_sys_util::epoll::EventSet;
use super::backend::VhostUserBackend;
use super::event_loop::VringEpollHandler;
@ -196,7 +197,7 @@ where
if shifted_queues_mask & 1u64 == 1u64 {
let evt_idx = queues_mask.count_ones() - shifted_queues_mask.count_ones();
self.handlers[thread_index]
.register_event(fd.as_raw_fd(), epoll::Events::EPOLLIN, u64::from(evt_idx))
.register_event(fd.as_raw_fd(), EventSet::IN, u64::from(evt_idx))
.map_err(VhostUserError::ReqHandlerError)?;
break;
}
@ -382,11 +383,7 @@ where
if shifted_queues_mask & 1u64 == 1u64 {
let evt_idx = queues_mask.count_ones() - shifted_queues_mask.count_ones();
self.handlers[thread_index]
.unregister_event(
fd.as_raw_fd(),
epoll::Events::EPOLLIN,
u64::from(evt_idx),
)
.unregister_event(fd.as_raw_fd(), EventSet::IN, u64::from(evt_idx))
.map_err(VhostUserError::ReqHandlerError)?;
break;
}