From fd8df3a623d8a06a10df40a7b63f054af06047c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Thu, 17 Mar 2022 17:10:27 +0100 Subject: [PATCH] lx_emul: handle page refcount --- repos/dde_linux/src/lib/lx_emul/shadow/mm/page_alloc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/mm/page_alloc.c b/repos/dde_linux/src/lib/lx_emul/shadow/mm/page_alloc.c index 8fbd9a8dd2..a18697bfcb 100644 --- a/repos/dde_linux/src/lib/lx_emul/shadow/mm/page_alloc.c +++ b/repos/dde_linux/src/lib/lx_emul/shadow/mm/page_alloc.c @@ -46,6 +46,9 @@ void __free_pages(struct page * page, unsigned int order) unsigned const num_pages = (1 << order); void * const virt_addr = page->virtual; + if (atomic_read(&page->_refcount) && !atomic_dec_and_test(&page->_refcount)) + return; + for (i = 0; i < num_pages; i++) lx_emul_disassociate_page_from_virt_addr(page[i].virtual); @@ -66,6 +69,8 @@ struct page * __alloc_pages(gfp_t gfp, unsigned int order, int preferred_nid, void const *ptr = lx_emul_mem_alloc_aligned(PAGE_SIZE*nr_pages, PAGE_SIZE); struct page *page = lx_emul_virt_to_pages(ptr, nr_pages); + atomic_set(&page->_refcount, 1); + return page; } #endif