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:
parent
3b8fc0b7a3
commit
3acc958e8d
1 changed files with 9 additions and 1 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue