Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions src/nvidia/src/libraries/mapping_reuse/mapping_reuse.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ reusemappingdbUnmap
{
ReuseMappingDbEntry *pEntry = mapFindGEQ(&(pReuseMappingDb->virtualMap), range.start);
NvU64 curOffset = range.start;
NvBool bFirstRange = NV_TRUE;
NvU64 unmapLimit = mrangeLimit(range);

while (pEntry != NULL)
{
Expand All @@ -100,14 +100,20 @@ reusemappingdbUnmap
// Only unmap ranges contained within the desired unmap range
if (!mrangeContains(range, revRange))
{
if (bFirstRange)
//
// This entry is not ours to remove. Anything still left below it
// inside the requested range is untracked VA and must be released
// by the overhang unmap below. Clamp to this entry's start so that
// an entry straddling the end of the range is never unmapped from
// underneath its remaining references.
//
if (revOffset < unmapLimit)
{
break;
unmapLimit = revOffset;
}
return;
break;
}

bFirstRange = NV_FALSE;
curOffset = mrangeLimit(revRange);

// Unmap any partial range not tracked by data structure
Expand Down Expand Up @@ -136,9 +142,9 @@ reusemappingdbUnmap
}

// Take care of any overhang.
if (mrangeLimit(range) != curOffset)
if (unmapLimit > curOffset)
{
MemoryRange diffRange = mrangeMake(curOffset, mrangeLimit(range) - curOffset);
MemoryRange diffRange = mrangeMake(curOffset, unmapLimit - curOffset);
pReuseMappingDb->pUnmapCb(pReuseMappingDb->pGlobalCtx, pAllocCtx, diffRange);
}
}
Expand Down