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: Yao Jiang <yaojia@codeaurora.org>
This commit is contained in:
Yao Jiang 2018-09-27 11:53:55 +08:00 committed by Gerrit - the friendly Code Review server
parent 3b8fc0b7a3
commit 3acc958e8d

View file

@ -218,7 +218,15 @@ struct virtual_channel *hab_get_vchan_fromvcid(int32_t vcid,
read_lock(&ctx->ctx_lock);
list_for_each_entry(vchan, &ctx->vchannels, node) {
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);
return vchan;
}