Skip to content

Commit 107924c

Browse files
lumagandersson
authored andcommitted
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: fbe639b ("soc: qcom: Introduce Protection Domain Restart helpers") Tested-by: Neil Armstrong <[email protected]> # on SM8550-QRD Tested-by: Steev Klimaszewski <[email protected]> Tested-by: Alexey Minnekhanov <[email protected]> Signed-off-by: Dmitry Baryshkov <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Bjorn Andersson <[email protected]>
1 parent 1613e60 commit 107924c

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/soc/qcom/pdr_interface.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ static int pdr_locator_new_server(struct qmi_handle *qmi,
7676
locator_hdl);
7777
struct pdr_service *pds;
7878

79+
mutex_lock(&pdr->lock);
7980
/* Create a local client port for QMI communication */
8081
pdr->locator_addr.sq_family = AF_QIPCRTR;
8182
pdr->locator_addr.sq_node = svc->node;
8283
pdr->locator_addr.sq_port = svc->port;
8384

84-
mutex_lock(&pdr->lock);
8585
pdr->locator_init_complete = true;
8686
mutex_unlock(&pdr->lock);
8787

@@ -104,10 +104,10 @@ static void pdr_locator_del_server(struct qmi_handle *qmi,
104104

105105
mutex_lock(&pdr->lock);
106106
pdr->locator_init_complete = false;
107-
mutex_unlock(&pdr->lock);
108107

109108
pdr->locator_addr.sq_node = 0;
110109
pdr->locator_addr.sq_port = 0;
110+
mutex_unlock(&pdr->lock);
111111
}
112112

113113
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,
365365
if (ret < 0)
366366
return ret;
367367

368+
mutex_lock(&pdr->lock);
368369
ret = qmi_send_request(&pdr->locator_hdl,
369370
&pdr->locator_addr,
370371
&txn, SERVREG_GET_DOMAIN_LIST_REQ,
371372
SERVREG_GET_DOMAIN_LIST_REQ_MAX_LEN,
372373
servreg_get_domain_list_req_ei,
373374
req);
375+
mutex_unlock(&pdr->lock);
374376
if (ret < 0) {
375377
qmi_txn_cancel(&txn);
376378
return ret;

0 commit comments

Comments
 (0)