diff options
Diffstat (limited to 'drivers/infiniband/sw/rdmavt')
| -rw-r--r-- | drivers/infiniband/sw/rdmavt/mr.c | 10 | 
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/infiniband/sw/rdmavt/mr.c b/drivers/infiniband/sw/rdmavt/mr.c index 1b2e5362a3ff..cc429b567d0a 100644 --- a/drivers/infiniband/sw/rdmavt/mr.c +++ b/drivers/infiniband/sw/rdmavt/mr.c @@ -489,11 +489,13 @@ static int rvt_check_refs(struct rvt_mregion *mr, const char *t)  	unsigned long timeout;  	struct rvt_dev_info *rdi = ib_to_rvt(mr->pd->device); -	if (percpu_ref_is_zero(&mr->refcount)) -		return 0; -	/* avoid dma mr */ -	if (mr->lkey) +	if (mr->lkey) { +		/* avoid dma mr */  		rvt_dereg_clean_qps(mr); +		/* @mr was indexed on rcu protected @lkey_table */ +		synchronize_rcu(); +	} +  	timeout = wait_for_completion_timeout(&mr->comp, 5 * HZ);  	if (!timeout) {  		rvt_pr_err(rdi,  | 

