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

Commit 3acc958e authored by Yao Jiang's avatar Yao Jiang Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: hab: replace kref_get with kref_get_unless_zero



If refcount was 0 before increment, it maybe has a race condition that
this kref is freeing by some other thread right now. In this case we should
not increments refcount, so replace with kref_get_unless_zero.

Change-Id: Ic15eaefc111770a966094d05b19eca2a04d52fc2
Signed-off-by: default avatarYao Jiang <yaojia@codeaurora.org>
parent 3b8fc0b7
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -218,7 +218,15 @@ struct virtual_channel *hab_get_vchan_fromvcid(int32_t vcid,
	read_lock(&ctx->ctx_lock);
	read_lock(&ctx->ctx_lock);
	list_for_each_entry(vchan, &ctx->vchannels, node) {
	list_for_each_entry(vchan, &ctx->vchannels, node) {
		if (vcid == vchan->id) {
		if (vcid == vchan->id) {
			kref_get(&vchan->refcount);
			if (vchan->otherend_closed || vchan->closed ||
				!kref_get_unless_zero(&vchan->refcount)) {
				pr_debug("failed to inc vcid %x remote %x session %d refcnt %d close_flg remote %d local %d\n",
					vchan->id, vchan->otherend_id,
					vchan->session_id,
					get_refcnt(vchan->refcount),
					vchan->otherend_closed, vchan->closed);
				vchan = NULL;
			}
			read_unlock(&ctx->ctx_lock);
			read_unlock(&ctx->ctx_lock);
			return vchan;
			return vchan;
		}
		}