From: James Mckenzie Date: Thu, 20 Aug 2009 07:28:35 +0000 (+0100) Subject: Ugly hack to fix SATA - Send EOI for MSI immediately. X-Git-Url: http://xenbits.xen.org/gitweb?a=commitdiff_plain;h=2a36b539c652f5753855eb0651bcd7ea3d50b04b;p=xenclient%2Fxen-pq.git 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. --- 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++ )