linux/drivers/iommu
Thomas Gleixner 1119030240 iommu/vt-d: Move iommu preparatory allocations to irq_remap_ops.prepare
The whole iommu setup for irq remapping is a convoluted mess. The
iommu detect function gets called from mem_init() and the prepare
callback gets called from enable_IR_x2apic() for unknown reasons.

Of course AMD and Intel setup differs in nonsensical ways. Intels
prepare callback is explicit while AMDs prepare callback is implicit
in setup_irq_remapping_ops() just to be called in the prepare call
again.

Because all of this gets called from enable_IR_x2apic() and the dmar
prepare function merily parses the ACPI tables, but does not allocate
memory we end up with memory allocation from irq disabled context
later on.

AMDs iommu code at least allocates the required memory from the
prepare function. That has issues as well, but thats not scope of this
patch.

The goal of this change is to distangle the allocation from the actual
enablement. There is no point to allocate memory from irq disabled
regions with GFP_ATOMIC just because it does not matter at that point
in the boot stage. It matters with physical hotplug later on.

There is another issue with the current setup. Due to the conversion
to stacked irqdomains we end up with a call into the irqdomain
allocation code from irq disabled context, but that code does
GFP_KERNEL allocations rightfully as there is no reason to do
preperatory allocations with GFP_ATOMIC.

That change caused the allocator code to complain about GFP_KERNEL
allocations invoked in atomic context. Boris provided a temporary
hackaround which changed the GFP flags if irq_domain_add() got called
from atomic context. Not pretty and we really dont want to get this
into a mainline release for obvious reasons.

Move the ACPI table parsing and the resulting memory allocations from
the enable to the prepare function. That allows to get rid of the
horrible hackaround in irq_domain_add() later.

[Jiang] Rebased onto v3.19

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: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: x86@kernel.org
Link: http://lkml.kernel.org/r/20141205084147.313026156@linutronix.de
Link: http://lkml.kernel.org/r/1420615903-28253-3-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>
2015-01-15 11:24:22 +01:00
..
amd_iommu_init.c iommu/amd: Fix devid mapping for ivrs_ioapic override 2014-09-25 19:24:52 +02:00
amd_iommu_proto.h
amd_iommu_types.h iommu/amd: Move struct iommu_dev_data to amd_iommu.c 2014-08-26 11:37:37 +02:00
amd_iommu_v2.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2014-12-15 15:52:01 -08:00
amd_iommu.c Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2014-12-19 14:02:02 -08:00
arm-smmu.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
dmar.c iommu/vt-d: Search for ACPI _DSM method for DMAR hotplug 2014-11-18 11:18:36 +01:00
exynos-iommu.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
fsl_pamu_domain.c iommu/fsl: Convert to iommu_capable() API function 2014-09-25 15:47:37 +02:00
fsl_pamu_domain.h
fsl_pamu.c iommu: drop owner assignment from platform_drivers 2014-10-20 16:20:42 +02:00
fsl_pamu.h
intel_irq_remapping.c iommu/vt-d: Move iommu preparatory allocations to irq_remap_ops.prepare 2015-01-15 11:24:22 +01:00
intel-iommu.c iommu/vt-d: Remove dead code in device_notifier 2015-01-05 12:23:38 +01:00
iommu-sysfs.c iommu: Fix compile error in iommu-sysfs.c 2014-07-07 12:01:21 +02:00
iommu-traces.c
iommu.c ARM: SoC/iommu configuration for 3.19 2014-12-16 14:53:01 -08:00
iova.c iommu/vt-d: Update IOMMU state when memory hotplug happens 2014-03-04 17:51:06 +01:00
ipmmu-vmsa.c iommu/ipmmu-vmsa: Change IOMMU_EXEC to IOMMU_NOEXEC 2015-01-05 12:23:37 +01:00
irq_remapping.c iommu, x86: Restructure setup of the irq remapping feature 2015-01-15 11:24:22 +01:00
irq_remapping.h iommu/irq_remapping: Fix the regression of hpet irq remapping 2014-09-25 19:11:47 +02:00
Kconfig ARM: SoC/iommu configuration for 3.19 2014-12-16 14:53:01 -08:00
Makefile Merge branches 'arm/omap', 'arm/msm', 'arm/rockchip', 'arm/renesas', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-12-02 13:07:13 +01:00
msm_iommu_dev.c iommu/msm: Use dev_get_platdata() 2014-11-04 15:03:39 +01:00
msm_iommu_hw-8xxx.h
msm_iommu.c Merge branches 'arm/omap', 'arm/msm', 'arm/rockchip', 'arm/renesas', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-12-02 13:07:13 +01:00
msm_iommu.h
of_iommu.c iommu: store DT-probed IOMMU data privately 2014-12-05 14:35:52 +00:00
omap-iommu-debug.c iommu/omap: Switch pagetable debugfs entry to use seq_file 2014-10-23 14:33:48 +02:00
omap-iommu.c Merge branches 'arm/omap', 'arm/msm', 'arm/rockchip', 'arm/renesas', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-12-02 13:07:13 +01:00
omap-iommu.h iommu/omap: Do not export unneeded functions 2014-10-23 14:33:47 +02:00
omap-iopgtable.h iommu/omap: Move to_iommu definition from omap-iopgtable.h 2014-04-16 16:30:15 +02:00
rockchip-iommu.c iommu/rockchip: Drop owner assignment from platform_drivers 2015-01-05 12:40:06 +01:00
shmobile-iommu.c iommu: Add iommu_map_sg() function 2014-11-04 14:53:36 +01:00
shmobile-ipmmu.c iommu: drop owner assignment from platform_drivers 2014-10-20 16:20:42 +02:00
shmobile-ipmmu.h iommu/shmobile: Turn the flush_lock mutex into a spinlock 2014-01-07 15:35:25 +01:00
tegra-gart.c iommu: drop owner assignment from platform_drivers 2014-10-20 16:20:42 +02:00
tegra-smmu.c memory: Add NVIDIA Tegra memory controller support 2014-12-04 16:11:47 +01:00