diff options
Diffstat (limited to 'drivers/soc/qcom/pdr_interface.c')
| -rw-r--r-- | drivers/soc/qcom/pdr_interface.c | 46 | 
1 files changed, 19 insertions, 27 deletions
diff --git a/drivers/soc/qcom/pdr_interface.c b/drivers/soc/qcom/pdr_interface.c index a1b6a4081dea..328b6153b2be 100644 --- a/drivers/soc/qcom/pdr_interface.c +++ b/drivers/soc/qcom/pdr_interface.c @@ -3,6 +3,7 @@   * Copyright (C) 2020 The Linux Foundation. All rights reserved.   */ +#include <linux/cleanup.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/slab.h> @@ -76,12 +77,12 @@ static int pdr_locator_new_server(struct qmi_handle *qmi,  					      locator_hdl);  	struct pdr_service *pds; +	mutex_lock(&pdr->lock);  	/* Create a local client port for QMI communication */  	pdr->locator_addr.sq_family = AF_QIPCRTR;  	pdr->locator_addr.sq_node = svc->node;  	pdr->locator_addr.sq_port = svc->port; -	mutex_lock(&pdr->lock);  	pdr->locator_init_complete = true;  	mutex_unlock(&pdr->lock); @@ -104,10 +105,10 @@ static void pdr_locator_del_server(struct qmi_handle *qmi,  	mutex_lock(&pdr->lock);  	pdr->locator_init_complete = false; -	mutex_unlock(&pdr->lock);  	pdr->locator_addr.sq_node = 0;  	pdr->locator_addr.sq_port = 0; +	mutex_unlock(&pdr->lock);  }  static const struct qmi_ops pdr_locator_ops = { @@ -365,12 +366,14 @@ static int pdr_get_domain_list(struct servreg_get_domain_list_req *req,  	if (ret < 0)  		return ret; +	mutex_lock(&pdr->lock);  	ret = qmi_send_request(&pdr->locator_hdl,  			       &pdr->locator_addr,  			       &txn, SERVREG_GET_DOMAIN_LIST_REQ,  			       SERVREG_GET_DOMAIN_LIST_REQ_MAX_LEN,  			       servreg_get_domain_list_req_ei,  			       req); +	mutex_unlock(&pdr->lock);  	if (ret < 0) {  		qmi_txn_cancel(&txn);  		return ret; @@ -394,13 +397,13 @@ static int pdr_get_domain_list(struct servreg_get_domain_list_req *req,  static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds)  { -	struct servreg_get_domain_list_resp *resp;  	struct servreg_get_domain_list_req req;  	struct servreg_location_entry *entry;  	int domains_read = 0;  	int ret, i; -	resp = kzalloc(sizeof(*resp), GFP_KERNEL); +	struct servreg_get_domain_list_resp *resp __free(kfree) = kzalloc(sizeof(*resp), +									  GFP_KERNEL);  	if (!resp)  		return -ENOMEM; @@ -413,9 +416,9 @@ static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds)  		req.domain_offset = domains_read;  		ret = pdr_get_domain_list(&req, resp, pdr);  		if (ret < 0) -			goto out; +			return ret; -		for (i = domains_read; i < resp->domain_list_len; i++) { +		for (i = 0; i < resp->domain_list_len; i++) {  			entry = &resp->domain_list[i];  			if (strnlen(entry->name, sizeof(entry->name)) == sizeof(entry->name)) @@ -425,7 +428,7 @@ static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds)  				pds->service_data_valid = entry->service_data_valid;  				pds->service_data = entry->service_data;  				pds->instance = entry->instance; -				goto out; +				return 0;  			}  		} @@ -438,8 +441,7 @@ static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds)  		domains_read += resp->domain_list_len;  	} while (domains_read < resp->total_domains); -out: -	kfree(resp); +  	return ret;  } @@ -515,8 +517,7 @@ struct pdr_service *pdr_add_lookup(struct pdr_handle *pdr,  				   const char *service_name,  				   const char *service_path)  { -	struct pdr_service *pds, *tmp; -	int ret; +	struct pdr_service *tmp;  	if (IS_ERR_OR_NULL(pdr))  		return ERR_PTR(-EINVAL); @@ -525,7 +526,7 @@ struct pdr_service *pdr_add_lookup(struct pdr_handle *pdr,  	    !service_path || strlen(service_path) > SERVREG_NAME_LENGTH)  		return ERR_PTR(-EINVAL); -	pds = kzalloc(sizeof(*pds), GFP_KERNEL); +	struct pdr_service *pds __free(kfree) = kzalloc(sizeof(*pds), GFP_KERNEL);  	if (!pds)  		return ERR_PTR(-ENOMEM); @@ -540,8 +541,7 @@ struct pdr_service *pdr_add_lookup(struct pdr_handle *pdr,  			continue;  		mutex_unlock(&pdr->list_lock); -		ret = -EALREADY; -		goto err; +		return ERR_PTR(-EALREADY);  	}  	list_add(&pds->node, &pdr->lookups); @@ -549,10 +549,7 @@ struct pdr_service *pdr_add_lookup(struct pdr_handle *pdr,  	schedule_work(&pdr->locator_work); -	return pds; -err: -	kfree(pds); -	return ERR_PTR(ret); +	return_ptr(pds);  }  EXPORT_SYMBOL_GPL(pdr_add_lookup); @@ -649,13 +646,12 @@ struct pdr_handle *pdr_handle_alloc(void (*status)(int state,  						   char *service_path,  						   void *priv), void *priv)  { -	struct pdr_handle *pdr;  	int ret;  	if (!status)  		return ERR_PTR(-EINVAL); -	pdr = kzalloc(sizeof(*pdr), GFP_KERNEL); +	struct pdr_handle *pdr __free(kfree) = kzalloc(sizeof(*pdr), GFP_KERNEL);  	if (!pdr)  		return ERR_PTR(-ENOMEM); @@ -674,10 +670,8 @@ struct pdr_handle *pdr_handle_alloc(void (*status)(int state,  	INIT_WORK(&pdr->indack_work, pdr_indack_work);  	pdr->notifier_wq = create_singlethread_workqueue("pdr_notifier_wq"); -	if (!pdr->notifier_wq) { -		ret = -ENOMEM; -		goto free_pdr_handle; -	} +	if (!pdr->notifier_wq) +		return ERR_PTR(-ENOMEM);  	pdr->indack_wq = alloc_ordered_workqueue("pdr_indack_wq", WQ_HIGHPRI);  	if (!pdr->indack_wq) { @@ -702,7 +696,7 @@ struct pdr_handle *pdr_handle_alloc(void (*status)(int state,  	if (ret < 0)  		goto release_qmi_handle; -	return pdr; +	return_ptr(pdr);  release_qmi_handle:  	qmi_handle_release(&pdr->locator_hdl); @@ -710,8 +704,6 @@ destroy_indack:  	destroy_workqueue(pdr->indack_wq);  destroy_notifier:  	destroy_workqueue(pdr->notifier_wq); -free_pdr_handle: -	kfree(pdr);  	return ERR_PTR(ret);  }  | 
