@@ -763,6 +763,7 @@ nvkm_vma_tail(struct nvkm_vma *vma, u64 tail)
763763 new -> part = vma -> part ;
764764 new -> user = vma -> user ;
765765 new -> busy = vma -> busy ;
766+ new -> mapped = vma -> mapped ;
766767 list_add (& new -> head , & vma -> head );
767768 return new ;
768769}
@@ -1112,10 +1113,11 @@ nvkm_vmm_unmap_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
11121113
11131114 nvkm_memory_tags_put (vma -> memory , vmm -> mmu -> subdev .device , & vma -> tags );
11141115 nvkm_memory_unref (& vma -> memory );
1116+ vma -> mapped = false;
11151117
1116- if (!vma -> part || ((prev = node (vma , prev )), prev -> memory ))
1118+ if (!vma -> part || ((prev = node (vma , prev )), prev -> mapped ))
11171119 prev = NULL ;
1118- if (!next -> part || next -> memory )
1120+ if (!next -> part || next -> mapped )
11191121 next = NULL ;
11201122 nvkm_vmm_node_merge (vmm , prev , vma , next , vma -> size );
11211123}
@@ -1274,6 +1276,7 @@ nvkm_vmm_map_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
12741276 nvkm_memory_tags_put (vma -> memory , vmm -> mmu -> subdev .device , & vma -> tags );
12751277 nvkm_memory_unref (& vma -> memory );
12761278 vma -> memory = nvkm_memory_ref (map -> memory );
1279+ vma -> mapped = true;
12771280 vma -> tags = map -> tags ;
12781281 return 0 ;
12791282}
@@ -1319,14 +1322,16 @@ nvkm_vmm_put_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
13191322
13201323 if (vma -> mapref || !vma -> sparse ) {
13211324 do {
1322- const bool map = next -> memory != NULL ;
1325+ const bool mem = next -> memory != NULL ;
1326+ const bool map = next -> mapped ;
13231327 const u8 refd = next -> refd ;
13241328 const u64 addr = next -> addr ;
13251329 u64 size = next -> size ;
13261330
13271331 /* Merge regions that are in the same state. */
13281332 while ((next = node (next , next )) && next -> part &&
1329- (next -> memory != NULL ) == map &&
1333+ (next -> mapped == map ) &&
1334+ (next -> memory != NULL ) == mem &&
13301335 (next -> refd == refd ))
13311336 size += next -> size ;
13321337
@@ -1351,7 +1356,7 @@ nvkm_vmm_put_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
13511356 */
13521357 next = vma ;
13531358 do {
1354- if (next -> memory )
1359+ if (next -> mapped )
13551360 nvkm_vmm_unmap_region (vmm , next );
13561361 } while ((next = node (vma , next )) && next -> part );
13571362
0 commit comments