diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.c index dfa70252bcf1..8526688b7b12 100644 --- a/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.c +++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note /* * - * (C) COPYRIGHT 2022 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2022-2023 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -51,8 +51,10 @@ bool kbase_alloc_page_metadata(struct kbase_device *kbdev, struct page *p, dma_a spin_lock_init(&page_md->migrate_lock); lock_page(p); - if (kbdev->mem_migrate.mapping) + if (kbdev->mem_migrate.mapping) { __SetPageMovable(p, kbdev->mem_migrate.mapping); + page_md->status = PAGE_MOVABLE_SET(page_md->status); + } unlock_page(p); return true; @@ -81,6 +83,7 @@ static void kbase_free_pages_worker(struct work_struct *work) container_of(work, struct kbase_mem_migrate, free_pages_work); struct kbase_device *kbdev = container_of(mem_migrate, struct kbase_device, mem_migrate); struct page *p, *tmp; + struct kbase_page_metadata *page_md; LIST_HEAD(free_list); spin_lock(&mem_migrate->free_pages_lock); @@ -91,8 +94,11 @@ static void kbase_free_pages_worker(struct work_struct *work) list_del_init(&p->lru); lock_page(p); - if (PageMovable(p)) + page_md = kbase_page_private(p); + if (IS_PAGE_MOVABLE(page_md->status)) { __ClearPageMovable(p); + page_md->status = PAGE_MOVABLE_CLEAR(page_md->status); + } unlock_page(p); kbase_free_page_metadata(kbdev, p); @@ -246,6 +252,7 @@ static int kbase_page_migrate(struct address_space *mapping, struct page *new_pa kbase_free_page_metadata(kbdev, old_page); __ClearPageMovable(old_page); + page_md->status = PAGE_MOVABLE_CLEAR(page_md->status); /* Just free new page to avoid lock contention. */ INIT_LIST_HEAD(&new_page->lru); @@ -302,6 +309,7 @@ static void kbase_page_putback(struct page *p) struct kbase_mem_migrate *mem_migrate = &kbdev->mem_migrate; __ClearPageMovable(p); + page_md->status = PAGE_MOVABLE_CLEAR(page_md->status); list_del_init(&p->lru); kbase_free_page_later(kbdev, p); queue_work(mem_migrate->free_pages_workq, &mem_migrate->free_pages_work); diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.h index 6610c0ccc40c..d4796327b8d7 100644 --- a/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.h +++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_migrate.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* * - * (C) COPYRIGHT 2022 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2022-2023 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -23,13 +23,22 @@ * DOC: Base kernel page migration implementation. */ -#define PAGE_STATUS_MASK ((u8)0x7F) +#define PAGE_STATUS_MASK ((u8)0x3F) #define PAGE_STATUS_GET(status) (status & PAGE_STATUS_MASK) #define PAGE_STATUS_SET(status, value) ((status & ~PAGE_STATUS_MASK) | (value & PAGE_STATUS_MASK)) + #define PAGE_ISOLATE_SHIFT (7) +#define PAGE_ISOLATE_MASK ((u8)1 << PAGE_ISOLATE_SHIFT) #define PAGE_ISOLATE_SET(status, value) \ - ((status & PAGE_STATUS_MASK) | (value << PAGE_ISOLATE_SHIFT)) -#define IS_PAGE_ISOLATED(status) ((bool)(status & ~PAGE_STATUS_MASK)) + ((status & ~PAGE_ISOLATE_MASK) | (value << PAGE_ISOLATE_SHIFT)) +#define IS_PAGE_ISOLATED(status) ((bool)(status & PAGE_ISOLATE_MASK)) + +#define PAGE_MOVABLE_SHIFT (6) +#define PAGE_MOVABLE_MASK ((u8)1 << PAGE_MOVABLE_SHIFT) +#define PAGE_MOVABLE_CLEAR(status) ((status) & ~PAGE_MOVABLE_MASK) +#define PAGE_MOVABLE_SET(status) (status | PAGE_MOVABLE_MASK) + +#define IS_PAGE_MOVABLE(status) ((bool)(status & PAGE_MOVABLE_MASK)) /* Global integer used to determine if module parameter value has been * provided and if page migration feature is enabled.