From 6d5fccefc7a62a0636c13e748e19434f79ebeb80 Mon Sep 17 00:00:00 2001 From: Liu Jiang Date: Fri, 15 Oct 2021 10:11:07 +0800 Subject: [PATCH] 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 --- Cargo.toml | 1 - coverage_config_x86_64.json | 2 +- rust-vmm-ci | 2 +- src/backend.rs | 14 +++---- src/event_loop.rs | 73 ++++++++++++++++--------------------- src/handler.rs | 9 ++--- 6 files changed, 44 insertions(+), 57 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 79b30cd..6bcff46 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] } diff --git a/coverage_config_x86_64.json b/coverage_config_x86_64.json index 3c3f96d..fe62685 100644 --- a/coverage_config_x86_64.json +++ b/coverage_config_x86_64.json @@ -1,5 +1,5 @@ { - "coverage_score": 78.8, + "coverage_score": 78.5, "exclude_path": "", "crate_features": "" } diff --git a/rust-vmm-ci b/rust-vmm-ci index 68d4dbf..8901e77 160000 --- a/rust-vmm-ci +++ b/rust-vmm-ci @@ -1 +1 @@ -Subproject commit 68d4dbf85c2ef54a440afa635d2f0db8635dcfb7 +Subproject commit 8901e7752288ae1061e2ee888a104c083a451668 diff --git a/src/backend.rs b/src/backend.rs index 6fb19dd..a2b7d23 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -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; @@ -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; @@ -256,7 +257,7 @@ where fn handle_event( &self, device_event: u16, - evset: epoll::Events, + evset: EventSet, vrings: &[V], thread_id: usize, ) -> Result { @@ -321,7 +322,7 @@ where fn handle_event( &self, device_event: u16, - evset: epoll::Events, + evset: EventSet, vrings: &[V], thread_id: usize, ) -> Result { @@ -387,7 +388,7 @@ where fn handle_event( &self, device_event: u16, - evset: epoll::Events, + evset: EventSet, vrings: &[V], thread_id: usize, ) -> Result { @@ -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 { diff --git a/src/event_loop.rs b/src/event_loop.rs index 6a70158..63e7883 100644 --- a/src/event_loop.rs +++ b/src/event_loop.rs @@ -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>, B: Bitmap + 'static, { - epoll_file: File, + epoll: Epoll, backend: S, vrings: Vec, thread_id: usize, @@ -81,22 +81,21 @@ where { /// Create a `VringEpollHandler` instance. pub(crate) fn new(backend: S, vrings: Vec, thread_id: usize) -> VringEpollResult { - 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 { + fn handle_event(&self, device_event: u16, evset: EventSet) -> VringEpollResult { 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(); } } diff --git a/src/handler.rs b/src/handler.rs index 5cba893..889e959 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -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; }