Commit 107924c1 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov Committed by Bjorn Andersson

soc: qcom: pdr: protect locator_addr with the main mutex

If the service locator server is restarted fast enough, the PDR can
rewrite locator_addr fields concurrently. Protect them by placing
modification of those fields under the main pdr->lock.

Fixes: fbe639b4 ("soc: qcom: Introduce Protection Domain Restart helpers")
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD
Tested-by: default avatarSteev Klimaszewski <steev@kali.org>
Tested-by: default avatarAlexey Minnekhanov <alexeymin@postmarketos.org>
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://lore.kernel.org/r/20240622-qcom-pd-mapper-v9-1-a84ee3591c8e@linaro.orgSigned-off-by: default avatarBjorn Andersson <andersson@kernel.org>
parent 1613e604
...@@ -76,12 +76,12 @@ static int pdr_locator_new_server(struct qmi_handle *qmi, ...@@ -76,12 +76,12 @@ static int pdr_locator_new_server(struct qmi_handle *qmi,
locator_hdl); locator_hdl);
struct pdr_service *pds; struct pdr_service *pds;
mutex_lock(&pdr->lock);
/* Create a local client port for QMI communication */ /* Create a local client port for QMI communication */
pdr->locator_addr.sq_family = AF_QIPCRTR; pdr->locator_addr.sq_family = AF_QIPCRTR;
pdr->locator_addr.sq_node = svc->node; pdr->locator_addr.sq_node = svc->node;
pdr->locator_addr.sq_port = svc->port; pdr->locator_addr.sq_port = svc->port;
mutex_lock(&pdr->lock);
pdr->locator_init_complete = true; pdr->locator_init_complete = true;
mutex_unlock(&pdr->lock); mutex_unlock(&pdr->lock);
...@@ -104,10 +104,10 @@ static void pdr_locator_del_server(struct qmi_handle *qmi, ...@@ -104,10 +104,10 @@ static void pdr_locator_del_server(struct qmi_handle *qmi,
mutex_lock(&pdr->lock); mutex_lock(&pdr->lock);
pdr->locator_init_complete = false; pdr->locator_init_complete = false;
mutex_unlock(&pdr->lock);
pdr->locator_addr.sq_node = 0; pdr->locator_addr.sq_node = 0;
pdr->locator_addr.sq_port = 0; pdr->locator_addr.sq_port = 0;
mutex_unlock(&pdr->lock);
} }
static const struct qmi_ops pdr_locator_ops = { static const struct qmi_ops pdr_locator_ops = {
...@@ -365,12 +365,14 @@ static int pdr_get_domain_list(struct servreg_get_domain_list_req *req, ...@@ -365,12 +365,14 @@ static int pdr_get_domain_list(struct servreg_get_domain_list_req *req,
if (ret < 0) if (ret < 0)
return ret; return ret;
mutex_lock(&pdr->lock);
ret = qmi_send_request(&pdr->locator_hdl, ret = qmi_send_request(&pdr->locator_hdl,
&pdr->locator_addr, &pdr->locator_addr,
&txn, SERVREG_GET_DOMAIN_LIST_REQ, &txn, SERVREG_GET_DOMAIN_LIST_REQ,
SERVREG_GET_DOMAIN_LIST_REQ_MAX_LEN, SERVREG_GET_DOMAIN_LIST_REQ_MAX_LEN,
servreg_get_domain_list_req_ei, servreg_get_domain_list_req_ei,
req); req);
mutex_unlock(&pdr->lock);
if (ret < 0) { if (ret < 0) {
qmi_txn_cancel(&txn); qmi_txn_cancel(&txn);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment