aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIcecream95 <[email protected]>2020-06-05 16:52:23 +1200
committerMarge Bot <[email protected]>2020-06-05 23:51:32 +0000
commita61532e4dbdf4fbbf5822daeb5907efaf584a375 (patch)
tree086a0f6f5fa4bb6621330c9ca69ab39d94bfc3a5 /src
parentd97aaad1555ad25fd13af588aa02f9ff3e081e34 (diff)
Revert "panfrost: Keep cached BOs mmap'd"
This reverts commit 794c239a990e08b5a42d42607e9c5e5b0921390c. A kernel bug causes cached BOs to not be unmapped correctly, triggering "bad page cache" kernel messages and causing short hangs. Reviewed-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5355>
Diffstat (limited to 'src')
-rw-r--r--src/panfrost/encoder/pan_bo.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/panfrost/encoder/pan_bo.c b/src/panfrost/encoder/pan_bo.c
index a663d35d5b8..32fc84e1363 100644
--- a/src/panfrost/encoder/pan_bo.c
+++ b/src/panfrost/encoder/pan_bo.c
@@ -90,11 +90,6 @@ panfrost_bo_free(struct panfrost_bo *bo)
struct drm_gem_close gem_close = { .handle = bo->gem_handle };
int ret;
- if (bo->cpu && os_munmap((void *) (uintptr_t)bo->cpu, bo->size)) {
- perror("munmap");
- abort();
- }
-
ret = drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
if (ret) {
fprintf(stderr, "DRM_IOCTL_GEM_CLOSE failed: %m\n");
@@ -349,6 +344,20 @@ panfrost_bo_mmap(struct panfrost_bo *bo)
}
}
+static void
+panfrost_bo_munmap(struct panfrost_bo *bo)
+{
+ if (!bo->cpu)
+ return;
+
+ if (os_munmap((void *) (uintptr_t)bo->cpu, bo->size)) {
+ perror("munmap");
+ abort();
+ }
+
+ bo->cpu = NULL;
+}
+
struct panfrost_bo *
panfrost_bo_create(struct panfrost_device *dev, size_t size,
uint32_t flags)
@@ -427,6 +436,9 @@ panfrost_bo_unreference(struct panfrost_bo *bo)
if (p_atomic_read(&bo->refcnt) == 0) {
_mesa_set_remove_key(bo->dev->active_bos, bo);
+ /* When the reference count goes to zero, we need to cleanup */
+ panfrost_bo_munmap(bo);
+
/* Rather than freeing the BO now, we'll cache the BO for later
* allocations if we're allowed to.
*/