[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH] fix iommu interrupt setup



Hi,

Attached patch may help. This is extracted from my previous patch.
- set vector_to_iommu[vector] before calling request_vector
  since null pointer exceptions occurs

Thanks,
Kouya

Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

diff -r 32b154137492 xen/drivers/passthrough/amd/iommu_init.c
--- a/xen/drivers/passthrough/amd/iommu_init.c  Thu Feb 12 10:54:17 2009 +0000
+++ b/xen/drivers/passthrough/amd/iommu_init.c  Fri Feb 13 09:22:41 2009 +0900
@@ -487,11 +487,13 @@ static int set_iommu_interrupt_handler(s
     }
 
     irq_desc[vector].handler = &iommu_msi_type;
+    vector_to_iommu[vector] = iommu;
     ret = request_irq_vector(vector, amd_iommu_page_fault, 0,
                              "amd_iommu", iommu);
     if ( ret )
     {
         irq_desc[vector].handler = &no_irq_type;
+    vector_to_iommu[vector] = NULL;
         free_irq_vector(vector);
         amd_iov_error("can't request irq\n");
         return 0;
@@ -499,7 +501,6 @@ static int set_iommu_interrupt_handler(s
 
     /* Make sure that vector is never re-used. */
     vector_irq[vector] = NEVER_ASSIGN_IRQ;
-    vector_to_iommu[vector] = iommu;
     iommu->vector = vector;
     return vector;
 }
diff -r 32b154137492 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c       Thu Feb 12 10:54:17 2009 +0000
+++ b/xen/drivers/passthrough/vtd/iommu.c       Fri Feb 13 09:22:41 2009 +0900
@@ -870,7 +870,7 @@ static struct hw_interrupt_type dma_msi_
     .set_affinity = dma_msi_set_affinity,
 };
 
-int iommu_set_interrupt(struct iommu *iommu)
+static int iommu_set_interrupt(struct iommu *iommu)
 {
     int vector, ret;
 
@@ -882,10 +882,12 @@ int iommu_set_interrupt(struct iommu *io
     }
 
     irq_desc[vector].handler = &dma_msi_type;
+    vector_to_iommu[vector] = iommu;
     ret = request_irq_vector(vector, iommu_page_fault, 0, "dmar", iommu);
     if ( ret )
     {
         irq_desc[vector].handler = &no_irq_type;
+        vector_to_iommu[vector] = NULL;
         free_irq_vector(vector);
         gdprintk(XENLOG_ERR VTDPREFIX, "IOMMU: can't request irq\n");
         return ret;
@@ -893,7 +895,6 @@ int iommu_set_interrupt(struct iommu *io
 
     /* Make sure that vector is never re-used. */
     vector_irq[vector] = NEVER_ASSIGN_IRQ;
-    vector_to_iommu[vector] = iommu;
 
     return vector;
 }
Kay, Allen M writes:
> Interrupt handling cleanup in changeset 19195 is causing following failure on 
> my system:
> 
> (XEN) ----[ Xen-3.4-unstable  x86_64  debug=y  Not tainted ]----
> (XEN) CPU:    0
> (XEN) RIP:    e008:[<ffff828c8011b591>] check_lock+0x19/0x4e
> (XEN) RFLAGS: 0000000000010046   CONTEXT: hypervisor
> (XEN) rax: 0000000000000001   rbx: 0000000000000040   rcx: 0000000000000001
> (XEN) rdx: 0000000000000082   rsi: 0000000000000001   rdi: 0000000000000044
> (XEN) rbp: ffff828c80277c58   rsp: ffff828c80277c58   r8:  0000000000000005
> (XEN) r9:  0000000000000001   r10: 0000000000000001   r11: 0000000000000000
> (XEN) r12: 0000000000000082   r13: 0000000000000282   r14: 0000000000000090
> (XEN) r15: ffff83007f2c4160   cr0: 000000008005003b   cr4: 00000000000026f0
> (XEN) cr3: 000000007f47c000   cr2: 0000000000000044
> (XEN) ds: 0000   es: 0000   fs: 0000   gs: 0000   ss: 0000   cs: e008
> (XEN) Xen stack trace from rsp=ffff828c80277c58:
> (XEN)    ffff828c80277c78 ffff828c8011b70c 0000000000000000 0000000000000040
> (XEN)    ffff828c80277c98 ffff828c8012df24 ffff828c802a1c00 ffff828c802a1c24
> (XEN)    ffff828c80277ca8 ffff828c8012df83 ffff828c80277ce8 ffff828c80147cc0
> (XEN)    ffff828c80277ce8 00000000fffffff4 0000000000000090 ffff828c8012e639
> (XEN)    ffff828c801e2191 ffff83007f4d9df0 ffff828c80277d28 ffff828c801481fa
> (XEN)    ffff83007f2c4160 0000000000000090 ffff83007f4d9df0 0000000000004800
> (XEN)    ffff83007f4d9df0 ffff828c8029d400 ffff828c80277d68 ffff828c8012e2f0
> (XEN)    ffff828c80277d48 0000000000000000 ffff83007f4d9df0 0000000000000282
> (XEN)    ffff83007f6df130 0000000000100000 ffff828c80277d98 ffff828c8012e4a2
> (XEN)    0000000000000000 ffff83007f4d9df0 ffff828c8020b8b0 0000000000000020
> (XEN)    ffff828c80277de8 ffff828c8012fb38 ffff828c80277dd8 ffff828c8012a183
> (XEN)    0000000000000004 00010001802093c0 0001000100010001 00000000ffffffed
> (XEN)    ffff828c8022ec08 0000000000000017 ffff828c80277e08 ffff828c8012be18
> (XEN)    ffff828c80277e08 ffff828c8022eaf8 ffff828c80277f18 ffff828c80222ca8
> (XEN)    0000000000000000 0000000000000000 0000000000000000 ffff828c8020e675
> (XEN)    ffffffffc0270000 ffff83007f47cff8 ffff83007f47dff8 000000000020e610
> (XEN)    000000000008bf60 0000000000000000 0000000000000000 0000000000000000
> (XEN)    ffff83000008bfc0 ffff83000008bf60 0000000000b0c800 0000000000000000
> (XEN)    0000000000000000 0000000000000000 0000000000000000 0000000000000000
> (XEN)    0000000000000000 0000000000000000 0000000800000000 000000010000006e
> (XEN) Xen call trace:
> (XEN)    [<ffff828c8011b591>] check_lock+0x19/0x4e
> (XEN)    [<ffff828c8011b70c>] _spin_lock_irqsave+0x21/0x3f
> (XEN)    [<ffff828c8012df24>] dma_msi_unmask+0x2a/0x4b
> (XEN)    [<ffff828c8012df83>] dma_msi_startup+0x9/0x10
> (XEN)    [<ffff828c80147cc0>] setup_irq_vector+0x73/0x99
> (XEN)    [<ffff828c801481fa>] request_irq_vector+0x6c/0x9a
> (XEN)    [<ffff828c8012e2f0>] iommu_set_interrupt+0x97/0x10f
> (XEN)    [<ffff828c8012e4a2>] init_vtd_hw+0x13a/0x2d1
> (XEN)    [<ffff828c8012fb38>] intel_vtd_setup+0x332/0x4bd
> (XEN)    [<ffff828c8012be18>] iommu_setup+0x2d/0xf5
> (XEN)    [<ffff828c80222ca8>] __start_xen+0x457d/0x4895
> (XEN)    
> (XEN) Pagetable walk from 0000000000000044:
> (XEN)  L4[0x000] = 000000007f706063 5555555555555555
> (XEN)  L3[0x000] = 000000007e6f1063 5555555555555555
> (XEN)  L2[0x000] = 000000007e6f0063 5555555555555555 
> (XEN)  L1[0x000] = 0000000000000000 ffffffffffffffff
> (XEN) 
> (XEN) ****************************************
> (XEN) Panic on CPU 0:
> (XEN) FATAL PAGE FAULT
> (XEN) [error_code=0000]
> (XEN) Faulting linear address: 0000000000000044
> (XEN) ****************************************
> (XEN) 
> (XEN) Reboot in five seconds...
> 
> -----Original Message-----
> From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx 
> [mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Kouya Shimura
> Sent: Wednesday, February 11, 2009 7:00 PM
> To: xen-devel@xxxxxxxxxxxxxxxxxxx
> Subject: [Xen-devel] [PATCH] fix iommu interrupt setup
> 
> iommu is disabled since cset 19175:ab514cfbcdc5 with the following message:
> 
> (XEN) [VT-D]iommu.c:890:d32767 IOMMU: can't request irq
> (XEN) [VT-D]iommu.c:1686:d32767 IOMMU: interrupt setup failed
> (XEN) I/O virtualisation disabled
> 
> This patch fixes it.
> - rename request_irq to request_vector, no conversion by irq_to_vector(irq)
> - set vector_to_iommu[vector] before calling request_vector
>   since null pointer exceptions occurs
> - some cleanups
> 
> Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.