Skip to content

Commit

Permalink
iommu, x86: Restructure setup of the irq remapping feature
Browse files Browse the repository at this point in the history
enable_IR_x2apic() calls setup_irq_remapping_ops() which by default
installs the intel dmar remapping ops and then calls the amd iommu irq
remapping prepare callback to figure out whether we are running on an
AMD machine with irq remapping hardware.

Right after that it calls irq_remapping_prepare() which pointlessly
checks:
	if (!remap_ops || !remap_ops->prepare)
               return -ENODEV;
and then calls

    remap_ops->prepare()

which is silly in the AMD case as it got called from
setup_irq_remapping_ops() already a few microseconds ago.

Simplify this and just collapse everything into
irq_remapping_prepare().

The irq_remapping_prepare() remains still silly as it assigns blindly
the intel ops, but that's not scope of this patch.

The scope here is to move the preperatory work, i.e. memory
allocations out of the atomic section which is required to enable irq
remapping.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Borislav Petkov <bp@alien8.de>
Acked-and-tested-by: Joerg Roedel <joro@8bytes.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: iommu@lists.linux-foundation.org
Cc: Joerg Roedel <jroedel@suse.de>
Cc: H. Peter Anvin <hpa@linux.intel.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Cc: Jan Beulich <JBeulich@suse.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Oren Twaig <oren@scalemp.com>
Cc: x86@kernel.org
Link: http://lkml.kernel.org/r/20141205084147.232633738@linutronix.de
Link: http://lkml.kernel.org/r/1420615903-28253-2-git-send-email-jiang.liu@linux.intel.com
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Thomas Gleixner committed Jan 15, 2015
1 parent eaa27f3 commit a1dafe8
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 17 deletions.
2 changes: 0 additions & 2 deletions arch/x86/include/asm/irq_remapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ struct irq_cfg;

#ifdef CONFIG_IRQ_REMAP

extern void setup_irq_remapping_ops(void);
extern int irq_remapping_supported(void);
extern void set_irq_remapping_broken(void);
extern int irq_remapping_prepare(void);
Expand All @@ -60,7 +59,6 @@ void irq_remap_modify_chip_defaults(struct irq_chip *chip);

#else /* CONFIG_IRQ_REMAP */

static inline void setup_irq_remapping_ops(void) { }
static inline int irq_remapping_supported(void) { return 0; }
static inline void set_irq_remapping_broken(void) { }
static inline int irq_remapping_prepare(void) { return -ENODEV; }
Expand Down
3 changes: 0 additions & 3 deletions arch/x86/kernel/apic/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1597,9 +1597,6 @@ void __init enable_IR_x2apic(void)
int ret, x2apic_enabled = 0;
int hardware_init_ret;

/* Make sure irq_remap_ops are initialized */
setup_irq_remapping_ops();

hardware_init_ret = irq_remapping_prepare();
if (hardware_init_ret && !x2apic_supported())
return;
Expand Down
19 changes: 7 additions & 12 deletions drivers/iommu/irq_remapping.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,16 +194,6 @@ static __init int setup_irqremap(char *str)
}
early_param("intremap", setup_irqremap);

void __init setup_irq_remapping_ops(void)
{
remap_ops = &intel_irq_remap_ops;

#ifdef CONFIG_AMD_IOMMU
if (amd_iommu_irq_ops.prepare() == 0)
remap_ops = &amd_iommu_irq_ops;
#endif
}

void set_irq_remapping_broken(void)
{
irq_remap_broken = 1;
Expand All @@ -222,9 +212,14 @@ int irq_remapping_supported(void)

int __init irq_remapping_prepare(void)
{
if (!remap_ops || !remap_ops->prepare)
return -ENODEV;
remap_ops = &intel_irq_remap_ops;

#ifdef CONFIG_AMD_IOMMU
if (amd_iommu_irq_ops.prepare() == 0) {
remap_ops = &amd_iommu_irq_ops;
return 0;
}
#endif
return remap_ops->prepare();
}

Expand Down

0 comments on commit a1dafe8

Please sign in to comment.