Skip to content

Commit ef7aba8

Browse files
Jason Cai (Xiang Feng)acatangiu
authored andcommitted
Support datamatch when unregister ioevent
Whe unregistering an ioevent, the `datamatch` field should be set correctly, otherwise it may unregister undesired ioevent. Signed-off-by: Jason Cai (Xiang Feng) <[email protected]> Signed-off-by: Liu Jiang <[email protected]>
1 parent 55b9481 commit ef7aba8

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

coverage_config_x86_64.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"coverage_score": 91.3,
2+
"coverage_score": 91.4,
33
"exclude_path": "",
44
"crate_features": ""
55
}

src/ioctls/vm.rs

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)