@@ -763,6 +763,7 @@ nvkm_vma_tail(struct nvkm_vma *vma, u64 tail)
763
763
new -> part = vma -> part ;
764
764
new -> user = vma -> user ;
765
765
new -> busy = vma -> busy ;
766
+ new -> mapped = vma -> mapped ;
766
767
list_add (& new -> head , & vma -> head );
767
768
return new ;
768
769
}
@@ -1112,10 +1113,11 @@ nvkm_vmm_unmap_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
1112
1113
1113
1114
nvkm_memory_tags_put (vma -> memory , vmm -> mmu -> subdev .device , & vma -> tags );
1114
1115
nvkm_memory_unref (& vma -> memory );
1116
+ vma -> mapped = false;
1115
1117
1116
- if (!vma -> part || ((prev = node (vma , prev )), prev -> memory ))
1118
+ if (!vma -> part || ((prev = node (vma , prev )), prev -> mapped ))
1117
1119
prev = NULL ;
1118
- if (!next -> part || next -> memory )
1120
+ if (!next -> part || next -> mapped )
1119
1121
next = NULL ;
1120
1122
nvkm_vmm_node_merge (vmm , prev , vma , next , vma -> size );
1121
1123
}
@@ -1274,6 +1276,7 @@ nvkm_vmm_map_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma,
1274
1276
nvkm_memory_tags_put (vma -> memory , vmm -> mmu -> subdev .device , & vma -> tags );
1275
1277
nvkm_memory_unref (& vma -> memory );
1276
1278
vma -> memory = nvkm_memory_ref (map -> memory );
1279
+ vma -> mapped = true;
1277
1280
vma -> tags = map -> tags ;
1278
1281
return 0 ;
1279
1282
}
@@ -1319,14 +1322,16 @@ nvkm_vmm_put_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
1319
1322
1320
1323
if (vma -> mapref || !vma -> sparse ) {
1321
1324
do {
1322
- const bool map = next -> memory != NULL ;
1325
+ const bool mem = next -> memory != NULL ;
1326
+ const bool map = next -> mapped ;
1323
1327
const u8 refd = next -> refd ;
1324
1328
const u64 addr = next -> addr ;
1325
1329
u64 size = next -> size ;
1326
1330
1327
1331
/* Merge regions that are in the same state. */
1328
1332
while ((next = node (next , next )) && next -> part &&
1329
- (next -> memory != NULL ) == map &&
1333
+ (next -> mapped == map ) &&
1334
+ (next -> memory != NULL ) == mem &&
1330
1335
(next -> refd == refd ))
1331
1336
size += next -> size ;
1332
1337
@@ -1351,7 +1356,7 @@ nvkm_vmm_put_locked(struct nvkm_vmm *vmm, struct nvkm_vma *vma)
1351
1356
*/
1352
1357
next = vma ;
1353
1358
do {
1354
- if (next -> memory )
1359
+ if (next -> mapped )
1355
1360
nvkm_vmm_unmap_region (vmm , next );
1356
1361
} while ((next = node (vma , next )) && next -> part );
1357
1362
0 commit comments