Skip to content

Commit adf752a

Browse files
tyhicksjenswi-linaro
authored andcommitted
optee: Refuse to load the driver under the kdump kernel
Fix a hung task issue, seen when booting the kdump kernel, that is caused by all of the secure world threads being in a permanent suspended state: INFO: task swapper/0:1 blocked for more than 120 seconds. Not tainted 5.4.83 #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. swapper/0 D 0 1 0 0x00000028 Call trace: __switch_to+0xc8/0x118 __schedule+0x2e0/0x700 schedule+0x38/0xb8 schedule_timeout+0x258/0x388 wait_for_completion+0x16c/0x4b8 optee_cq_wait_for_completion+0x28/0xa8 optee_disable_shm_cache+0xb8/0xf8 optee_probe+0x560/0x61c platform_drv_probe+0x58/0xa8 really_probe+0xe0/0x338 driver_probe_device+0x5c/0xf0 device_driver_attach+0x74/0x80 __driver_attach+0x64/0xe0 bus_for_each_dev+0x84/0xd8 driver_attach+0x30/0x40 bus_add_driver+0x188/0x1e8 driver_register+0x64/0x110 __platform_driver_register+0x54/0x60 optee_driver_init+0x20/0x28 do_one_initcall+0x54/0x24c kernel_init_freeable+0x1e8/0x2c0 kernel_init+0x18/0x118 ret_from_fork+0x10/0x18 The invoke_fn hook returned OPTEE_SMC_RETURN_ETHREAD_LIMIT, indicating that the secure world threads were all in a suspended state at the time of the kernel crash. This intermittently prevented the kdump kernel from booting, resulting in a failure to collect the kernel dump. Make kernel dump collection more reliable on systems utilizing OP-TEE by refusing to load the driver under the kdump kernel. Cc: [email protected] Signed-off-by: Tyler Hicks <[email protected]> Reviewed-by: Jens Wiklander <[email protected]> Reviewed-by: Sumit Garg <[email protected]> Signed-off-by: Jens Wiklander <[email protected]>
1 parent ec185dd commit adf752a

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

drivers/tee/optee/core.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
77

88
#include <linux/arm-smccc.h>
9+
#include <linux/crash_dump.h>
910
#include <linux/errno.h>
1011
#include <linux/io.h>
1112
#include <linux/module.h>
@@ -612,6 +613,16 @@ static int optee_probe(struct platform_device *pdev)
612613
u32 sec_caps;
613614
int rc;
614615

616+
/*
617+
* The kernel may have crashed at the same time that all available
618+
* secure world threads were suspended and we cannot reschedule the
619+
* suspended threads without access to the crashed kernel's wait_queue.
620+
* Therefore, we cannot reliably initialize the OP-TEE driver in the
621+
* kdump kernel.
622+
*/
623+
if (is_kdump_kernel())
624+
return -ENODEV;
625+
615626
invoke_fn = get_invoke_func(&pdev->dev);
616627
if (IS_ERR(invoke_fn))
617628
return PTR_ERR(invoke_fn);

0 commit comments

Comments
 (0)