diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-08-20 14:54:17 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-08-28 12:40:35 +1000 |
commit | 1de68568d69ac518db076cc6118af91e930b5f90 (patch) | |
tree | 1da6741149cc84fc05c3ad42571df363a035bacf /drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c | |
parent | 524bdbf2025d44cdea672511d21012a52b427374 (diff) | |
download | talos-obmc-linux-1de68568d69ac518db076cc6118af91e930b5f90.tar.gz talos-obmc-linux-1de68568d69ac518db076cc6118af91e930b5f90.zip |
drm/nouveau/mmu: protect each vm with its own mutex
An upcoming commit requires being able to modify the PRAMIN BAR page
tables while already holding the MMU subdev mutex.
To solve this issue, each VM has been given its own mutex. As a nice
side-effect, this also allows separate VMs to be updated concurrently.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c index b997d8d128c5..01e26213fd88 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c @@ -77,9 +77,10 @@ gf100_bar_unmap(struct nvkm_bar *bar, struct nvkm_vma *vma) nvkm_vm_put(vma); } + static int gf100_bar_ctor_vm(struct gf100_bar *bar, struct gf100_bar_vm *bar_vm, - int bar_nr) + struct lock_class_key *key, int bar_nr) { struct nvkm_device *device = nv_device(&bar->base); struct nvkm_vm *vm; @@ -98,7 +99,7 @@ gf100_bar_ctor_vm(struct gf100_bar *bar, struct gf100_bar_vm *bar_vm, bar_len = nv_device_resource_len(device, bar_nr); - ret = nvkm_vm_new(device, 0, bar_len, 0, &vm); + ret = nvkm_vm_new(device, 0, bar_len, 0, key, &vm); if (ret) return ret; @@ -136,6 +137,8 @@ gf100_bar_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, struct nvkm_object **pobject) { + static struct lock_class_key bar1_lock; + static struct lock_class_key bar3_lock; struct nvkm_device *device = nv_device(parent); struct gf100_bar *bar; bool has_bar3 = nv_device_resource_len(device, 3) != 0; @@ -148,13 +151,13 @@ gf100_bar_ctor(struct nvkm_object *parent, struct nvkm_object *engine, /* BAR3 */ if (has_bar3) { - ret = gf100_bar_ctor_vm(bar, &bar->bar[0], 3); + ret = gf100_bar_ctor_vm(bar, &bar->bar[0], &bar3_lock, 3); if (ret) return ret; } /* BAR1 */ - ret = gf100_bar_ctor_vm(bar, &bar->bar[1], 1); + ret = gf100_bar_ctor_vm(bar, &bar->bar[1], &bar1_lock, 1); if (ret) return ret; |