Skip to content

Commit 8e68271

Browse files
author
Ben Skeggs
committed
drm/nouveau/mmu: store mapped flag separately from memory pointer
This will be used to support a privileged client providing PTEs directly, without a memory object to use as a reference. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
1 parent 2606f29 commit 8e68271

File tree

2 files changed

+11
-5
lines changed
  • drivers/gpu/drm/nouveau

2 files changed

+11
-5
lines changed

drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ struct nvkm_vma {
1717
bool part:1; /* Region was split from an allocated region by map(). */
1818
bool user:1; /* Region user-allocated. */
1919
bool busy:1; /* Region busy (for temporarily preventing user access). */
20+
bool mapped:1; /* Region contains valid pages. */
2021
struct nvkm_memory *memory; /* Memory currently mapped into VMA. */
2122
struct nvkm_tags *tags; /* Compression tag reference. */
2223
};

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)