summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2017-05-19 23:59:35 +1000
committerBen Skeggs <bskeggs@redhat.com>2017-06-16 14:04:52 +1000
commit3607bfd398204ddb11f63c09b1cc608adf85f96c (patch)
treeac276e7c019fd7db2dac46270a81647fcfd9586c /drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
parent7d0a01a6dec9737d24be5ac223e73a0725eac8a0 (diff)
downloadop-kernel-dev-3607bfd398204ddb11f63c09b1cc608adf85f96c.zip
op-kernel-dev-3607bfd398204ddb11f63c09b1cc608adf85f96c.tar.gz
drm/nouveau/disp/nv50-: execute supervisor on its own workqueue
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c')
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
index acc6630..21bdf30 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
@@ -111,6 +111,8 @@ nv50_disp_dtor_(struct nvkm_disp *base)
{
struct nv50_disp *disp = nv50_disp(base);
nvkm_event_fini(&disp->uevent);
+ if (disp->wq)
+ destroy_workqueue(disp->wq);
return disp;
}
@@ -136,7 +138,6 @@ nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device,
if (!(disp = kzalloc(sizeof(*disp), GFP_KERNEL)))
return -ENOMEM;
- INIT_WORK(&disp->supervisor, func->super);
disp->func = func;
*pdisp = &disp->base;
@@ -144,6 +145,11 @@ nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device,
if (ret)
return ret;
+ disp->wq = create_singlethread_workqueue("nvkm-disp");
+ if (!disp->wq)
+ return -ENOMEM;
+ INIT_WORK(&disp->supervisor, func->super);
+
for (i = 0; func->head.new && i < heads; i++) {
ret = func->head.new(&disp->base, i);
if (ret)
@@ -803,7 +809,7 @@ nv50_disp_intr(struct nv50_disp *disp)
if (intr1 & 0x00000070) {
disp->super = (intr1 & 0x00000070);
- schedule_work(&disp->supervisor);
+ queue_work(disp->wq, &disp->supervisor);
nvkm_wr32(device, 0x610024, disp->super);
}
}
OpenPOWER on IntegriCloud