Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to get to struct vm_area_struct from struct page

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:

  • Each physical page in the system has a struct page associated with
  • it to keep track of whatever it is we are using the page for at the
  • moment. Note that we have no way to track which tasks are using
  • a page, though if it is a pagecache page, rmap structures can tell us
  • who is mapping it.

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.

like image 935
prosen Avatar asked Dec 04 '25 02:12

prosen


1 Answers

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.

like image 176
mpe Avatar answered Dec 06 '25 16:12

mpe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!