From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6F4D3CAE66 for ; Thu, 25 Jun 2026 09:36:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782380215; cv=none; b=RpiBrTiEdwdUK4GclK7DcEjhORpkYdW4S06bWx61TBNtv9SZQZ1E/wS1k1vWB+eCM3b1Cz0wrjB3m5y4dxE/SLB4cTrIvCP9APqxko8YxG9AqXN8IywFABsnnvw/TMX1Th3C6wQl029BsL7rFNNsjO48nUvbGHFsqgQ1qxeEPhM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782380215; c=relaxed/simple; bh=GINfe0IEN+5RQC/mziNtNaqc6jNSmuKvAfDxICFx8a0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=o/kgwpnDfx3yUFvzDyB+4D1ROyQS74FTxm5obDE1JoAg/VvHzLfM1DY/pn6WQv4kxTR+kvDwEF1h/EJFA2GB+knXzCroQBj7kax0jdgAuTuwL41PfByCeqHlskMsEaA7ZqM6WM9ZfhlsoFmuS8EO6qb0OaCX3Ut0qj5F4dAl8rk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=b4iMNgnu; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ULA+b25v; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="b4iMNgnu"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ULA+b25v" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65P8p9i51271738 for ; Thu, 25 Jun 2026 09:36:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:message-id:mime-version :subject:to; s=qcppdkim1; bh=OYUac9gdHKQ0bXVem8jt8Fm2nxuYdEvOCye Kfp1XuJY=; b=b4iMNgnuCeyqteyCfCxO4izVUiV3jiZBxcTm8xXfwjdqqANQQ9F g0wReeTZC0lKfIYHMZZvt5Z0qXEu5ZevISxFqteaGus1acPDInf19vV8Zr5Fotyc r6kPkA2EHnfy1wV7NJT7zKDDsn0LZdA6VvJMigwvf72CrSCz6d4Gx/AL7XJW0F5s v7OvreKw9Rc4ex9fvnvJVg4J5+cNwqztjSBa1QDPy+o74oMDOlRNN2qIL787vXm1 nLq31CWQRd7lOSvx6V1mZpe5rXP2AN5ELlYamDOXCxMl5AyU7r0aHr0ms1MHRCMf PVlgYxZACs8bK4s7EQluw+BnjxhE1PPSVdg== Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4f0uudhfgx-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 25 Jun 2026 09:36:52 +0000 (GMT) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-8453a81b846so3026976b3a.2 for ; Thu, 25 Jun 2026 02:36:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1782380212; x=1782985012; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=OYUac9gdHKQ0bXVem8jt8Fm2nxuYdEvOCyeKfp1XuJY=; b=ULA+b25vddAQbIMqvZge0G7lQ65EdEx2j/DwDI7+UdEzhqZDHsmR7uP3Z6YhvGgl1L AdilgOzlw3nJ7+l1f7flOfIkvnzX5KYXuZZpBzMhVIfti2d+RO0RHI8lzJ/VWk/1s8z9 k8ZpsSYwv1YtVzjPPN2F31uGPOrf1DD3ajCSThL/KN1SJYwNDjHUYLMbHC941BtN7mKn JSISmtlLc873dN+a0rjaX4N2g+VKUJejQIZYYYml8jZNcFb4k1z17KAJA8zHJ44/BeLP C0qWQdHI856ZozTs3t0QOhZ6yw7I3coUJS/97Kymd448umQfDHC9O79hcOT0SHYo7osX IFgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782380212; x=1782985012; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=OYUac9gdHKQ0bXVem8jt8Fm2nxuYdEvOCyeKfp1XuJY=; b=puEsE96uiw1kkpG8/N8Ayh+EARcw9OtaYjNxcVvh7HvMhkZ6I2e/EQNzhXE411bPDB bCg2g9ucMeHcR0MSR+OCJbhsT2EOFJUTuc+oWzbSBsMONzC7B6QhrOZUUFbIlonqrkNT BvAoNYflDZTwm1ferOGlNY+nTFxwy4/UCEr/VCAh4RgQ7nJ0MEfMUKsiIG1JGdMHwOqe DTIW1uxTUOo+0k//Jaaa9qST5/VFM/zBKno14fo+ZhIHd8Icxhg2rCpCD+6Dm57H9fdX IP+eY2t2n3XtZS1nL1sCyFWvTF8CDE2ZU1sJi6sMxRGtWqfD7XvzwKh9N0cUCAc3Gl0o ItMw== X-Forwarded-Encrypted: i=1; AHgh+Rrws/fOypLLFPE1PBabiPRb433FJCWOeGXOPE2Gh+EYlUAqDioAyBYtROoTcLTCAoUxQi1by0FjCk2GGBM=@vger.kernel.org X-Gm-Message-State: AOJu0YwsrUr+2UR8DrFy/UwLchQFRu+gM5LoLIVxlIDwcZCqKEu0mxyB C9rqMDsxyw1aJc6h5d3B9d424hA+T9uZw6UbIheZgqcR7YmgcqCMY5EmAM9jgwXIze8GqShONZz oKGKuCH7TfTQJLiRuaw5POEmpYA2V6tIL8ay5TfvP4H/sdRQ9FvUWYLZxxpLq0+hnv3Q= X-Gm-Gg: AfdE7cmJsdL8EP1fn5AArCK6C8Umf7789dWlH/qJ9XBlVSTYgcLAxQJ7l+wbKM0uEHU /aM0buvCgu2i4wa0hZIOiyls6XeIxKOAeRdtpJeImwdxXdM0dwUp+b8hlD0vSwllr2Ly4u2XWTN RVsdprGtCvdHlpRUxWhWLVm2u0A5zcmRf9MBo+lfKXIrHDwfQNa68++Ldt52OKmyJPqflhHWNX5 tQ+obt3TFomNres4aK4TzRHgrwQdqLfM/oduDq1If6LdO/pgQKw/IeapEhv3w23nywODz2bfZx5 17WQUWBvrYd61hE6GPB+FUoVOTEUc9W6ymrUpcx6CxNrfBj1OV6iJ9iGFbxsLE3/FSHTqRu0rco +95A7dIN5qaZm6oreMYMLH0NE82YF7if/Xfz5zA== X-Received: by 2002:a05:6a00:21d1:b0:82f:5051:f024 with SMTP id d2e1a72fcca58-845b3ac85d9mr2397953b3a.27.1782380211914; Thu, 25 Jun 2026 02:36:51 -0700 (PDT) X-Received: by 2002:a05:6a00:21d1:b0:82f:5051:f024 with SMTP id d2e1a72fcca58-845b3ac85d9mr2397885b3a.27.1782380211166; Thu, 25 Jun 2026 02:36:51 -0700 (PDT) Received: from hu-mojha-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-845a4120e30sm4372635b3a.50.2026.06.25.02.36.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:36:50 -0700 (PDT) From: Mukesh Ojha To: Bjorn Andersson , Konrad Dybcio , Bartosz Golaszewski , Elliot Berman , Andrew Halaney Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Mukesh Ojha Subject: [PATCH] firmware: qcom: scm: Fix resource cleanup on probe failure Date: Thu, 25 Jun 2026 15:06:44 +0530 Message-ID: <20260625093644.3918184-1-mukesh.ojha@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Proofpoint-Spam-Info: AW1haW4tMjYwNjI1MDA4MiBTYWx0ZWRfX51lx8Nsv8LQl CTeVRLAzTwVCJdwbIqHVOeIbej/iNmrj6Xo0WrWTPSvafWh1yeDmBI26XVmoDEaPGuRNFTSc6WQ 2aWNdVhc84Ai8nVdPP8jW2EWjmPF7KE= X-Proofpoint-ORIG-GUID: Q5icdlySdOz-rCzqBWIKaS1-PZv_9OVQ X-Proofpoint-GUID: Q5icdlySdOz-rCzqBWIKaS1-PZv_9OVQ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjI1MDA4MiBTYWx0ZWRfXwmA2qfN1f4kA Rxoe6qh7Zti1KGJ+Rsz4y9jHOGkiTu+Yyi+ItmTG0BGGCd7V8bu7nRWwinhO1KkMMDzb2SjJtfC J0iLvXm1qdD3wgGXY7qPlIp81qmG3K235iQJ9hwRlValxcSDXcBFVcQzOLyx2fF1HS+3AKqm7nn fQtL1isbc4s0Gn9EUAC7Zi+F3TnallK0LFTG4+xr+vyJB5owiOwHx1drfch2qYX4/867P5Qdved LnoxOF8plxYQtuCGDi114L6flU9f7ljHoUt2Jfk1xK9zTrRc0lpfzCoGXUVCAikQAd2Hzr8DUsT F0yTzlzr3RnikPRi3df+MYG+hhfDFdslZ32gs2Wwb2lCYvMQOZIsImqqTGTkOs9NqQbiH8XVdTT xuHOMHrjtQAfPrcIvxvOjctNZqJLrSSjANDMY9FGIUhuYO1zwX/4EInK+Itgxgyb/G1MI/S7pVt 5RjwEeaadU9YWJNdg1Q== X-Authority-Analysis: v=2.4 cv=HdckiCE8 c=1 sm=1 tr=0 ts=6a3cf6b4 cx=c_pps a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=KKAkSRfTAAAA:8 a=uihZu18H8m0TJQArKZ8A:9 a=zc0IvFSfCIW2DFIPzwfm:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-25_01,2026-06-24_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 impostorscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 suspectscore=0 clxscore=1015 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2606250082 qcom_scm_probe() acquires two non-devres resources that are never released if probe fails or defers after them. of_reserved_mem_device_init() adds an entry to a global list with no devres counterpart, so a retry would add a duplicate entry and leak the original. qcom_tzmem_enable() sets a static qcom_tzmem_dev pointer and may set qcom_tzmem_using_shm_bridge; without cleanup a probe retry finds qcom_tzmem_dev already set and returns -EBUSY, permanently preventing the driver from probing. Introduce err_tzmem and err_rmem goto labels at the end of probe to call qcom_tzmem_disable() and of_reserved_mem_device_release() in the right order, route all subsequent error paths through them, and add qcom_tzmem_disable() to qcom_tzmem.c to clear the static state. Fixes: a33b2579c8d3 ("firmware: qcom: scm: add support for SHM bridge memory carveout") Fixes: 40289e35ca52 ("firmware: qcom: scm: enable the TZ mem allocator") Signed-off-by: Mukesh Ojha --- This is reported on sasiko review as existing issue here https://lore.kernel.org/all/20260624192213.C82691F000E9@smtp.kernel.org/ and it can go independently. drivers/firmware/qcom/qcom_scm.c | 42 +++++++++++++++++++++--------- drivers/firmware/qcom/qcom_tzmem.c | 7 +++++ drivers/firmware/qcom/qcom_tzmem.h | 1 + 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c index ba5cdeed8a04..cb3d776fa645 100644 --- a/drivers/firmware/qcom/qcom_scm.c +++ b/drivers/firmware/qcom/qcom_scm.c @@ -2883,9 +2883,11 @@ static int qcom_scm_probe(struct platform_device *pdev) "Failed to setup the reserved memory region for TZ mem\n"); ret = qcom_tzmem_enable(scm->dev); - if (ret) - return dev_err_probe(scm->dev, ret, - "Failed to enable the TrustZone memory allocator\n"); + if (ret) { + ret = dev_err_probe(scm->dev, ret, + "Failed to enable the TrustZone memory allocator\n"); + goto err_rmem; + } memset(&pool_config, 0, sizeof(pool_config)); pool_config.initial_size = 0; @@ -2893,16 +2895,20 @@ static int qcom_scm_probe(struct platform_device *pdev) pool_config.max_size = SZ_256K; scm->mempool = devm_qcom_tzmem_pool_new(scm->dev, &pool_config); - if (IS_ERR(scm->mempool)) - return dev_err_probe(scm->dev, PTR_ERR(scm->mempool), - "Failed to create the SCM memory pool\n"); + if (IS_ERR(scm->mempool)) { + ret = dev_err_probe(scm->dev, PTR_ERR(scm->mempool), + "Failed to create the SCM memory pool\n"); + goto err_tzmem; + } ret = qcom_scm_query_waitq_count(scm); scm->wq_cnt = ret < 0 ? QCOM_SCM_DEFAULT_WAITQ_COUNT : ret; scm->waitq_comps = devm_kcalloc(&pdev->dev, scm->wq_cnt, sizeof(*scm->waitq_comps), GFP_KERNEL); - if (!scm->waitq_comps) - return -ENOMEM; + if (!scm->waitq_comps) { + ret = -ENOMEM; + goto err_tzmem; + } for (i = 0; i < scm->wq_cnt; i++) init_completion(&scm->waitq_comps[i]); @@ -2912,14 +2918,18 @@ static int qcom_scm_probe(struct platform_device *pdev) irq = platform_get_irq_optional(pdev, 0); if (irq < 0) { - if (irq != -ENXIO) - return irq; + if (irq != -ENXIO) { + ret = irq; + goto err_tzmem; + } } else { ret = devm_request_threaded_irq(scm->dev, irq, NULL, qcom_scm_irq_handler, IRQF_ONESHOT, "qcom-scm", scm); - if (ret < 0) - return dev_err_probe(scm->dev, ret, - "Failed to request qcom-scm irq\n"); + if (ret < 0) { + ret = dev_err_probe(scm->dev, ret, + "Failed to request qcom-scm irq\n"); + goto err_tzmem; + } } /* @@ -2966,6 +2976,12 @@ static int qcom_scm_probe(struct platform_device *pdev) qcom_scm_gunyah_wdt_init(scm); return 0; + +err_tzmem: + qcom_tzmem_disable(scm->dev); +err_rmem: + of_reserved_mem_device_release(scm->dev); + return ret; } static void qcom_scm_shutdown(struct platform_device *pdev) diff --git a/drivers/firmware/qcom/qcom_tzmem.c b/drivers/firmware/qcom/qcom_tzmem.c index 0635cbeacfc8..3f2b782f4a94 100644 --- a/drivers/firmware/qcom/qcom_tzmem.c +++ b/drivers/firmware/qcom/qcom_tzmem.c @@ -518,6 +518,13 @@ int qcom_tzmem_enable(struct device *dev) } EXPORT_SYMBOL_GPL(qcom_tzmem_enable); +void qcom_tzmem_disable(struct device *dev) +{ + qcom_tzmem_using_shm_bridge = false; + qcom_tzmem_dev = NULL; +} +EXPORT_SYMBOL_GPL(qcom_tzmem_disable); + MODULE_DESCRIPTION("TrustZone memory allocator for Qualcomm firmware drivers"); MODULE_AUTHOR("Bartosz Golaszewski "); MODULE_LICENSE("GPL"); diff --git a/drivers/firmware/qcom/qcom_tzmem.h b/drivers/firmware/qcom/qcom_tzmem.h index 8fa8a3eb940e..0b0f26d4e22e 100644 --- a/drivers/firmware/qcom/qcom_tzmem.h +++ b/drivers/firmware/qcom/qcom_tzmem.h @@ -9,5 +9,6 @@ struct device; int qcom_tzmem_enable(struct device *dev); +void qcom_tzmem_disable(struct device *dev); #endif /* __QCOM_TZMEM_PRIV_H */ -- 2.53.0