From 2a36b539c652f5753855eb0651bcd7ea3d50b04b Mon Sep 17 00:00:00 2001 From: James Mckenzie Date: Thu, 20 Aug 2009 08:28:35 +0100 Subject: [PATCH] Ugly hack to fix SATA - Send EOI for MSI immediately. Xen tends to allocate MSI with high vector numbers (priority) it leaves them pending until the guest sends EOI. However if you have an MSI pending per CPU you lose. --- master/series | 1 + master/ugly-hack-to-fix-sata | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 master/ugly-hack-to-fix-sata diff --git a/master/series b/master/series index c027f7b..31c3a33 100644 --- a/master/series +++ b/master/series @@ -18,3 +18,4 @@ tools-hvm-info default-iommu-inclusive-mapping igd-cmd-reg-change-for-reboot xblanker +ugly-hack-to-fix-sata diff --git a/master/ugly-hack-to-fix-sata b/master/ugly-hack-to-fix-sata new file mode 100644 index 0000000..8b5c645 --- /dev/null +++ b/master/ugly-hack-to-fix-sata @@ -0,0 +1,29 @@ +diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c +index e2202ba..eee9dd1 100644 +--- a/xen/arch/x86/irq.c ++++ b/xen/arch/x86/irq.c +@@ -318,13 +318,17 @@ static void __do_IRQ_guest(int vector) + + if ( action->ack_type == ACKTYPE_EOI ) + { +- sp = pending_eoi_sp(peoi); +- ASSERT((sp == 0) || (peoi[sp-1].vector < vector)); +- ASSERT(sp < (NR_VECTORS-1)); +- peoi[sp].vector = vector; +- peoi[sp].ready = 0; +- pending_eoi_sp(peoi) = sp+1; +- cpu_set(smp_processor_id(), action->cpu_eoi_map); ++ if ( desc->handler == &pci_msi_type ) { //FIXME I'M UGLY ++ desc->handler->end(vector); ++ } else { ++ sp = pending_eoi_sp(peoi); ++ ASSERT((sp == 0) || (peoi[sp-1].vector < vector)); ++ ASSERT(sp < (NR_VECTORS-1)); ++ peoi[sp].vector = vector; ++ peoi[sp].ready = 0; ++ pending_eoi_sp(peoi) = sp+1; ++ cpu_set(smp_processor_id(), action->cpu_eoi_map); ++ } + } + + for ( i = 0; i < action->nr_guests; i++ ) -- 2.39.5