FAILED: patch "[PATCH] net: qrtr: start MHI channel after endpoit creation" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 68a838b84effb7b57ba7d50b1863fc6ae35a54ce Mon Sep 17 00:00:00 2001
From: Maxim Kochetkov <[email protected]>
Date: Thu, 11 Aug 2022 12:48:40 +0300
Subject: [PATCH] net: qrtr: start MHI channel after endpoit creation
MHI channel may generates event/interrupt right after enabling. It may leads to 2 race conditions issues.
1)
Such event may be dropped by qcom_mhi_qrtr_dl_callback() at check:
if (!qdev || mhi_res->transaction_status) return;
Because dev_set_drvdata(&mhi_dev->dev, qdev) may be not performed at this moment. In this situation qrtr-ns will be unable to enumerate services in device.
---------------------------------------------------------------
2)
Such event may come at the moment after dev_set_drvdata() and before qrtr_endpoint_register(). In this case kernel will panic with accessing wrong pointer at qcom_mhi_qrtr_dl_callback():
rc = qrtr_endpoint_post(&qdev->ep, mhi_res->buf_addr, mhi_res->bytes_xferd);
Because endpoint is not created yet.
--------------------------------------------------------------
So move mhi_prepare_for_transfer_autoqueue after endpoint creation to fix it.
net/qrtr/mhi.c +7 -5
@@ -78,11 +78,6 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev,struct qrtr_mhi_dev *qdev;int rc; -/* start channels */ - rc =mhi_prepare_for_transfer_autoqueue (mhi_dev); -if (rc) -return rc; - qdev =devm_kzalloc (&mhi_dev->dev,sizeof (*qdev),GFP_KERNEL );if (!qdev)return -ENOMEM ;
@@ -96,6 +91,13 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev,if (rc)return rc; +/* start channels */ + rc =mhi_prepare_for_transfer_autoqueue (mhi_dev); +if (rc) { +qrtr_endpoint_unregister (&qdev->ep); +return rc; + } +dev_dbg (qdev->dev,"Qualcomm MHI QRTR driver probed\n" );return 0 ;