On 14.07.25 16:42, Wei Yang wrote:
On Fri, Jul 11, 2025 at 05:39:39PM +0200, David Hildenbrand wrote:
On 04.06.25 10:34, Wei Yang wrote:
On Wed, Jun 04, 2025 at 08:21:45AM +0000, Wei Yang wrote: [...]
+int try_to_move_page(char *region) +{
- int ret;
- int node;
- int status = 0;
- ksft_print_msg("worker %d move_pages of content: %.15s\n", getpid(), region);
One thing confused me here.
If I don't access region here, the following move_pages() would report -ENOENT occationally. The reason is do_pages_stat_array() -> folio_walk_start() returns NULL.
Right, the pages were not faulted in. The man page mentions that as
"-ENOENT: The page is not present."
Thanks I see the man page, but from the code point of view, I don't follow it.
The move_pages() return -ENOENT in a child process, and the child duplicate it memory space during fork().
dup_mmap() for_each_vma() copy_page_range() ... copy_pte_range() -> copy_present_ptes() __copy_present_ptes() set_ptes()
Even we map the range by MAP_SHARED, we don't need to wrprotect it. But we still set_ptes() in the child process page table.
So it looks the child has prepared the page table and not need to fault in to setup it.
Do I miss something?
See copy_page_range() -> vma_needs_copy(), where we essentially optimize-out copying of page tables for most MAP_SHARED mappings (or MAP_PRIVATE mappings when we never placed private pages).