vmm: interrupt: generify KvmRoutingEntry and KvmMsiInterruptGroup

The observation is that only the route field is hypervisor specific.

Provide a new function in blanket implementation. Also redefine
KvmRoutingEntry with RoutingEntry to avoid code churn.

Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
Wei Liu 2020-06-27 15:22:24 +00:00 committed by Rob Bradford
parent 637f58bcd9
commit d5149e95cb

View File

@ -103,30 +103,36 @@ impl InterruptRoute {
} }
} }
struct KvmRoutingEntry { struct RoutingEntry<E> {
kvm_route: kvm_irq_routing_entry, route: E,
masked: bool, masked: bool,
} }
struct KvmMsiInterruptGroup { type KvmRoutingEntry = RoutingEntry<kvm_irq_routing_entry>;
struct MsiInterruptGroup<E> {
vm_fd: Arc<dyn hypervisor::Vm>, vm_fd: Arc<dyn hypervisor::Vm>,
gsi_msi_routes: Arc<Mutex<HashMap<u32, KvmRoutingEntry>>>, gsi_msi_routes: Arc<Mutex<HashMap<u32, RoutingEntry<E>>>>,
irq_routes: HashMap<InterruptIndex, InterruptRoute>, irq_routes: HashMap<InterruptIndex, InterruptRoute>,
} }
impl KvmMsiInterruptGroup { impl<E> MsiInterruptGroup<E> {
fn new( fn new(
vm_fd: Arc<dyn hypervisor::Vm>, vm_fd: Arc<dyn hypervisor::Vm>,
gsi_msi_routes: Arc<Mutex<HashMap<u32, KvmRoutingEntry>>>, gsi_msi_routes: Arc<Mutex<HashMap<u32, RoutingEntry<E>>>>,
irq_routes: HashMap<InterruptIndex, InterruptRoute>, irq_routes: HashMap<InterruptIndex, InterruptRoute>,
) -> Self { ) -> Self {
KvmMsiInterruptGroup { MsiInterruptGroup {
vm_fd, vm_fd,
gsi_msi_routes, gsi_msi_routes,
irq_routes, irq_routes,
} }
} }
}
type KvmMsiInterruptGroup = MsiInterruptGroup<kvm_irq_routing_entry>;
impl KvmMsiInterruptGroup {
fn set_kvm_gsi_routes(&self) -> Result<()> { fn set_kvm_gsi_routes(&self) -> Result<()> {
let gsi_msi_routes = self.gsi_msi_routes.lock().unwrap(); let gsi_msi_routes = self.gsi_msi_routes.lock().unwrap();
let mut entry_vec: Vec<kvm_irq_routing_entry> = Vec::new(); let mut entry_vec: Vec<kvm_irq_routing_entry> = Vec::new();
@ -135,7 +141,7 @@ impl KvmMsiInterruptGroup {
continue; continue;
} }
entry_vec.push(entry.kvm_route); entry_vec.push(entry.route);
} }
let mut irq_routing = let mut irq_routing =
@ -229,7 +235,7 @@ impl InterruptSourceGroup for KvmMsiInterruptGroup {
kvm_route.u.msi.data = cfg.data; kvm_route.u.msi.data = cfg.data;
let kvm_entry = KvmRoutingEntry { let kvm_entry = KvmRoutingEntry {
kvm_route, route: kvm_route,
masked: false, masked: false,
}; };