]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/xen.git/commitdiff
move request_irq() into .init.text
authorJan Beulich <jbeulich@novell.com>
Sat, 2 Apr 2011 14:56:07 +0000 (15:56 +0100)
committerJan Beulich <jbeulich@novell.com>
Sat, 2 Apr 2011 14:56:07 +0000 (15:56 +0100)
With no modular drivers, all interrupt setup is supposed to happen
during boot.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/ia64/linux-xen/irq_ia64.c
xen/arch/x86/irq.c
xen/drivers/passthrough/amd/iommu_init.c
xen/drivers/passthrough/vtd/iommu.c

index 3d5d92c7644f60586c6a9802ffe963c1c324355c..d7924214118bb98c242dd3d13366473a69324586 100644 (file)
@@ -267,7 +267,7 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action)
 }
 
 #ifdef XEN
-int request_irq_vector(unsigned int vector,
+int __init request_irq_vector(unsigned int vector,
                void (*handler)(int, void *, struct cpu_user_regs *),
                unsigned long irqflags, const char * devname, void *dev_id)
 {
index ab2e6c9993ea529fc082b048b85574baaaa0832b..2e89b90aeedfe548ad52783c3322d0422ed11ad1 100644 (file)
@@ -643,7 +643,7 @@ static int __init irq_ratelimit_init(void)
 }
 __initcall(irq_ratelimit_init);
 
-int request_irq(unsigned int irq,
+int __init request_irq(unsigned int irq,
         void (*handler)(int, void *, struct cpu_user_regs *),
         unsigned long irqflags, const char * devname, void *dev_id)
 {
index 1002e44e8df7d102713666e1d77cb40ee1f90abe..a65c9d587ce3d68dbb4ffaac36f09d80d68e6e46 100644 (file)
@@ -535,7 +535,7 @@ static void amd_iommu_page_fault(int irq, void *dev_id,
     spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
-static int set_iommu_interrupt_handler(struct amd_iommu *iommu)
+static int __init set_iommu_interrupt_handler(struct amd_iommu *iommu)
 {
     int irq, ret;
 
index 52d15859879e26ab0501bb5f419930965d9c0fc3..34b47aaca8f88517a459b014cf28d437f8e56f27 100644 (file)
@@ -1038,7 +1038,7 @@ static hw_irq_controller dma_msi_type = {
     .set_affinity = dma_msi_set_affinity,
 };
 
-static int iommu_set_interrupt(struct iommu *iommu)
+static int __init iommu_set_interrupt(struct iommu *iommu)
 {
     int irq, ret;
 
@@ -1937,7 +1937,6 @@ static int init_vtd_hw(void)
     struct acpi_drhd_unit *drhd;
     struct iommu *iommu;
     struct iommu_flush *flush = NULL;
-    int irq;
     int ret;
     unsigned long flags;
     struct irq_cfg *cfg;
@@ -1948,16 +1947,6 @@ static int init_vtd_hw(void)
     for_each_drhd_unit ( drhd )
     {
         iommu = drhd->iommu;
-        if ( iommu->irq < 0 )
-        {
-            irq = iommu_set_interrupt(iommu);
-            if ( irq < 0 )
-            {
-                dprintk(XENLOG_ERR VTDPREFIX, "IOMMU: interrupt setup failed\n");
-                return irq;
-            }
-            iommu->irq = irq;
-        }
 
         cfg = irq_cfg(iommu->irq);
         dma_msi_set_affinity(iommu->irq, cfg->cpu_mask);
@@ -2060,6 +2049,7 @@ int __init intel_vtd_setup(void)
 {
     struct acpi_drhd_unit *drhd;
     struct iommu *iommu;
+    int ret;
 
     if ( list_empty(&acpi_drhd_units) )
         return -ENODEV;
@@ -2092,6 +2082,14 @@ int __init intel_vtd_setup(void)
 
         if ( iommu_intremap && !ecap_intr_remap(iommu->ecap) )
             iommu_intremap = 0;
+
+        ret = iommu_set_interrupt(iommu);
+        if ( ret < 0 )
+        {
+            dprintk(XENLOG_ERR VTDPREFIX, "IOMMU: interrupt setup failed\n");
+            goto error;
+        }
+        iommu->irq = ret;
     }
 
     if ( !iommu_qinval && iommu_intremap )
@@ -2110,7 +2108,8 @@ int __init intel_vtd_setup(void)
 
     scan_pci_devices();
 
-    if ( init_vtd_hw() )
+    ret = init_vtd_hw();
+    if ( ret )
         goto error;
 
     register_keyhandler('V', &dump_iommu_info_keyhandler);
@@ -2123,7 +2122,7 @@ int __init intel_vtd_setup(void)
     iommu_passthrough = 0;
     iommu_qinval = 0;
     iommu_intremap = 0;
-    return -ENOMEM;
+    return ret;
 }
 
 /*