@@ -15,7 +15,7 @@ use std::sync::{Arc, Mutex, MutexGuard, RwLock, RwLockReadGuard, RwLockWriteGuar
15
15
16
16
use virtio_queue:: { Error as VirtQueError , Queue , QueueT } ;
17
17
use vm_memory:: { GuestAddress , GuestAddressSpace , GuestMemoryAtomic , GuestMemoryMmap } ;
18
- use vmm_sys_util:: eventfd :: EventFd ;
18
+ use vmm_sys_util:: event :: { EventConsumer , EventNotifier } ;
19
19
20
20
/// Trait for objects returned by `VringT::get_ref()`.
21
21
pub trait VringStateGuard < ' a , M : GuestAddressSpace > {
@@ -109,9 +109,9 @@ pub trait VringT<M: GuestAddressSpace>:
109
109
/// object for single-threaded context.
110
110
pub struct VringState < M : GuestAddressSpace = GuestMemoryAtomic < GuestMemoryMmap > > {
111
111
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 > ,
115
115
enabled : bool ,
116
116
mem : M ,
117
117
}
@@ -148,7 +148,7 @@ impl<M: GuestAddressSpace> VringState<M> {
148
148
/// Notify the vhost-user frontend that used descriptors have been put into the used queue.
149
149
pub fn signal_used_queue ( & self ) -> io:: Result < ( ) > {
150
150
if let Some ( call) = self . call . as_ref ( ) {
151
- call. write ( 1 )
151
+ call. notify ( )
152
152
} else {
153
153
Ok ( ( ) )
154
154
}
@@ -227,7 +227,7 @@ impl<M: GuestAddressSpace> VringState<M> {
227
227
}
228
228
229
229
/// Get the `EventFd` for kick.
230
- pub fn get_kick ( & self ) -> & Option < EventFd > {
230
+ pub fn get_kick ( & self ) -> & Option < EventConsumer > {
231
231
& self . kick
232
232
}
233
233
@@ -237,13 +237,13 @@ impl<M: GuestAddressSpace> VringState<M> {
237
237
// EventFd requires that it has sole ownership of its fd. So does File, so this is safe.
238
238
// Ideally, we'd have a generic way to refer to a uniquely-owned fd, such as that proposed
239
239
// 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 ( ) ) } ) ;
241
241
}
242
242
243
243
/// Read event from the kick `EventFd`.
244
244
fn read_kick ( & self ) -> io:: Result < bool > {
245
245
if let Some ( kick) = & self . kick {
246
- kick. read ( ) ?;
246
+ kick. consume ( ) ?;
247
247
}
248
248
249
249
Ok ( self . enabled )
@@ -252,18 +252,18 @@ impl<M: GuestAddressSpace> VringState<M> {
252
252
/// Set `EventFd` for call.
253
253
fn set_call ( & mut self , file : Option < File > ) {
254
254
// 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 ( ) ) } ) ;
256
256
}
257
257
258
258
/// Get the `EventFd` for call.
259
- pub fn get_call ( & self ) -> & Option < EventFd > {
259
+ pub fn get_call ( & self ) -> & Option < EventNotifier > {
260
260
& self . call
261
261
}
262
262
263
263
/// Set `EventFd` for err.
264
264
fn set_err ( & mut self , file : Option < File > ) {
265
265
// 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 ( ) ) } ) ;
267
267
}
268
268
}
269
269
@@ -500,9 +500,8 @@ impl<M: 'static + GuestAddressSpace> VringT<M> for VringRwLock<M> {
500
500
#[ cfg( test) ]
501
501
mod tests {
502
502
use super :: * ;
503
- use std:: os:: unix:: io:: AsRawFd ;
504
503
use vm_memory:: bitmap:: AtomicBitmap ;
505
- use vmm_sys_util:: eventfd :: EventFd ;
504
+ use vmm_sys_util:: event :: { new_event_consumer_and_notifier , EventFlag } ;
506
505
507
506
#[ test]
508
507
fn test_new_vring ( ) {
@@ -549,37 +548,34 @@ mod tests {
549
548
vring. set_enabled ( true ) ;
550
549
assert ! ( vring. get_ref( ) . enabled) ;
551
550
552
- let eventfd = EventFd :: new ( 0 ) . unwrap ( ) ;
551
+ let ( consumer , notifier ) = new_event_consumer_and_notifier ( EventFlag :: empty ( ) ) . unwrap ( ) ;
553
552
// 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 ( ) ) } ;
555
554
assert ! ( vring. get_mut( ) . kick. is_none( ) ) ;
556
555
assert ! ( vring. read_kick( ) . unwrap( ) ) ;
557
556
vring. set_kick ( Some ( file) ) ;
558
- eventfd . write ( 1 ) . unwrap ( ) ;
557
+ notifier . notify ( ) . unwrap ( ) ;
559
558
assert ! ( vring. read_kick( ) . unwrap( ) ) ;
560
559
assert ! ( vring. get_ref( ) . kick. is_some( ) ) ;
561
560
vring. set_kick ( None ) ;
562
561
assert ! ( vring. get_ref( ) . kick. is_none( ) ) ;
563
- std:: mem:: forget ( eventfd) ;
564
562
565
- let eventfd = EventFd :: new ( 0 ) . unwrap ( ) ;
563
+ let ( _consumer , notifier ) = new_event_consumer_and_notifier ( EventFlag :: empty ( ) ) . unwrap ( ) ;
566
564
// 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 ( ) ) } ;
568
566
assert ! ( vring. get_ref( ) . call. is_none( ) ) ;
569
567
vring. set_call ( Some ( file) ) ;
570
568
assert ! ( vring. get_ref( ) . call. is_some( ) ) ;
571
569
vring. set_call ( None ) ;
572
570
assert ! ( vring. get_ref( ) . call. is_none( ) ) ;
573
- std:: mem:: forget ( eventfd) ;
574
571
575
- let eventfd = EventFd :: new ( 0 ) . unwrap ( ) ;
572
+ let ( consumer , _notifier ) = new_event_consumer_and_notifier ( EventFlag :: empty ( ) ) . unwrap ( ) ;
576
573
// 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 ( ) ) } ;
578
575
assert ! ( vring. get_ref( ) . err. is_none( ) ) ;
579
576
vring. set_err ( Some ( file) ) ;
580
577
assert ! ( vring. get_ref( ) . err. is_some( ) ) ;
581
578
vring. set_err ( None ) ;
582
579
assert ! ( vring. get_ref( ) . err. is_none( ) ) ;
583
- std:: mem:: forget ( eventfd) ;
584
580
}
585
581
}
0 commit comments