Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
niting committed May 27, 2020
2 parents 8fb16f8 + ef7aba8 commit 78f8110
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 10 deletions.
2 changes: 1 addition & 1 deletion coverage_config_x86_64.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"coverage_score": 91.3,
"coverage_score": 91.4,
"exclude_path": "",
"crate_features": ""
}
36 changes: 27 additions & 9 deletions src/ioctls/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -636,23 +636,33 @@ impl VmFd {
/// .register_ioevent(&evtfd, &pio_addr, NoDatamatch)
/// .unwrap();
/// vm_fd
/// .register_ioevent(&evtfd, &mmio_addr, NoDatamatch)
/// .register_ioevent(&evtfd, &mmio_addr, 0x1234u32)
/// .unwrap();
/// vm_fd
/// .unregister_ioevent(&evtfd, &pio_addr)
/// .unregister_ioevent(&evtfd, &pio_addr, NoDatamatch)
/// .unwrap();
/// vm_fd
/// .unregister_ioevent(&evtfd, &mmio_addr)
/// .unregister_ioevent(&evtfd, &mmio_addr, 0x1234u32)
/// .unwrap();
/// ```
///
pub fn unregister_ioevent(&self, fd: &EventFd, addr: &IoEventAddress) -> Result<()> {
pub fn unregister_ioevent<T: Into<u64>>(
&self,
fd: &EventFd,
addr: &IoEventAddress,
datamatch: T,
) -> Result<()> {
let mut flags = 1 << kvm_ioeventfd_flag_nr_deassign;
if std::mem::size_of::<T>() > 0 {
flags |= 1 << kvm_ioeventfd_flag_nr_datamatch
}
if let IoEventAddress::Pio(_) = *addr {
flags |= 1 << kvm_ioeventfd_flag_nr_pio
}

let ioeventfd = kvm_ioeventfd {
datamatch: datamatch.into(),
len: std::mem::size_of::<T>() as u32,
addr: match addr {
IoEventAddress::Pio(ref p) => *p as u64,
IoEventAddress::Mmio(ref m) => *m,
Expand Down Expand Up @@ -1440,21 +1450,29 @@ mod tests {
let mmio_addr = IoEventAddress::Mmio(0x1000);

// First try to unregister addresses which have not been registered.
assert!(vm_fd.unregister_ioevent(&evtfd, &pio_addr).is_err());
assert!(vm_fd.unregister_ioevent(&evtfd, &mmio_addr).is_err());
assert!(vm_fd
.unregister_ioevent(&evtfd, &pio_addr, NoDatamatch)
.is_err());
assert!(vm_fd
.unregister_ioevent(&evtfd, &mmio_addr, NoDatamatch)
.is_err());

// Now register the addresses
assert!(vm_fd
.register_ioevent(&evtfd, &pio_addr, NoDatamatch)
.is_ok());
assert!(vm_fd
.register_ioevent(&evtfd, &mmio_addr, NoDatamatch)
.register_ioevent(&evtfd, &mmio_addr, 0x1337u16)
.is_ok());

// Try again unregistering the addresses. This time it should work
// since they have been previously registered.
assert!(vm_fd.unregister_ioevent(&evtfd, &pio_addr).is_ok());
assert!(vm_fd.unregister_ioevent(&evtfd, &mmio_addr).is_ok());
assert!(vm_fd
.unregister_ioevent(&evtfd, &pio_addr, NoDatamatch)
.is_ok());
assert!(vm_fd
.unregister_ioevent(&evtfd, &mmio_addr, 0x1337u16)
.is_ok());
}

#[test]
Expand Down

0 comments on commit 78f8110

Please sign in to comment.