summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_mem_migrate.c
diff options
context:
space:
mode:
authorToby Sunrise <tobyrs@google.com>2023-05-01 13:23:54 +0000
committerToby Sunrise <tobyrs@google.com>2023-05-01 13:33:11 +0000
commitf7a77046d77266482dedf54d134102e6031a7438 (patch)
tree4d6813894d79edb7ad605005087b0bce11055c4c /mali_kbase/mali_kbase_mem_migrate.c
parent25e383ffa36a9916065804029fbe3552c71329fe (diff)
downloadgpu-f7a77046d77266482dedf54d134102e6031a7438.tar.gz
Mali Valhall Android DDK r42p0-01eac0 KMD
Provenance: 300534375857cb2963042df7b788b1ab5616c500 (ipdelivery/EAC/v_r42p0) VX504X08X-BU-00000-r42p0-01eac0 - Valhall Android DDK VX504X08X-BU-60000-r42p0-01eac0 - Valhall Android Document Bundle VX504X08X-DC-11001-r42p0-01eac0 - Valhall Android DDK Software Errata VX504X08X-SW-99006-r42p0-01eac0 - Valhall Android Renderscript AOSP parts Change-Id: I3b15e01574f03706574a8edaf50dae4ba16e30c0
Diffstat (limited to 'mali_kbase/mali_kbase_mem_migrate.c')
-rw-r--r--mali_kbase/mali_kbase_mem_migrate.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/mali_kbase/mali_kbase_mem_migrate.c b/mali_kbase/mali_kbase_mem_migrate.c
index 8c62bd3..9c4b0d9 100644
--- a/mali_kbase/mali_kbase_mem_migrate.c
+++ b/mali_kbase/mali_kbase_mem_migrate.c
@@ -102,6 +102,7 @@ static void kbase_free_page_metadata(struct kbase_device *kbdev, struct page *p,
dma_unmap_page(dev, dma_addr, PAGE_SIZE, DMA_BIDIRECTIONAL);
kfree(page_md);
+ set_page_private(p, 0);
ClearPagePrivate(p);
}
@@ -456,7 +457,6 @@ static int kbase_page_migrate(struct page *new_page, struct page *old_page, enum
kbase_free_page_later(kbdev, new_page);
queue_work(mem_migrate->free_pages_workq, &mem_migrate->free_pages_work);
} else if (status_not_movable) {
- __ClearPageMovable(old_page);
err = -EINVAL;
} else if (status_mapped) {
err = kbasep_migrate_page_allocated_mapped(old_page, new_page);
@@ -464,6 +464,14 @@ static int kbase_page_migrate(struct page *new_page, struct page *old_page, enum
err = kbasep_migrate_page_pt_mapped(old_page, new_page);
}
+ /* While we want to preserve the movability of pages for which we return
+ * EAGAIN, according to the kernel docs, movable pages for which a critical
+ * error is returned are called putback on, which may not be what we
+ * expect.
+ */
+ if (err < 0 && err != -EAGAIN)
+ __ClearPageMovable(old_page);
+
return err;
}
@@ -485,6 +493,12 @@ static void kbase_page_putback(struct page *p)
struct kbase_page_metadata *page_md = kbase_page_private(p);
struct kbase_device *kbdev = NULL;
+ /* If we don't have page metadata, the page may not belong to the
+ * driver or may already have been freed, and there's nothing we can do
+ */
+ if (!page_md)
+ return;
+
spin_lock(&page_md->migrate_lock);
if (WARN_ON(!IS_PAGE_ISOLATED(page_md->status))) {