mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-26 16:51:48 +00:00
114 lines
3.5 KiB
Diff
114 lines
3.5 KiB
Diff
From 4402e0d7858450f531f38aa7766233b4b8c8e1bb Mon Sep 17 00:00:00 2001
|
|
From: Qiang Yu <yuq825@gmail.com>
|
|
Date: Mon, 28 May 2018 17:36:59 +0800
|
|
Subject: [PATCH 066/146] drm/lima: wait bo fence before bo close
|
|
|
|
We can't bring preclose back, so use this
|
|
method for user application termination.
|
|
|
|
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
|
---
|
|
drivers/gpu/drm/lima/lima_drv.c | 9 +--------
|
|
drivers/gpu/drm/lima/lima_sched.c | 2 +-
|
|
drivers/gpu/drm/lima/lima_vm.c | 32 +++++++++++++++++++++++++++++++
|
|
3 files changed, 34 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c
|
|
index 7f2e47da6801..d3ab9f7abb93 100644
|
|
--- a/drivers/gpu/drm/lima/lima_drv.c
|
|
+++ b/drivers/gpu/drm/lima/lima_drv.c
|
|
@@ -270,17 +270,11 @@ static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file)
|
|
return err;
|
|
}
|
|
|
|
-static void lima_drm_driver_preclose(struct drm_device *dev, struct drm_file *file)
|
|
-{
|
|
- struct lima_drm_priv *priv = file->driver_priv;
|
|
-
|
|
- lima_ctx_mgr_fini(&priv->ctx_mgr);
|
|
-}
|
|
-
|
|
static void lima_drm_driver_postclose(struct drm_device *dev, struct drm_file *file)
|
|
{
|
|
struct lima_drm_priv *priv = file->driver_priv;
|
|
|
|
+ lima_ctx_mgr_fini(&priv->ctx_mgr);
|
|
lima_vm_put(priv->vm);
|
|
kfree(priv);
|
|
}
|
|
@@ -310,7 +304,6 @@ static const struct file_operations lima_drm_driver_fops = {
|
|
static struct drm_driver lima_drm_driver = {
|
|
.driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_PRIME,
|
|
.open = lima_drm_driver_open,
|
|
- .preclose = lima_drm_driver_preclose,
|
|
.postclose = lima_drm_driver_postclose,
|
|
.ioctls = lima_drm_driver_ioctls,
|
|
.num_ioctls = ARRAY_SIZE(lima_drm_driver_ioctls),
|
|
diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c
|
|
index 3b5ea2e4674d..89e758718d62 100644
|
|
--- a/drivers/gpu/drm/lima/lima_sched.c
|
|
+++ b/drivers/gpu/drm/lima/lima_sched.c
|
|
@@ -112,7 +112,7 @@ int lima_sched_task_init(struct lima_sched_task *task,
|
|
int err;
|
|
|
|
err = drm_sched_job_init(&task->base, context->base.sched,
|
|
- &context->base, context);
|
|
+ &context->base, vm);
|
|
if (err)
|
|
return err;
|
|
|
|
diff --git a/drivers/gpu/drm/lima/lima_vm.c b/drivers/gpu/drm/lima/lima_vm.c
|
|
index 11eb3c278df2..19a683c2921b 100644
|
|
--- a/drivers/gpu/drm/lima/lima_vm.c
|
|
+++ b/drivers/gpu/drm/lima/lima_vm.c
|
|
@@ -195,15 +195,47 @@ int lima_vm_bo_add(struct lima_vm *vm, struct lima_bo *bo)
|
|
return 0;
|
|
}
|
|
|
|
+/* wait only fence of resv from task using vm */
|
|
+static int lima_vm_wait_resv(struct lima_vm *vm,
|
|
+ struct reservation_object *resv)
|
|
+{
|
|
+ unsigned nr_fences;
|
|
+ struct dma_fence **fences;
|
|
+ int i;
|
|
+ long err;
|
|
+
|
|
+ err = reservation_object_get_fences_rcu(resv, NULL, &nr_fences, &fences);
|
|
+ if (err || !nr_fences)
|
|
+ return err;
|
|
+
|
|
+ for (i = 0; i < nr_fences; i++) {
|
|
+ struct drm_sched_fence *sf = to_drm_sched_fence(fences[i]);
|
|
+ if (sf && sf->owner == vm)
|
|
+ err |= dma_fence_wait(fences[i], false);
|
|
+ dma_fence_put(fences[i]);
|
|
+ }
|
|
+
|
|
+ kfree(fences);
|
|
+ return err;
|
|
+}
|
|
+
|
|
int lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo)
|
|
{
|
|
struct lima_bo_va *bo_va;
|
|
struct lima_bo_va_mapping *mapping, *tmp;
|
|
+ int err;
|
|
|
|
bo_va = lima_vm_bo_find(vm, bo);
|
|
if (--bo_va->ref_count > 0)
|
|
return 0;
|
|
|
|
+ /* wait bo idle before unmap it from vm in case user
|
|
+ * space application is terminated when bo is busy.
|
|
+ */
|
|
+ err = lima_vm_wait_resv(vm, bo->tbo.resv);
|
|
+ if (err)
|
|
+ dev_err(vm->dev->dev, "bo del fail to wait (%d)\n", err);
|
|
+
|
|
list_for_each_entry_safe(mapping, tmp, &bo_va->mapping, list) {
|
|
lima_vm_unmap(vm, mapping);
|
|
}
|
|
--
|
|
2.17.1
|
|
|