diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2021-02-16 14:33:07 +1100 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2021-04-23 01:38:04 +1000 |
commit | 4be518d838809e21354f32087aa9c26efc50b410 (patch) | |
tree | 5e7dc1d62e3a58ab8a49847016310e7cfcaf3f78 /arch/powerpc/kernel/iommu.c | |
parent | 7f1fa82d79947dfabb4046e1d787da9db2bc1c20 (diff) | |
download | lwn-4be518d838809e21354f32087aa9c26efc50b410.tar.gz lwn-4be518d838809e21354f32087aa9c26efc50b410.zip |
powerpc/iommu: Do not immediately panic when failed IOMMU table allocation
Most platforms allocate IOMMU table structures (specifically it_map)
at the boot time and when this fails - it is a valid reason for panic().
However the powernv platform allocates it_map after a device is returned
to the host OS after being passed through and this happens long after
the host OS booted. It is quite possible to trigger the it_map allocation
panic() and kill the host even though it is not necessary - the host OS
can still use the DMA bypass mode (requires a tiny fraction of it_map's
memory) and even if that fails, the host OS is runnnable as it was without
the device for which allocating it_map causes the panic.
Instead of immediately crashing in a powernv/ioda2 system, this prints
an error and continues. All other platforms still call panic().
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Leonardo Bras <leobras.c@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210216033307.69863-3-aik@ozlabs.ru
Diffstat (limited to 'arch/powerpc/kernel/iommu.c')
-rw-r--r-- | arch/powerpc/kernel/iommu.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 91d0ba7559a6..42e195aaf23a 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c @@ -727,8 +727,10 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl, int nid, sz = BITS_TO_LONGS(tbl->it_size) * sizeof(unsigned long); tbl->it_map = vzalloc_node(sz, nid); - if (!tbl->it_map) - panic("iommu_init_table: Can't allocate %ld bytes\n", sz); + if (!tbl->it_map) { + pr_err("%s: Can't allocate %ld bytes\n", __func__, sz); + return NULL; + } iommu_table_reserve_pages(tbl, res_start, res_end); |