WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] fix iommu interrupt setup
From: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
Date: Thu, 12 Feb 2009 11:59:40 +0900
Delivery-date: Wed, 11 Feb 2009 19:00:05 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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>

diff -r bf9cdbec516a xen/arch/ia64/linux-xen/irq_ia64.c
--- a/xen/arch/ia64/linux-xen/irq_ia64.c        Wed Feb 11 16:36:59 2009 +0000
+++ b/xen/arch/ia64/linux-xen/irq_ia64.c        Thu Feb 12 11:01:54 2009 +0900
@@ -267,7 +267,7 @@ register_percpu_irq (ia64_vector vec, st
 }
 
 #ifdef XEN
-int request_irq(unsigned int irq,
+int request_vector(unsigned int vector,
                void (*handler)(int, void *, struct cpu_user_regs *),
                unsigned long irqflags, const char * devname, void *dev_id)
 {
@@ -279,7 +279,7 @@ int request_irq(unsigned int irq,
         * otherwise we'll have trouble later trying to figure out
         * which interrupt is which (messes up the interrupt freeing logic etc).
         *                          */
-       if (irq >= NR_IRQS)
+       if (vector >= NR_VECTORS)
                return -EINVAL;
        if (!handler)
                return -EINVAL;
@@ -291,7 +291,7 @@ int request_irq(unsigned int irq,
        action->handler = handler;
        action->name = devname;
        action->dev_id = dev_id;
-       setup_vector(irq, action);
+       setup_vector(vector, action);
        if (retval)
                xfree(action);
 
diff -r bf9cdbec516a xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c        Wed Feb 11 16:36:59 2009 +0000
+++ b/xen/arch/x86/irq.c        Thu Feb 12 11:01:54 2009 +0900
@@ -33,6 +33,7 @@ int vector_irq[NR_VECTORS] __read_mostly
 };
 
 static void __do_IRQ_guest(int vector);
+static int setup_vector(unsigned int vector, struct irqaction *new);
 
 void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs) { }
 
@@ -159,7 +160,7 @@ asmlinkage void do_IRQ(struct cpu_user_r
     spin_unlock(&desc->lock);
 }
 
-int request_irq(unsigned int irq,
+int request_vector(unsigned int vector,
         void (*handler)(int, void *, struct cpu_user_regs *),
         unsigned long irqflags, const char * devname, void *dev_id)
 {
@@ -172,7 +173,7 @@ int request_irq(unsigned int irq,
      * which interrupt is which (messes up the interrupt freeing
      * logic etc).
      */
-    if (irq >= NR_IRQS)
+    if (vector >= NR_VECTORS)
         return -EINVAL;
     if (!handler)
         return -EINVAL;
@@ -185,7 +186,7 @@ int request_irq(unsigned int irq,
     action->name = devname;
     action->dev_id = dev_id;
 
-    retval = setup_irq(irq, action);
+    retval = setup_vector(vector, action);
     if (retval)
         xfree(action);
 
@@ -209,9 +210,8 @@ void free_irq(unsigned int irq)
     do { smp_mb(); } while ( desc->status & IRQ_INPROGRESS );
 }
 
-int setup_irq(unsigned int irq, struct irqaction *new)
+static int setup_vector(unsigned int vector, struct irqaction *new)
 {
-    unsigned int  vector = irq_to_vector(irq);
     irq_desc_t   *desc = &irq_desc[vector];
     unsigned long flags;
  
@@ -231,6 +231,11 @@ int setup_irq(unsigned int irq, struct i
     spin_unlock_irqrestore(&desc->lock,flags);
 
     return 0;
+}
+
+int setup_irq(unsigned int irq, struct irqaction *new)
+{
+    return setup_vector(irq_to_vector(irq), new);
 }
 
 
diff -r bf9cdbec516a xen/drivers/passthrough/amd/iommu_init.c
--- a/xen/drivers/passthrough/amd/iommu_init.c  Wed Feb 11 16:36:59 2009 +0000
+++ b/xen/drivers/passthrough/amd/iommu_init.c  Thu Feb 12 11:01:54 2009 +0900
@@ -487,10 +487,12 @@ static int set_iommu_interrupt_handler(s
     }
 
     irq_desc[vector].handler = &iommu_msi_type;
-    ret = request_irq(vector, amd_iommu_page_fault, 0, "amd_iommu", iommu);
+    vector_to_iommu[vector] = iommu;
+    ret = request_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;
@@ -498,7 +500,6 @@ static int set_iommu_interrupt_handler(s
 
     /* Make sure that vector is never re-used. */
     vector_irq[vector] = NEVER_ASSIGN;
-    vector_to_iommu[vector] = iommu;
     iommu->vector = vector;
     return vector;
 }
diff -r bf9cdbec516a xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c       Wed Feb 11 16:36:59 2009 +0000
+++ b/xen/drivers/passthrough/vtd/iommu.c       Thu Feb 12 11:01:54 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;
-    ret = request_irq(vector, iommu_page_fault, 0, "dmar", iommu);
+    vector_to_iommu[vector] = iommu;
+    ret = request_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;
-    vector_to_iommu[vector] = iommu;
 
     return vector;
 }
diff -r bf9cdbec516a xen/include/xen/irq.h
--- a/xen/include/xen/irq.h     Wed Feb 11 16:36:59 2009 +0000
+++ b/xen/include/xen/irq.h     Thu Feb 12 11:01:54 2009 +0900
@@ -66,7 +66,7 @@ extern irq_desc_t irq_desc[NR_VECTORS];
 
 extern int setup_irq(unsigned int, struct irqaction *);
 extern void free_irq(unsigned int);
-extern int request_irq(unsigned int irq,
+extern int request_vector(unsigned int irq,
                void (*handler)(int, void *, struct cpu_user_regs *),
                unsigned long irqflags, const char * devname, void *dev_id);
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel