Skip to content

Commit 46dec61

Browse files
thierryredingairlied
authored andcommitted
drm/nouveau: Fixup gk20a instobj hierarchy
Commit 12c9b05 ("drm/nouveau/imem: support allocations not preserved across suspend") uses container_of() to cast from struct nvkm_memory to struct nvkm_instobj, assuming that all instance objects are derived from struct nvkm_instobj. For the gk20a family that's not the case and they are derived from struct nvkm_memory instead. This causes some subtle data corruption (nvkm_instobj.preserve ends up mapping to gk20a_instobj.vaddr) that causes a NULL pointer dereference in gk20a_instobj_acquire_iommu() (and possibly elsewhere) and also prevents suspend/resume from working. Fix this by making struct gk20a_instobj derive from struct nvkm_instobj instead. Fixes: 12c9b05 ("drm/nouveau/imem: support allocations not preserved across suspend") Reported-by: Jonathan Hunter <jonathanh@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231208104653.1917055-1-thierry.reding@gmail.com
1 parent f8678a3 commit 46dec61

1 file changed

Lines changed: 9 additions & 9 deletions

File tree

  • drivers/gpu/drm/nouveau/nvkm/subdev/instmem

drivers/gpu/drm/nouveau/nvkm/subdev/instmem/gk20a.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@
4949
#include <subdev/mmu.h>
5050

5151
struct gk20a_instobj {
52-
struct nvkm_memory memory;
52+
struct nvkm_instobj base;
5353
struct nvkm_mm_node *mn;
5454
struct gk20a_instmem *imem;
5555

5656
/* CPU mapping */
5757
u32 *vaddr;
5858
};
59-
#define gk20a_instobj(p) container_of((p), struct gk20a_instobj, memory)
59+
#define gk20a_instobj(p) container_of((p), struct gk20a_instobj, base.memory)
6060

6161
/*
6262
* Used for objects allocated using the DMA API
@@ -148,7 +148,7 @@ gk20a_instobj_iommu_recycle_vaddr(struct gk20a_instobj_iommu *obj)
148148
list_del(&obj->vaddr_node);
149149
vunmap(obj->base.vaddr);
150150
obj->base.vaddr = NULL;
151-
imem->vaddr_use -= nvkm_memory_size(&obj->base.memory);
151+
imem->vaddr_use -= nvkm_memory_size(&obj->base.base.memory);
152152
nvkm_debug(&imem->base.subdev, "vaddr used: %x/%x\n", imem->vaddr_use,
153153
imem->vaddr_max);
154154
}
@@ -283,7 +283,7 @@ gk20a_instobj_map(struct nvkm_memory *memory, u64 offset, struct nvkm_vmm *vmm,
283283
{
284284
struct gk20a_instobj *node = gk20a_instobj(memory);
285285
struct nvkm_vmm_map map = {
286-
.memory = &node->memory,
286+
.memory = &node->base.memory,
287287
.offset = offset,
288288
.mem = node->mn,
289289
};
@@ -391,8 +391,8 @@ gk20a_instobj_ctor_dma(struct gk20a_instmem *imem, u32 npages, u32 align,
391391
return -ENOMEM;
392392
*_node = &node->base;
393393

394-
nvkm_memory_ctor(&gk20a_instobj_func_dma, &node->base.memory);
395-
node->base.memory.ptrs = &gk20a_instobj_ptrs;
394+
nvkm_memory_ctor(&gk20a_instobj_func_dma, &node->base.base.memory);
395+
node->base.base.memory.ptrs = &gk20a_instobj_ptrs;
396396

397397
node->base.vaddr = dma_alloc_attrs(dev, npages << PAGE_SHIFT,
398398
&node->handle, GFP_KERNEL,
@@ -438,8 +438,8 @@ gk20a_instobj_ctor_iommu(struct gk20a_instmem *imem, u32 npages, u32 align,
438438
*_node = &node->base;
439439
node->dma_addrs = (void *)(node->pages + npages);
440440

441-
nvkm_memory_ctor(&gk20a_instobj_func_iommu, &node->base.memory);
442-
node->base.memory.ptrs = &gk20a_instobj_ptrs;
441+
nvkm_memory_ctor(&gk20a_instobj_func_iommu, &node->base.base.memory);
442+
node->base.base.memory.ptrs = &gk20a_instobj_ptrs;
443443

444444
/* Allocate backing memory */
445445
for (i = 0; i < npages; i++) {
@@ -533,7 +533,7 @@ gk20a_instobj_new(struct nvkm_instmem *base, u32 size, u32 align, bool zero,
533533
else
534534
ret = gk20a_instobj_ctor_dma(imem, size >> PAGE_SHIFT,
535535
align, &node);
536-
*pmemory = node ? &node->memory : NULL;
536+
*pmemory = node ? &node->base.memory : NULL;
537537
if (ret)
538538
return ret;
539539

0 commit comments

Comments
 (0)