@@ -636,23 +636,33 @@ impl VmFd {
636
636
/// .register_ioevent(&evtfd, &pio_addr, NoDatamatch)
637
637
/// .unwrap();
638
638
/// vm_fd
639
- /// .register_ioevent(&evtfd, &mmio_addr, NoDatamatch )
639
+ /// .register_ioevent(&evtfd, &mmio_addr, 0x1234u32 )
640
640
/// .unwrap();
641
641
/// vm_fd
642
- /// .unregister_ioevent(&evtfd, &pio_addr)
642
+ /// .unregister_ioevent(&evtfd, &pio_addr, NoDatamatch )
643
643
/// .unwrap();
644
644
/// vm_fd
645
- /// .unregister_ioevent(&evtfd, &mmio_addr)
645
+ /// .unregister_ioevent(&evtfd, &mmio_addr, 0x1234u32 )
646
646
/// .unwrap();
647
647
/// ```
648
648
///
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 < ( ) > {
650
655
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
+ }
651
659
if let IoEventAddress :: Pio ( _) = * addr {
652
660
flags |= 1 << kvm_ioeventfd_flag_nr_pio
653
661
}
654
662
655
663
let ioeventfd = kvm_ioeventfd {
664
+ datamatch : datamatch. into ( ) ,
665
+ len : std:: mem:: size_of :: < T > ( ) as u32 ,
656
666
addr : match addr {
657
667
IoEventAddress :: Pio ( ref p) => * p as u64 ,
658
668
IoEventAddress :: Mmio ( ref m) => * m,
@@ -1440,21 +1450,29 @@ mod tests {
1440
1450
let mmio_addr = IoEventAddress :: Mmio ( 0x1000 ) ;
1441
1451
1442
1452
// 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( ) ) ;
1445
1459
1446
1460
// Now register the addresses
1447
1461
assert ! ( vm_fd
1448
1462
. register_ioevent( & evtfd, & pio_addr, NoDatamatch )
1449
1463
. is_ok( ) ) ;
1450
1464
assert ! ( vm_fd
1451
- . register_ioevent( & evtfd, & mmio_addr, NoDatamatch )
1465
+ . register_ioevent( & evtfd, & mmio_addr, 0x1337u16 )
1452
1466
. is_ok( ) ) ;
1453
1467
1454
1468
// Try again unregistering the addresses. This time it should work
1455
1469
// 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( ) ) ;
1458
1476
}
1459
1477
1460
1478
#[ test]
0 commit comments