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:
parent
f22c4af539
commit
6d5fccefc7
6 changed files with 44 additions and 57 deletions
|
|
@ -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"] }
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"coverage_score": 78.8,
|
||||
"coverage_score": 78.5,
|
||||
"exclude_path": "",
|
||||
"crate_features": ""
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 68d4dbf85c2ef54a440afa635d2f0db8635dcfb7
|
||||
Subproject commit 8901e7752288ae1061e2ee888a104c083a451668
|
||||
|
|
@ -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> {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue