From: Jan Beulich Date: Sat, 2 Apr 2011 14:56:07 +0000 (+0100) Subject: move request_irq() into .init.text X-Git-Tag: 4.2.0-rc1~2451 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e1fe30b87def91bde70f793dc22b6b1f73c4b3ca;p=xen.git move request_irq() into .init.text With no modular drivers, all interrupt setup is supposed to happen during boot. Signed-off-by: Jan Beulich --- diff --git a/xen/arch/ia64/linux-xen/irq_ia64.c b/xen/arch/ia64/linux-xen/irq_ia64.c index 3d5d92c764..d792421411 100644 --- a/xen/arch/ia64/linux-xen/irq_ia64.c +++ b/xen/arch/ia64/linux-xen/irq_ia64.c @@ -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) { diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index ab2e6c9993..2e89b90aee 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -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) { diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index 1002e44e8d..a65c9d587c 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -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; diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 52d1585987..34b47aaca8 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -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; } /*