@@ -15,7 +15,7 @@ use std::sync::{Arc, Mutex, MutexGuard, RwLock, RwLockReadGuard, RwLockWriteGuar
1515
1616use virtio_queue:: { Error as VirtQueError , Queue , QueueT } ;
1717use vm_memory:: { GuestAddress , GuestAddressSpace , GuestMemoryAtomic , GuestMemoryMmap } ;
18- use vmm_sys_util:: eventfd :: EventFd ;
18+ use vmm_sys_util:: event :: { EventConsumer , EventNotifier } ;
1919
2020/// Trait for objects returned by `VringT::get_ref()`.
2121pub trait VringStateGuard < ' a , M : GuestAddressSpace > {
@@ -109,9 +109,9 @@ pub trait VringT<M: GuestAddressSpace>:
109109/// object for single-threaded context.
110110pub struct VringState < M : GuestAddressSpace = GuestMemoryAtomic < GuestMemoryMmap > > {
111111 queue : Queue ,
112- kick : Option < EventFd > ,
113- call : Option < EventFd > ,
114- err : Option < EventFd > ,
112+ kick : Option < EventConsumer > ,
113+ call : Option < EventNotifier > ,
114+ err : Option < EventConsumer > ,
115115 enabled : bool ,
116116 mem : M ,
117117}
@@ -148,7 +148,7 @@ impl<M: GuestAddressSpace> VringState<M> {
148148 /// Notify the vhost-user frontend that used descriptors have been put into the used queue.
149149 pub fn signal_used_queue ( & self ) -> io:: Result < ( ) > {
150150 if let Some ( call) = self . call . as_ref ( ) {
151- call. write ( 1 )
151+ call. notify ( )
152152 } else {
153153 Ok ( ( ) )
154154 }
@@ -227,7 +227,7 @@ impl<M: GuestAddressSpace> VringState<M> {
227227 }
228228
229229 /// Get the `EventFd` for kick.
230- pub fn get_kick ( & self ) -> & Option < EventFd > {
230+ pub fn get_kick ( & self ) -> & Option < EventConsumer > {
231231 & self . kick
232232 }
233233
@@ -237,13 +237,13 @@ impl<M: GuestAddressSpace> VringState<M> {
237237 // EventFd requires that it has sole ownership of its fd. So does File, so this is safe.
238238 // Ideally, we'd have a generic way to refer to a uniquely-owned fd, such as that proposed
239239 // by Rust RFC #3128.
240- self . kick = file. map ( |f| unsafe { EventFd :: from_raw_fd ( f. into_raw_fd ( ) ) } ) ;
240+ self . kick = file. map ( |f| unsafe { EventConsumer :: from_raw_fd ( f. into_raw_fd ( ) ) } ) ;
241241 }
242242
243243 /// Read event from the kick `EventFd`.
244244 fn read_kick ( & self ) -> io:: Result < bool > {
245245 if let Some ( kick) = & self . kick {
246- kick. read ( ) ?;
246+ kick. consume ( ) ?;
247247 }
248248
249249 Ok ( self . enabled )
@@ -252,18 +252,18 @@ impl<M: GuestAddressSpace> VringState<M> {
252252 /// Set `EventFd` for call.
253253 fn set_call ( & mut self , file : Option < File > ) {
254254 // SAFETY: see comment in set_kick()
255- self . call = file. map ( |f| unsafe { EventFd :: from_raw_fd ( f. into_raw_fd ( ) ) } ) ;
255+ self . call = file. map ( |f| unsafe { EventNotifier :: from_raw_fd ( f. into_raw_fd ( ) ) } ) ;
256256 }
257257
258258 /// Get the `EventFd` for call.
259- pub fn get_call ( & self ) -> & Option < EventFd > {
259+ pub fn get_call ( & self ) -> & Option < EventNotifier > {
260260 & self . call
261261 }
262262
263263 /// Set `EventFd` for err.
264264 fn set_err ( & mut self , file : Option < File > ) {
265265 // SAFETY: see comment in set_kick()
266- self . err = file. map ( |f| unsafe { EventFd :: from_raw_fd ( f. into_raw_fd ( ) ) } ) ;
266+ self . err = file. map ( |f| unsafe { EventConsumer :: from_raw_fd ( f. into_raw_fd ( ) ) } ) ;
267267 }
268268}
269269
@@ -500,9 +500,8 @@ impl<M: 'static + GuestAddressSpace> VringT<M> for VringRwLock<M> {
500500#[ cfg( test) ]
501501mod tests {
502502 use super :: * ;
503- use std:: os:: unix:: io:: AsRawFd ;
504503 use vm_memory:: bitmap:: AtomicBitmap ;
505- use vmm_sys_util:: eventfd :: EventFd ;
504+ use vmm_sys_util:: event :: { new_event_consumer_and_notifier , EventFlag } ;
506505
507506 #[ test]
508507 fn test_new_vring ( ) {
@@ -549,37 +548,34 @@ mod tests {
549548 vring. set_enabled ( true ) ;
550549 assert ! ( vring. get_ref( ) . enabled) ;
551550
552- let eventfd = EventFd :: new ( 0 ) . unwrap ( ) ;
551+ let ( consumer , notifier ) = new_event_consumer_and_notifier ( EventFlag :: empty ( ) ) . unwrap ( ) ;
553552 // SAFETY: Safe because we panic before if eventfd is not valid.
554- let file = unsafe { File :: from_raw_fd ( eventfd . as_raw_fd ( ) ) } ;
553+ let file = unsafe { File :: from_raw_fd ( consumer . into_raw_fd ( ) ) } ;
555554 assert ! ( vring. get_mut( ) . kick. is_none( ) ) ;
556555 assert ! ( vring. read_kick( ) . unwrap( ) ) ;
557556 vring. set_kick ( Some ( file) ) ;
558- eventfd . write ( 1 ) . unwrap ( ) ;
557+ notifier . notify ( ) . unwrap ( ) ;
559558 assert ! ( vring. read_kick( ) . unwrap( ) ) ;
560559 assert ! ( vring. get_ref( ) . kick. is_some( ) ) ;
561560 vring. set_kick ( None ) ;
562561 assert ! ( vring. get_ref( ) . kick. is_none( ) ) ;
563- std:: mem:: forget ( eventfd) ;
564562
565- let eventfd = EventFd :: new ( 0 ) . unwrap ( ) ;
563+ let ( _consumer , notifier ) = new_event_consumer_and_notifier ( EventFlag :: empty ( ) ) . unwrap ( ) ;
566564 // SAFETY: Safe because we panic before if eventfd is not valid.
567- let file = unsafe { File :: from_raw_fd ( eventfd . as_raw_fd ( ) ) } ;
565+ let file = unsafe { File :: from_raw_fd ( notifier . into_raw_fd ( ) ) } ;
568566 assert ! ( vring. get_ref( ) . call. is_none( ) ) ;
569567 vring. set_call ( Some ( file) ) ;
570568 assert ! ( vring. get_ref( ) . call. is_some( ) ) ;
571569 vring. set_call ( None ) ;
572570 assert ! ( vring. get_ref( ) . call. is_none( ) ) ;
573- std:: mem:: forget ( eventfd) ;
574571
575- let eventfd = EventFd :: new ( 0 ) . unwrap ( ) ;
572+ let ( consumer , _notifier ) = new_event_consumer_and_notifier ( EventFlag :: empty ( ) ) . unwrap ( ) ;
576573 // SAFETY: Safe because we panic before if eventfd is not valid.
577- let file = unsafe { File :: from_raw_fd ( eventfd . as_raw_fd ( ) ) } ;
574+ let file = unsafe { File :: from_raw_fd ( consumer . into_raw_fd ( ) ) } ;
578575 assert ! ( vring. get_ref( ) . err. is_none( ) ) ;
579576 vring. set_err ( Some ( file) ) ;
580577 assert ! ( vring. get_ref( ) . err. is_some( ) ) ;
581578 vring. set_err ( None ) ;
582579 assert ! ( vring. get_ref( ) . err. is_none( ) ) ;
583- std:: mem:: forget ( eventfd) ;
584580 }
585581}
0 commit comments