drm/nouveau/ttm: fix crash as a result of a recent ttm change
authorBen Skeggs <bskeggs@redhat.com>
Thu, 22 Dec 2011 05:20:21 +0000 (15:20 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 22 Dec 2011 05:23:25 +0000 (15:23 +1000)
"drm/ttm: callback move_notify any time bo placement change v4" failed to
avoid a NULL pointer dereference in nouveau caused by move_notify being
expected to handle that case now.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_vm.c
drivers/gpu/drm/nouveau/nouveau_vm.h

index f12dd0f39211869184cc7b4ad21fdd6132aa3ad8..8cf4a48f872ed2658563e08a1318a3fe219ef61e 100644 (file)
@@ -682,8 +682,7 @@ nouveau_vma_getmap(struct nouveau_channel *chan, struct nouveau_bo *nvbo,
        if (mem->mem_type == TTM_PL_VRAM)
                nouveau_vm_map(vma, node);
        else
-               nouveau_vm_map_sg(vma, 0, mem->num_pages << PAGE_SHIFT,
-                                 node, node->pages);
+               nouveau_vm_map_sg(vma, 0, mem->num_pages << PAGE_SHIFT, node);
 
        return 0;
 }
@@ -810,7 +809,6 @@ out:
 static void
 nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
 {
-       struct nouveau_mem *node = new_mem->mm_node;
        struct nouveau_bo *nvbo = nouveau_bo(bo);
        struct nouveau_vma *vma;
 
@@ -822,7 +820,7 @@ nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
                    nvbo->page_shift == vma->vm->spg_shift) {
                        nouveau_vm_map_sg(vma, 0, new_mem->
                                          num_pages << PAGE_SHIFT,
-                                         node, node->pages);
+                                         new_mem->mm_node);
                } else {
                        nouveau_vm_unmap(vma);
                }
@@ -1173,7 +1171,7 @@ nouveau_bo_vma_add(struct nouveau_bo *nvbo, struct nouveau_vm *vm,
                nouveau_vm_map(vma, nvbo->bo.mem.mm_node);
        else
        if (nvbo->bo.mem.mem_type == TTM_PL_TT)
-               nouveau_vm_map_sg(vma, 0, size, node, node->pages);
+               nouveau_vm_map_sg(vma, 0, size, node);
 
        list_add_tail(&vma->head, &nvbo->vma_list);
        vma->refcount = 1;
index ef0832b29ad2e94ee84e0cde3165fca8b8a4560e..2bf6c0350b4bbd4fdd5f380f488d4acb581ab978 100644 (file)
@@ -78,9 +78,10 @@ nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_mem *node)
 
 void
 nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
-                 struct nouveau_mem *mem, dma_addr_t *list)
+                 struct nouveau_mem *mem)
 {
        struct nouveau_vm *vm = vma->vm;
+       dma_addr_t *list = mem->pages;
        int big = vma->node->type != vm->spg_shift;
        u32 offset = vma->node->offset + (delta >> 12);
        u32 bits = vma->node->type - 12;
index 6ce995f7797e987d2043d9d8127f84fa83119f74..4fb6e728734d0db26b8d0c208819afe4c52fc1b2 100644 (file)
@@ -89,7 +89,7 @@ void nouveau_vm_map_at(struct nouveau_vma *, u64 offset, struct nouveau_mem *);
 void nouveau_vm_unmap(struct nouveau_vma *);
 void nouveau_vm_unmap_at(struct nouveau_vma *, u64 offset, u64 length);
 void nouveau_vm_map_sg(struct nouveau_vma *, u64 offset, u64 length,
-                      struct nouveau_mem *, dma_addr_t *);
+                      struct nouveau_mem *);
 
 /* nv50_vm.c */
 void nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,