# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1264521150 0
# Node ID cb0375fcec23ea188511c130feaee0c18b352968
# Parent efeef2c5e96da54775f73a069e6215a259ac0923
x86: Revert Cset 20334:dcc5d5d954e9
Recording old MSI info doesn't solve all the corner cases
when guest's irq migration occurs.
Signed-off-by : Xiantao Zhang <xiantao.zhang@xxxxxxxxx>
---
xen/arch/x86/hvm/vmsi.c | 10 ++--------
xen/drivers/passthrough/io.c | 24 +++++-------------------
xen/include/xen/hvm/irq.h | 4 +---
3 files changed, 8 insertions(+), 30 deletions(-)
diff -r efeef2c5e96d -r cb0375fcec23 xen/arch/x86/hvm/vmsi.c
--- a/xen/arch/x86/hvm/vmsi.c Tue Jan 26 15:51:53 2010 +0000
+++ b/xen/arch/x86/hvm/vmsi.c Tue Jan 26 15:52:30 2010 +0000
@@ -92,11 +92,8 @@ int vmsi_deliver(struct domain *d, int p
case dest_LowestPrio:
{
target = vlapic_lowest_prio(d, NULL, 0, dest, dest_mode);
- if ( target != NULL ) {
+ if ( target != NULL )
vmsi_inj_irq(d, target, vector, trig_mode, delivery_mode);
- hvm_irq_dpci->mirq[pirq].gmsi.old_gvec =
- hvm_irq_dpci->mirq[pirq].gmsi.gvec;
- }
else
HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "null round robin: "
"vector=%x delivery_mode=%x\n",
@@ -109,12 +106,9 @@ int vmsi_deliver(struct domain *d, int p
{
for_each_vcpu ( d, v )
if ( vlapic_match_dest(vcpu_vlapic(v), NULL,
- 0, dest, dest_mode) ) {
+ 0, dest, dest_mode) )
vmsi_inj_irq(d, vcpu_vlapic(v),
vector, trig_mode, delivery_mode);
- hvm_irq_dpci->mirq[pirq].gmsi.old_gvec =
- hvm_irq_dpci->mirq[pirq].gmsi.gvec;
- }
break;
}
diff -r efeef2c5e96d -r cb0375fcec23 xen/drivers/passthrough/io.c
--- a/xen/drivers/passthrough/io.c Tue Jan 26 15:51:53 2010 +0000
+++ b/xen/drivers/passthrough/io.c Tue Jan 26 15:52:30 2010 +0000
@@ -164,9 +164,7 @@ int pt_irq_create_bind_vtd(
{
hvm_irq_dpci->mirq[pirq].flags = HVM_IRQ_DPCI_MACH_MSI |
HVM_IRQ_DPCI_GUEST_MSI;
- hvm_irq_dpci->mirq[pirq].gmsi.old_gvec = pt_irq_bind->u.msi.gvec;
hvm_irq_dpci->mirq[pirq].gmsi.gvec = pt_irq_bind->u.msi.gvec;
- hvm_irq_dpci->mirq[pirq].gmsi.old_gflags =
pt_irq_bind->u.msi.gflags;
hvm_irq_dpci->mirq[pirq].gmsi.gflags = pt_irq_bind->u.msi.gflags;
/* bind after hvm_irq_dpci is setup to avoid race with irq
handler*/
rc = pirq_guest_bind(d->vcpu[0], pirq, 0);
@@ -180,8 +178,6 @@ int pt_irq_create_bind_vtd(
{
hvm_irq_dpci->mirq[pirq].gmsi.gflags = 0;
hvm_irq_dpci->mirq[pirq].gmsi.gvec = 0;
- hvm_irq_dpci->mirq[pirq].gmsi.old_gvec = 0;
- hvm_irq_dpci->mirq[pirq].gmsi.old_gflags = 0;
hvm_irq_dpci->mirq[pirq].flags = 0;
clear_bit(pirq, hvm_irq_dpci->mapping);
spin_unlock(&d->event_lock);
@@ -200,11 +196,8 @@ int pt_irq_create_bind_vtd(
/* if pirq is already mapped as vmsi, update the guest data/addr */
if ( hvm_irq_dpci->mirq[pirq].gmsi.gvec != pt_irq_bind->u.msi.gvec
||
- hvm_irq_dpci->mirq[pirq].gmsi.gflags !=
pt_irq_bind->u.msi.gflags) {
- hvm_irq_dpci->mirq[pirq].gmsi.old_gvec =
- hvm_irq_dpci->mirq[pirq].gmsi.gvec;
- hvm_irq_dpci->mirq[pirq].gmsi.old_gflags =
- hvm_irq_dpci->mirq[pirq].gmsi.gflags;
+ hvm_irq_dpci->mirq[pirq].gmsi.gflags !=
pt_irq_bind->u.msi.gflags) {
+
hvm_irq_dpci->mirq[pirq].gmsi.gvec = pt_irq_bind->u.msi.gvec;
hvm_irq_dpci->mirq[pirq].gmsi.gflags =
pt_irq_bind->u.msi.gflags;
}
@@ -435,21 +428,14 @@ void hvm_dpci_msi_eoi(struct domain *d,
pirq = find_next_bit(hvm_irq_dpci->mapping, d->nr_pirqs, pirq + 1) )
{
if ( (!(hvm_irq_dpci->mirq[pirq].flags & HVM_IRQ_DPCI_MACH_MSI)) ||
- (hvm_irq_dpci->mirq[pirq].gmsi.gvec != vector &&
- hvm_irq_dpci->mirq[pirq].gmsi.old_gvec != vector) )
+ (hvm_irq_dpci->mirq[pirq].gmsi.gvec != vector) )
continue;
- if ( hvm_irq_dpci->mirq[pirq].gmsi.gvec == vector ) {
- dest = hvm_irq_dpci->mirq[pirq].gmsi.gflags & VMSI_DEST_ID_MASK;
- dest_mode = !!(hvm_irq_dpci->mirq[pirq].gmsi.gflags &
VMSI_DM_MASK);
- } else {
- dest = hvm_irq_dpci->mirq[pirq].gmsi.old_gflags &
VMSI_DEST_ID_MASK;
- dest_mode = !!(hvm_irq_dpci->mirq[pirq].gmsi.old_gflags &
VMSI_DM_MASK);
- }
+ dest = hvm_irq_dpci->mirq[pirq].gmsi.gflags & VMSI_DEST_ID_MASK;
+ dest_mode = !!(hvm_irq_dpci->mirq[pirq].gmsi.gflags & VMSI_DM_MASK);
if ( vlapic_match_dest(vcpu_vlapic(current), NULL, 0, dest, dest_mode)
)
break;
}
-
if ( pirq < d->nr_pirqs )
__msi_pirq_eoi(d, pirq);
spin_unlock(&d->event_lock);
diff -r efeef2c5e96d -r cb0375fcec23 xen/include/xen/hvm/irq.h
--- a/xen/include/xen/hvm/irq.h Tue Jan 26 15:51:53 2010 +0000
+++ b/xen/include/xen/hvm/irq.h Tue Jan 26 15:52:30 2010 +0000
@@ -58,10 +58,8 @@ struct dev_intx_gsi_link {
#define GLFAGS_SHIFT_TRG_MODE 15
struct hvm_gmsi_info {
- uint16_t gvec;
- uint16_t old_gvec;
+ uint32_t gvec;
uint32_t gflags;
- uint32_t old_gflags;
int dest_vcpu_id; /* -1 :multi-dest, non-negative: dest_vcpu_id */
};
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|