diff options
author | Toby Sunrise <tobyrs@google.com> | 2023-05-01 13:23:54 +0000 |
---|---|---|
committer | Toby Sunrise <tobyrs@google.com> | 2023-05-01 13:33:11 +0000 |
commit | f7a77046d77266482dedf54d134102e6031a7438 (patch) | |
tree | 4d6813894d79edb7ad605005087b0bce11055c4c /mali_kbase/mali_kbase_mem_migrate.c | |
parent | 25e383ffa36a9916065804029fbe3552c71329fe (diff) | |
download | gpu-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.c | 16 |
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))) { |