IB/hfi1: Reserve user expected TIDs
[ Upstream commit ecf91551cdd2925ed6d9a9d99074fa5f67b90596 ]
To avoid a race, reserve the number of user expected
TIDs before setup.
Fixes: 7e7a436ecb
("staging/hfi1: Add TID entry program function body")
Signed-off-by: Dean Luick <dean.luick@cornelisnetworks.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
Link: https://lore.kernel.org/r/167328547636.1472310.7419712824785353905.stgit@awfm-02.cornelisnetworks.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
d307c75f43
commit
f5c918dc4e
@ -351,16 +351,13 @@ int hfi1_user_exp_rcv_setup(struct hfi1_filedata *fd,
|
|||||||
/* Find sets of physically contiguous pages */
|
/* Find sets of physically contiguous pages */
|
||||||
tidbuf->n_psets = find_phys_blocks(tidbuf, pinned);
|
tidbuf->n_psets = find_phys_blocks(tidbuf, pinned);
|
||||||
|
|
||||||
/*
|
/* Reserve the number of expected tids to be used. */
|
||||||
* We don't need to access this under a lock since tid_used is per
|
|
||||||
* process and the same process cannot be in hfi1_user_exp_rcv_clear()
|
|
||||||
* and hfi1_user_exp_rcv_setup() at the same time.
|
|
||||||
*/
|
|
||||||
spin_lock(&fd->tid_lock);
|
spin_lock(&fd->tid_lock);
|
||||||
if (fd->tid_used + tidbuf->n_psets > fd->tid_limit)
|
if (fd->tid_used + tidbuf->n_psets > fd->tid_limit)
|
||||||
pageset_count = fd->tid_limit - fd->tid_used;
|
pageset_count = fd->tid_limit - fd->tid_used;
|
||||||
else
|
else
|
||||||
pageset_count = tidbuf->n_psets;
|
pageset_count = tidbuf->n_psets;
|
||||||
|
fd->tid_used += pageset_count;
|
||||||
spin_unlock(&fd->tid_lock);
|
spin_unlock(&fd->tid_lock);
|
||||||
|
|
||||||
if (!pageset_count)
|
if (!pageset_count)
|
||||||
@ -469,10 +466,11 @@ unlock:
|
|||||||
nomem:
|
nomem:
|
||||||
hfi1_cdbg(TID, "total mapped: tidpairs:%u pages:%u (%d)", tididx,
|
hfi1_cdbg(TID, "total mapped: tidpairs:%u pages:%u (%d)", tididx,
|
||||||
mapped_pages, ret);
|
mapped_pages, ret);
|
||||||
|
/* adjust reserved tid_used to actual count */
|
||||||
|
spin_lock(&fd->tid_lock);
|
||||||
|
fd->tid_used -= pageset_count - tididx;
|
||||||
|
spin_unlock(&fd->tid_lock);
|
||||||
if (tididx) {
|
if (tididx) {
|
||||||
spin_lock(&fd->tid_lock);
|
|
||||||
fd->tid_used += tididx;
|
|
||||||
spin_unlock(&fd->tid_lock);
|
|
||||||
tinfo->tidcnt = tididx;
|
tinfo->tidcnt = tididx;
|
||||||
tinfo->length = mapped_pages * PAGE_SIZE;
|
tinfo->length = mapped_pages * PAGE_SIZE;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user