iommu: leave IOMMU enabled by default during kexec crash transition

It's unsafe to disable IOMMU on a live system which is the case
if we're crashing since remapping hardware doesn't usually know what
to do with ongoing bus transactions and frequently raises NMI/MCE/SMI,
etc. (depends on the firmware configuration) to signal these abnormalities.
This, in turn, doesn't play well with kexec transition process as there is
no handling available at the moment for this kind of events resulting
in failures to enter the kernel.

Modern Linux kernels taught to copy all the necessary DMAR/IR tables
following kexec from the previous kernel (Xen in our case) - so it's
currently normal to keep IOMMU enabled. It might require minor changes to
kdump command line that enables IOMMU drivers (e.g. intel_iommu=on /
intremap=on) but recent kernels don't require any additional changes for
the transition to be transparent.

A fallback option is still left for compatibility with ancient crash
kernels which didn't like to have IOMMU active under their feet on boot.

Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Igor Druzhinin authored and Jan Beulich committed 2019-03-12 14:38:12 +01:00
1 parent 65a510fe51
commit 12c36f577d
3 files changed
+20 -3

No files matched your search

+7 -1
View File
@@ -1172,7 +1172,7 @@ detection of systems known to misbehave upon accesses to that port.
### iommu
= List of [ <bool>, verbose, debug, force, required,
sharept, intremap, intpost,
sharept, intremap, intpost, crash-disable,
snoop, qinval, igfx, workaround_bios_bug,
amd-iommu-perdev-intremap,
dom0-{passthrough,strict} ]
@@ -1235,6 +1235,12 @@ boolean (e.g. `iommu=no`) can override this and leave the IOMMUs disabled.
This option depends on `intremap`, and is disabled by default due to some
corner cases in the implementation which have yet to be resolved.
* The `crash-disable` boolean controls disabling IOMMU functionality (DMAR/IR/QI)
before switching to a crash kernel. This option is inactive by default and
is for compatibility with older kdump kernels only. Modern kernels copy
all the necessary tables from the previous one following kexec which makes
the transition transparent for them with IOMMU functions still on.
The following options are specific to Intel VT-d hardware:
* The `snoop` boolean controls the Snoop Control sub-feature, and is active
+5 -2
View File
@@ -162,8 +162,11 @@ static void nmi_shootdown_cpus(void)
printk("Failed to shoot down CPUs {%*pbl}\n",
nr_cpu_ids, cpumask_bits(&waiting_to_crash));
/* Crash shutdown any IOMMU functionality as the crashdump kernel is not
* happy when booting if interrupt/dma remapping is still enabled */
/*
* Try to crash shutdown IOMMU functionality as some old crashdump
* kernels are not happy when booting if interrupt/dma remapping
* is still enabled.
*/
iommu_crash_shutdown();
__stop_this_cpu();
+8
View File
@@ -35,6 +35,7 @@ bool_t __read_mostly iommu_igfx = 1;
bool_t __read_mostly iommu_snoop = 1;
bool_t __read_mostly iommu_qinval = 1;
bool_t __read_mostly iommu_intremap = 1;
bool_t __read_mostly iommu_crash_disable;
static bool __hwdom_initdata iommu_hwdom_none;
bool __hwdom_initdata iommu_hwdom_strict;
@@ -88,6 +89,10 @@ static int __init parse_iommu_param(const char *s)
iommu_intremap = val;
else if ( (val = parse_boolean("intpost", s, ss)) >= 0 )
iommu_intpost = val;
#ifdef CONFIG_KEXEC
else if ( (val = parse_boolean("crash-disable", s, ss)) >= 0 )
iommu_crash_disable = val;
#endif
else if ( (val = parse_boolean("debug", s, ss)) >= 0 )
{
iommu_debug = val;
@@ -579,6 +584,9 @@ void iommu_share_p2m_table(struct domain* d)
void iommu_crash_shutdown(void)
{
if ( !iommu_crash_disable )
return;
if ( iommu_enabled )
iommu_get_ops()->crash_shutdown();
iommu_enabled = iommu_intremap = iommu_intpost = 0;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.