From 4bcb44fbf9bcf7cf87bcfaa7a01337db4fb41306 Mon Sep 17 00:00:00 2001 From: Niranjan Dighe Date: Tue, 30 Nov 2021 10:58:45 +0530 Subject: [PATCH] nvadsp: adspff: Handle kthread creation failure kthread_create call may return ERR_PTR(-ENOMEM) or ERR_PTR(-EINTR) in case of memory allocation failure or if the newly created thread receives a fatal signal. Handle the conditions by returning and not attempting to wake up the thread. Bug 200688338 Change-Id: Ibde3a847202476f52fca38d145091c540ace19c4 Signed-off-by: Niranjan Dighe Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2633986 (cherry picked from commit 4d382d925befd445cddfc10c556d7c06b980b920) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2729780 Reviewed-by: svcacv Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-cert Reviewed-by: svc_kernel_abi Reviewed-by: Nitin Pai GVS: Gerrit_Virtual_Submit Tested-by: Uday Gupta --- drivers/platform/tegra/nvadsp/adspff.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/platform/tegra/nvadsp/adspff.c b/drivers/platform/tegra/nvadsp/adspff.c index 11c10959..cbc13fcd 100644 --- a/drivers/platform/tegra/nvadsp/adspff.c +++ b/drivers/platform/tegra/nvadsp/adspff.c @@ -663,6 +663,16 @@ int adspff_init(struct platform_device *pdev) return -1; } + adspff_kthread = kthread_create(adspff_kthread_fn, + NULL, "adspp_kthread"); + if ((adspff_kthread == ERR_PTR(-ENOMEM)) || + (adspff_kthread == ERR_PTR(-EINTR))) { + pr_err("adspff kthread_create failed, error = %s\n", + (adspff_kthread == ERR_PTR(-ENOMEM)) ? + "-ENOMEM" : "-EINTR"); + return -1; + } + adspff = ADSPFF_SHARED_STATE(app_info->mem.shared); ret = nvadsp_mbox_open(&rx_mbox, &adspff->mbox_id, @@ -684,10 +694,7 @@ int adspff_init(struct platform_device *pdev) INIT_LIST_HEAD(&adspff_kthread_msgq_head); INIT_LIST_HEAD(&file_list); - // kthread inIt init_waitqueue_head(&wait_queue); - adspff_kthread = kthread_create(adspff_kthread_fn, - NULL, "adspp_kthread"); #if KERNEL_VERSION(5, 9, 0) > LINUX_VERSION_CODE sched_setscheduler(adspff_kthread, SCHED_FIFO, ¶m);