mm: do not let vdso pages into LRU rotation
Subsystems (2)
PATCH 1/1 mm: do not let vdso pages into LRU rotation
Hi,
I noticed that vdso pages are faulted and unmapped as if they were regular file pages. And I'm guessing this is so that the vdso mappings are able to use the generic COW code in memory.c.
However, it's a little unsettling that zap_pte_range() makes decisions based on PageAnon() and the page even reaches mark_page_accessed(), as that function makes several assumptions about the page being a regular LRU user page. It seems this isn't crashing today by sheer luck, but I am working on code that does when page_is_file_cache() returns garbage.
I'm using this hack to work around it:
mm/memory.c +2 -1
@@ -1121,7 +1121,8 @@ again:set_page_dirty (page); }if (pte_young (ptent) && -likely (!(vma->vm_flags &VM_SEQ_READ ))) +likely (!(vma->vm_flags &VM_SEQ_READ )) && + !PageReserved (page))mark_page_accessed (page); rss[MM_FILEPAGES ]--; }
but I think we need a cleaner (and more robust) solution there to make it clearer that these pages are not regularly managed pages.
Could the VDSO be a VM_MIXEDMAP to keep the initial unmanaged pages out of the VM while allowing COW into regular anonymous pages?
Are there other requirements of the VDSO that I might be missing?
Any feedback would be greatly appreciated.
Thanks!
Johannes
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 29 lines · Johannes Weiner
Hi,
I noticed that vdso pages are faulted and unmapped as if they were regular file pages. And I'm guessing this is so that the vdso mappings are able to use the generic COW code in
memory.c.However, it's a little unsettling that
zap_pte_range()makes decisions based onPageAnon()and the page even reachesmark_page_accessed(), as that function makes several assumptions about the page being a regular LRU user page. It seems this isn't crashing today by sheer luck, but I am working on code that does whenpage_is_file_cache()returns garbage.I'm using this hack to work around it:
mm/memory.c +2
-1@@ -1121,7 +1121,8 @@ again:set_page_dirty (page); }if (pte_young (ptent) && -likely (!(vma->vm_flags &VM_SEQ_READ ))) +likely (!(vma->vm_flags &VM_SEQ_READ )) && + !PageReserved (page))mark_page_accessed (page); rss[MM_FILEPAGES ]--; }
Quoted 5 lines
but I think we need a cleaner (and more robust) solution there to make it clearer that these pages are not regularly managed pages.
Could the VDSO be a
VM_MIXEDMAPto keep the initial unmanaged pages out of the VM while allowing COW into regular anonymous pages?
Probably. What are its limitations? We want ptrace to work on it, and mprotect needs to work and allow COW. access_process_vm should probably work, too.
Quoted 2 lines
Are there other requirements of the VDSO that I might be missing?
There's vvar, too, on x86_64, and that mapping is really strange. It's different in -tip than in any released kernel, too. VM_MIXEDMAP seems to work.
If you want to improve this, take a look at -tip -- it's cleaned up a lot.
--Andy
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 7 lines · Andy Lutomirski
Quoted 2 lines · Johannes Weiner
Could the VDSO be a
VM_MIXEDMAPto keep the initial unmanaged pages out of the VM while allowing COW into regular anonymous pages?Probably. What are its limitations? We want ptrace to work on it, and mprotect needs to work and allow COW.
access_process_vmshould probably work, too.
Thanks, that's good to know.
However, after looking at this a little longer, it appears this would need work in do_wp_page() to support non-page COW copying, then adding vm_ops->access and complicating ->fault in all VDSO implementations.
And it looks like - at least theoretically - drivers can inject non-VM pages into the page tables as well (comment above insert_page())
Given that this behavior has been around for a long time (the comment at the bottom of vm_normal_page is ancient), I'll probably go with a more conservative approach; add a comment to mark_page_accessed() and filter out non-VM pages in the function I'm going to call from it.
Thanks!
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 15 lines · Johannes Weiner
Quoted 7 lines · Andy Lutomirski
Quoted 2 lines · Johannes Weiner
Could the VDSO be a
VM_MIXEDMAPto keep the initial unmanaged pages out of the VM while allowing COW into regular anonymous pages?Probably. What are its limitations? We want ptrace to work on it, and mprotect needs to work and allow COW.
access_process_vmshould probably work, too.Thanks, that's good to know.
However, after looking at this a little longer, it appears this would need work in
do_wp_page()to support non-page COW copying, then addingvm_ops->accessand complicating ->fault in all VDSO implementations.
Quoted 7 lines
And it looks like - at least theoretically - drivers can inject non-VM pages into the page tables as well (comment above
insert_page())Given that this behavior has been around for a long time (the comment at the bottom of
vm_normal_pageis ancient), I'll probably go with a more conservative approach; add a comment tomark_page_accessed()and filter out non-VM pages in the function I'm going to call from it.
I just checked: in -tip, I'm creating a VM_PFNMAP (not VM_MIXEDMAP) vma and faulting a RAM page (with struct page and all) in using vm_insert_pfn. Is that okay, or so I need to use VM_MIXEDMAP instead?
--Andy
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>