diff options
author | Keir Fraser <keir@xensource.com> | 2007-10-29 09:16:59 +0000 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-10-29 09:16:59 +0000 |
commit | 20e7b4098f625f874158b0e166f2f9db9d043c5a (patch) | |
tree | 22210fd0eea49a515ddca9894b7e079a5441b777 /xen/arch/x86/hvm/irq.c | |
parent | 5ef7bed4e4c757d0729f81c4a5140c41745897ab (diff) | |
download | xen-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.c | 12 |
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; |