How to free a page table page
Hello there, I'm trying to manage a custom page table list for my toy project. A basic process of the custom list is to allocate few pages (struct page) to the list from the buddy allocator and the list will give some pages when a user process needs page table pages. In contrast, when this process terminates, page table pages will return to the list. Finally, when the list is not needed, all pages will be delivered to the buddy allocator. This relationship can be described as: process - custom list - buddy allocator My problem is that a user process' page table pages (pud, pmd, pte) seem to free their page to the buddy allocator instead of to the custom list. (allocation works. I've checked it) I put my custom functions in release_pages / free_unref_page / free_unref_page_list, but somehow the functions do not work as I intended. (Actually the functions are not called so I may choose the wrong functions.) So, I was wondering whether I intercepted the right functions (three functions above). Also, I have a question about freeing a page-table page. 1. In x86, are all page-table pages released at the end of termination by using free_pgtables()? 2. In x86, a page-table page can be freed when there is no entry? In other words, does the Linux kernel release a page-table page on runtime? If so, what function would do this kind of task? I'm trying to find freeing functions, but I can't find them and I'm not sure when this kind of function is called. (I'm pretty sure that pte_free / pmd_free / pud_free functions are not for this case.) Any help would be greatly appreciated. Regards, Wonkyo
I really appreciate it! Sent from my iPhone
On Apr 5, 2021, at 11:39 PM, Wonkyo Choe <heysid3@gmail.com> wrote:
Hello there,
I'm trying to manage a custom page table list for my toy project. A basic process of the custom list is to allocate few pages (struct page) to the list from the buddy allocator and the list will give some pages when a user process needs page table pages. In contrast, when this process terminates, page table pages will return to the list. Finally, when the list is not needed, all pages will be delivered to the buddy allocator.
This relationship can be described as: process - custom list - buddy allocator
My problem is that a user process' page table pages (pud, pmd, pte) seem to free their page to the buddy allocator instead of to the custom list. (allocation works. I've checked it) I put my custom functions in release_pages / free_unref_page / free_unref_page_list, but somehow the functions do not work as I intended. (Actually the functions are not called so I may choose the wrong functions.)
So, I was wondering whether I intercepted the right functions (three functions above). Also, I have a question about freeing a page-table page.
1. In x86, are all page-table pages released at the end of termination by using free_pgtables()? 2. In x86, a page-table page can be freed when there is no entry? In other words, does the Linux kernel release a page-table page on runtime? If so, what function would do this kind of task? I'm trying to find freeing functions, but I can't find them and I'm not sure when this kind of function is called. (I'm pretty sure that pte_free / pmd_free / pud_free functions are not for this case.)
Any help would be greatly appreciated.
Regards, Wonkyo
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On Tue, 2021-04-06 at 00:39 +0900, Wonkyo Choe wrote:
1. In x86, are all page-table pages released at the end of termination by using free_pgtables()? 2. In x86, a page-table page can be freed when there is no entry? In other words, does the Linux kernel release a page-table page on runtime? If so, what function would do this kind of task?
At munmap time, as well as exit and execve time, page tables can get freed. Look at the code between sys_munmap() and zap_page_range(). -- All Rights Reversed.
I really appreciate it! I really needed to know when exactly page tables get freed. As I looked at your functions, I ended up figuring out that my kernel (v5.3) defines HAVE_RCU_TABLE_FREE (I assume this is the default option) and uses __tlb_remove_table(), which frees pages. Finally, my functions work on these functions. Thanks again. 2021년 4월 6일 (화) 오전 11:42, Rik van Riel <riel@surriel.com>님이 작성:
On Tue, 2021-04-06 at 00:39 +0900, Wonkyo Choe wrote:
1. In x86, are all page-table pages released at the end of termination by using free_pgtables()? 2. In x86, a page-table page can be freed when there is no entry? In other words, does the Linux kernel release a page-table page on runtime? If so, what function would do this kind of task?
At munmap time, as well as exit and execve time, page tables can get freed. Look at the code between sys_munmap() and zap_page_range().
-- All Rights Reversed.
-- ======================= 최원교 / Wonkyo Choe Phone. +82 10-5755-4519 =======================
participants (3)
-
linux lover -
Rik van Riel -
Wonkyo Choe