@@ -17,6 +17,7 @@ use vmm_sys_util::eventfd::EventFd;
1717
1818use super :: backend:: VhostUserBackend ;
1919use 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.
5859pub 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
62101fn 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 ! (
0 commit comments