OSDN Git Service

drm/nouveau/fb: protect vram mm with private mutex
authorBen Skeggs <bskeggs@redhat.com>
Wed, 2 Dec 2020 06:31:23 +0000 (16:31 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 11 Feb 2021 00:14:07 +0000 (10:14 +1000)
nvkm_subdev.mutex is going away.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.c

index 38c2a5f..7fb5cd8 100644 (file)
@@ -132,6 +132,7 @@ struct nvkm_ram {
 #define NVKM_RAM_MM_MIXED  (NVKM_MM_HEAP_ANY + 3)
        struct nvkm_mm vram;
        u64 stolen;
+       struct mutex mutex;
 
        int ranks;
        int parts;
index b11867f..03b1bdb 100644 (file)
@@ -81,12 +81,12 @@ nvkm_vram_dtor(struct nvkm_memory *memory)
        struct nvkm_vram *vram = nvkm_vram(memory);
        struct nvkm_mm_node *next = vram->mn;
        struct nvkm_mm_node *node;
-       mutex_lock(&vram->ram->fb->subdev.mutex);
+       mutex_lock(&vram->ram->mutex);
        while ((node = next)) {
                next = node->next;
                nvkm_mm_free(&vram->ram->vram, &node);
        }
-       mutex_unlock(&vram->ram->fb->subdev.mutex);
+       mutex_unlock(&vram->ram->mutex);
        return vram;
 }
 
@@ -126,7 +126,7 @@ nvkm_ram_get(struct nvkm_device *device, u8 heap, u8 type, u8 rpage, u64 size,
        vram->page = page;
        *pmemory = &vram->memory;
 
-       mutex_lock(&ram->fb->subdev.mutex);
+       mutex_lock(&ram->mutex);
        node = &vram->mn;
        do {
                if (back)
@@ -134,7 +134,7 @@ nvkm_ram_get(struct nvkm_device *device, u8 heap, u8 type, u8 rpage, u64 size,
                else
                        ret = nvkm_mm_head(mm, heap, type, max, min, align, &r);
                if (ret) {
-                       mutex_unlock(&ram->fb->subdev.mutex);
+                       mutex_unlock(&ram->mutex);
                        nvkm_memory_unref(pmemory);
                        return ret;
                }
@@ -143,7 +143,7 @@ nvkm_ram_get(struct nvkm_device *device, u8 heap, u8 type, u8 rpage, u64 size,
                node = &r->next;
                max -= r->length;
        } while (max);
-       mutex_unlock(&ram->fb->subdev.mutex);
+       mutex_unlock(&ram->mutex);
        return 0;
 }
 
@@ -163,6 +163,7 @@ nvkm_ram_del(struct nvkm_ram **pram)
                if (ram->func->dtor)
                        *pram = ram->func->dtor(ram);
                nvkm_mm_fini(&ram->vram);
+               mutex_destroy(&ram->mutex);
                kfree(*pram);
                *pram = NULL;
        }
@@ -196,6 +197,7 @@ nvkm_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
        ram->fb = fb;
        ram->type = type;
        ram->size = size;
+       mutex_init(&ram->mutex);
 
        if (!nvkm_mm_initialised(&ram->vram)) {
                ret = nvkm_mm_init(&ram->vram, NVKM_RAM_MM_NORMAL, 0,