@@ -636,23 +636,33 @@ impl VmFd {
636636 /// .register_ioevent(&evtfd, &pio_addr, NoDatamatch)
637637 /// .unwrap();
638638 /// vm_fd
639- /// .register_ioevent(&evtfd, &mmio_addr, NoDatamatch )
639+ /// .register_ioevent(&evtfd, &mmio_addr, 0x1234u32 )
640640 /// .unwrap();
641641 /// vm_fd
642- /// .unregister_ioevent(&evtfd, &pio_addr)
642+ /// .unregister_ioevent(&evtfd, &pio_addr, NoDatamatch )
643643 /// .unwrap();
644644 /// vm_fd
645- /// .unregister_ioevent(&evtfd, &mmio_addr)
645+ /// .unregister_ioevent(&evtfd, &mmio_addr, 0x1234u32 )
646646 /// .unwrap();
647647 /// ```
648648 ///
649- pub fn unregister_ioevent ( & self , fd : & EventFd , addr : & IoEventAddress ) -> Result < ( ) > {
649+ pub fn unregister_ioevent < T : Into < u64 > > (
650+ & self ,
651+ fd : & EventFd ,
652+ addr : & IoEventAddress ,
653+ datamatch : T ,
654+ ) -> Result < ( ) > {
650655 let mut flags = 1 << kvm_ioeventfd_flag_nr_deassign;
656+ if std:: mem:: size_of :: < T > ( ) > 0 {
657+ flags |= 1 << kvm_ioeventfd_flag_nr_datamatch
658+ }
651659 if let IoEventAddress :: Pio ( _) = * addr {
652660 flags |= 1 << kvm_ioeventfd_flag_nr_pio
653661 }
654662
655663 let ioeventfd = kvm_ioeventfd {
664+ datamatch : datamatch. into ( ) ,
665+ len : std:: mem:: size_of :: < T > ( ) as u32 ,
656666 addr : match addr {
657667 IoEventAddress :: Pio ( ref p) => * p as u64 ,
658668 IoEventAddress :: Mmio ( ref m) => * m,
@@ -1440,21 +1450,29 @@ mod tests {
14401450 let mmio_addr = IoEventAddress :: Mmio ( 0x1000 ) ;
14411451
14421452 // First try to unregister addresses which have not been registered.
1443- assert ! ( vm_fd. unregister_ioevent( & evtfd, & pio_addr) . is_err( ) ) ;
1444- assert ! ( vm_fd. unregister_ioevent( & evtfd, & mmio_addr) . is_err( ) ) ;
1453+ assert ! ( vm_fd
1454+ . unregister_ioevent( & evtfd, & pio_addr, NoDatamatch )
1455+ . is_err( ) ) ;
1456+ assert ! ( vm_fd
1457+ . unregister_ioevent( & evtfd, & mmio_addr, NoDatamatch )
1458+ . is_err( ) ) ;
14451459
14461460 // Now register the addresses
14471461 assert ! ( vm_fd
14481462 . register_ioevent( & evtfd, & pio_addr, NoDatamatch )
14491463 . is_ok( ) ) ;
14501464 assert ! ( vm_fd
1451- . register_ioevent( & evtfd, & mmio_addr, NoDatamatch )
1465+ . register_ioevent( & evtfd, & mmio_addr, 0x1337u16 )
14521466 . is_ok( ) ) ;
14531467
14541468 // Try again unregistering the addresses. This time it should work
14551469 // since they have been previously registered.
1456- assert ! ( vm_fd. unregister_ioevent( & evtfd, & pio_addr) . is_ok( ) ) ;
1457- assert ! ( vm_fd. unregister_ioevent( & evtfd, & mmio_addr) . is_ok( ) ) ;
1470+ assert ! ( vm_fd
1471+ . unregister_ioevent( & evtfd, & pio_addr, NoDatamatch )
1472+ . is_ok( ) ) ;
1473+ assert ! ( vm_fd
1474+ . unregister_ioevent( & evtfd, & mmio_addr, 0x1337u16 )
1475+ . is_ok( ) ) ;
14581476 }
14591477
14601478 #[ test]
0 commit comments