Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ebfebb9 authored by Michael Adisumarta's avatar Michael Adisumarta Committed by Gerrit - the friendly Code Review server
Browse files

msm: ipa: add check to see if pm client is not NULL



Add check to see if it is freed in pm deregister context
and trying to read again after free.

Change-Id: I764f012d0c7cd53f126aee221f7c1d6a914b7390
Signed-off-by: default avatarMichael Adisumarta <madisuma@codeaurora.org>
parent 1aba8c44
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2017-2018, 2020 The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -1220,14 +1220,15 @@ int ipa_pm_set_perf_profile(u32 hdl, int throughput)
		return -EINVAL;
	}

	mutex_lock(&ipa_pm_ctx->client_mutex);
	if (hdl >= IPA_PM_MAX_CLIENTS || ipa_pm_ctx->clients[hdl] == NULL
		|| throughput < 0) {
		IPA_PM_ERR("Invalid Params\n");
		mutex_unlock(&ipa_pm_ctx->client_mutex);
		return -EINVAL;
	}
	client = ipa_pm_ctx->clients[hdl];

	mutex_lock(&ipa_pm_ctx->client_mutex);
	if (client->group == IPA_PM_GROUP_DEFAULT)
		IPA_PM_DBG_LOW("Old throughput: %d\n",  client->throughput);
	else
@@ -1246,6 +1247,7 @@ int ipa_pm_set_perf_profile(u32 hdl, int throughput)
			client->group, ipa_pm_ctx->group_tput[client->group]);
	mutex_unlock(&ipa_pm_ctx->client_mutex);

	if (ipa_pm_ctx->clients[hdl]) {
		spin_lock_irqsave(&client->state_lock, flags);
		if (IPA_PM_STATE_ACTIVE(client->state) || (client->group !=
			IPA_PM_GROUP_DEFAULT)) {
@@ -1254,6 +1256,7 @@ int ipa_pm_set_perf_profile(u32 hdl, int throughput)
			return 0;
		}
		spin_unlock_irqrestore(&client->state_lock, flags);
	}

	return 0;
}