(&mut self, eventfd: Option<EventFd>, vm: &dyn hypervisor::Vm)
| 129 | // warning. |
| 130 | #[allow(dead_code)] |
| 131 | fn set_notifier(&mut self, eventfd: Option<EventFd>, vm: &dyn hypervisor::Vm) -> Result<()> { |
| 132 | let old_irqfd = core::mem::replace(&mut self.irq_fd, eventfd); |
| 133 | if self.registered { |
| 134 | // A registered route must have a GSI allocated, since enable() |
| 135 | // only sets registered=true after using a valid GSI. |
| 136 | let gsi = self.gsi.expect("registered route has no GSI allocated"); |
| 137 | if let Some(ref irq_fd) = self.irq_fd { |
| 138 | vm.register_irqfd(irq_fd, gsi) |
| 139 | .map_err(|e| io::Error::other(format!("Failed registering irq_fd: {e}")))?; |
| 140 | } |
| 141 | // If the irqfd cannot be unregistered, what to do? Spin? |
| 142 | // Returning an error isn't helpful as the new irqfd is already registered. |
| 143 | if let Some(old_irq_fd) = old_irqfd { |
| 144 | match vm.unregister_irqfd(&old_irq_fd, gsi) { |
| 145 | Ok(()) => {} |
| 146 | Err(e) => log::warn!("Failed unregistering old irqfd: {e}"), |
| 147 | } |
| 148 | } |
| 149 | } |
| 150 | Ok(()) |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | impl Drop for InterruptRoute { |
nothing calls this directly
no test coverage detected