Function report |
Source Code:mm\mmap.c |
Create Date:2022-07-28 14:47:52 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:We cannot adjust vm_start, vm_end, vm_pgoff fields of a vma that* is already present in an i_mmap tree without adjusting the tree.* The following helper function should be used when such adjustments* are necessary
Proto:int __vma_adjust(struct vm_area_struct *vma, unsigned long start, unsigned long end, unsigned long pgoff, struct vm_area_struct *insert, struct vm_area_struct *expand)
Type:int
Parameter:
| Type | Parameter | Name |
|---|---|---|
| struct vm_area_struct * | vma | |
| unsigned long | start | |
| unsigned long | end | |
| unsigned long | pgoff | |
| struct vm_area_struct * | insert | |
| struct vm_area_struct * | expand |
| 700 | struct address_space * mapping = NULL |
| 701 | struct rb_root_cached * root = NULL |
| 704 | bool start_changed = TSC's on different sockets may be reset asynchronously.* This may cause the TSC ADJUST value on socket 0 to be NOT 0., end_changed = false |
| 705 | adjust_next = 0 |
| 706 | remove_next = 0 |
| 709 | struct vm_area_struct * exporter = NULL, * importer = NULL |
| 711 | If end >= The first byte after our end addresswithin vm_mm. Then |
| 729 | remove_next = 3 |
| 730 | VM_WARN_ON(file != File we map to (can be NULL). ) |
| 732 | Else |
| 733 | VM_WARN_ON(expand != vma) |
| 738 | remove_next = 1 + (end > The first byte after our end addresswithin vm_mm. ) |
| 739 | VM_WARN_ON(remove_next == 2 && end != The first byte after our end addresswithin vm_mm. ) |
| 752 | If remove_next == 2 && Not Serialized by page_table_lock Then exporter = linked list of VM areas per task, sorted by address |
| 755 | Else if end > Our start address within vm_mm. Then |
| 763 | VM_WARN_ON(expand != importer) |
| 764 | Else if end < The first byte after our end addresswithin vm_mm. Then |
| 770 | adjust_next = -( The first byte after our end addresswithin vm_mm. - end >> PAGE_SHIFT determines the page size ) |
| 773 | VM_WARN_ON(expand != importer) |
| 781 | If exporter && Serialized by page_table_lock && Not Serialized by page_table_lock Then |
| 785 | error = anon_vma_clone(importer, exporter) |
| 790 | again : |
| 791 | vma_adjust_trans_huge(orig_vma, start, end, adjust_next) |
| 793 | If file Then |
| 798 | If adjust_next Then Called in context of a munmap of a vma. |
| 801 | i_mmap_lock_write(mapping) |
| 802 | If insert Then |
| 809 | __vma_link_file(insert) |
| 814 | If Not anon_vma && adjust_next Then anon_vma = Serialized by page_table_lock |
| 816 | If anon_vma Then |
| 825 | If root Then |
| 827 | vma_interval_tree_remove(vma, root) |
| 828 | If adjust_next Then vma_interval_tree_remove(next, root) |
| 832 | If start != Our start address within vm_mm. Then |
| 834 | start_changed = true |
| 836 | If end != The first byte after our end addresswithin vm_mm. Then |
| 838 | end_changed = true |
| 841 | If adjust_next Then |
| 846 | If root Then |
| 847 | If adjust_next Then vma_interval_tree_insert(next, root) |
| 849 | vma_interval_tree_insert(vma, root) |
| 853 | If remove_next Then |
| 858 | If remove_next != 3 Then __vma_unlink_common(mm, next, next) |
| 860 | Else __vma_unlink_common(mm, next, vma) |
| 871 | If file Then Requires inode->i_mapping->i_mmap_rwsem |
| 873 | Else if insert Then |
| 880 | Else |
| 881 | If start_changed Then Update augmented rbtree rb_subtree_gap values after vma->vm_start or* in the rbtree. |
| 883 | If end_changed Then |
| 884 | If Not next Then highest vma end address = vm_end_gap(vma) |
| 891 | If anon_vma Then |
| 893 | If adjust_next Then anon_vma_interval_tree_post_update_vma(next) |
| 897 | If mapping Then i_mmap_unlock_write(mapping) |
| 900 | If root Then |
| 907 | If remove_next Then |
| 908 | If file Then |
| 912 | If Serialized by page_table_lock Then anon_vma_merge(vma, next) |
| 914 | number of VMAs -- |
| 915 | mpol_put(vma_policy(next)) |
| 916 | vm_area_free(next) |
| 922 | If remove_next != 3 Then |
| 930 | Else |
| 943 | If remove_next == 2 Then |
| 948 | Else if next Then Update augmented rbtree rb_subtree_gap values after vma->vm_start or* in the rbtree. |
| 950 | Else |
| 970 | VM_WARN_ON( highest vma end address != vm_end_gap(vma)) |
| 973 | If insert && file Then Called from mmap_region/vma_adjust with mm->mmap_sem acquired.* Currently we ignore all errors and always return 0, the callers* can't handle the failure anyway. |
| 976 | validate_mm(mm) |
| 978 | Return 0 |
| Name | Describe |
|---|---|
| vma_merge | Given a mapping request (addr,end,vm_flags,file,pgoff), figure out* whether that can be merged with its predecessor or its successor |
| vma_adjust |
| Source code conversion tool public plug-in interface | X |
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |