Basically, I need to identify the process or task using a page, and accordingly make some decisions regarding whether to allow the page to be swapped out or not. Because the swap module in kernel AFAIK deals with mostly struct page, I was wondering whether there is some existing trick that I am missing. From include/linux/mm_types.h (v >= 2.6), the following comment:
suggests we can do this via some physical-to-virtual reverse mappings, but I could not figure out from the rmap functions (in mm/rmap.c) how to achieve what I am looking for.
Thanks in advance for any help, much appreciated.
To answer your actual question "how to get to struct vm_area_struct from struct page", there are at least two answers.
For anonymous pages you can use page_anon_vma(), which returns an anon_vma - it's stored in page->mapping with a special flag set to indicate it's not a struct address_space (to save space).
From the anon_vma you can walk the anon_vma_chain and each entry points to a vma. From the vma you can get the mm and then a task.
See page_referenced_anon() for an example.
For a file page you look at page->mapping which is a struct address_space, and from there you walk the i_mmap which is a struct prio_tree_root. See page_referenced_file().
I'm not sure that's actually going to help you implement your idea, but there you go.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With