aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/irq.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-10-29 09:16:59 +0000
committerKeir Fraser <keir@xensource.com>2007-10-29 09:16:59 +0000
commit20e7b4098f625f874158b0e166f2f9db9d043c5a (patch)
tree22210fd0eea49a515ddca9894b7e079a5441b777 /xen/arch/x86/hvm/irq.c
parent5ef7bed4e4c757d0729f81c4a5140c41745897ab (diff)
downloadxen-20e7b4098f625f874158b0e166f2f9db9d043c5a.tar.gz
xen-20e7b4098f625f874158b0e166f2f9db9d043c5a.tar.bz2
xen-20e7b4098f625f874158b0e166f2f9db9d043c5a.zip
x86, vt-d: Move out isa irq mapping from hvm_do_IRQ_dpci()
Setting isa irq mapping in hvm_do_IRQ_dpci() costs time when each interrupt occurs, and it doesn't update isa irq mapping when pci_link is updated. Signed-off-by: Weidong Han <weidong.han@intel.com> Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/arch/x86/hvm/irq.c')
-rw-r--r--xen/arch/x86/hvm/irq.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
index c19d23724e..9d1d2d7e49 100644
--- a/xen/arch/x86/hvm/irq.c
+++ b/xen/arch/x86/hvm/irq.c
@@ -191,6 +191,18 @@ void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq)
goto out;
hvm_irq->pci_link.route[link] = isa_irq;
+ /* PCI pass-through fixup. */
+ if ( hvm_irq->dpci && hvm_irq->dpci->girq[old_isa_irq].valid )
+ {
+ uint32_t device = hvm_irq->dpci->girq[old_isa_irq].device;
+ uint32_t intx = hvm_irq->dpci->girq[old_isa_irq].intx;
+ if ( link == hvm_pci_intx_link(device, intx) )
+ {
+ hvm_irq->dpci->girq[isa_irq] = hvm_irq->dpci->girq[old_isa_irq];
+ hvm_irq->dpci->girq[old_isa_irq].valid = 0;
+ }
+ }
+
if ( hvm_irq->pci_link_assert_count[link] == 0 )
goto out;