| Function report | 
| Source Code: mm\khugepaged.c | Create Date:2022-07-28 16:06:57 | 
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick | 
| home page | Tree | 
| Annotation kernel can get tool activity | Download SCCT | Chinese | 
Name:khugepaged_scan_pmd
Proto:static int khugepaged_scan_pmd(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, struct page **hpage)
Type:int
Parameter:
| Type | Parameter | Name | 
|---|---|---|
| struct mm_struct * | mm | |
| struct vm_area_struct * | vma | |
| unsigned long | address | |
| struct page ** | hpage | 
| 1122 | ret = 0 , none_or_zero = 0 , result = 0 , referenced = 0 | 
| 1126 | node = NUMA_NO_NODE , unmapped = 0 | 
| 1127 | bool writable = false | 
| 1129 | VM_BUG_ON(address & ~HPAGE_PMD_MASK) | 
| 1131 | pmd = mm_find_pmd(mm, address) | 
| 1132 | If Not pmd Then | 
| 1133 | result = SCAN_PMD_NULL | 
| 1134 | Go to out | 
| 1137 | memset(khugepaged_node_load, 0, size of khugepaged_node_load ) | 
| 1139 | When _pte < pte + HPAGE_PMD_NR cycle | 
| 1142 | If heck whether a pte points to a swap entry Then | 
| 1143 | If ++unmapped <= khugepaged_max_ptes_swap Then | 
| 1144 | Continue | 
| 1145 | Else | 
| 1146 | result = SCAN_EXCEED_SWAP_PTE | 
| 1147 | Go to out_unmap | 
| 1150 | If pte_none(pteval) || is_zero_pfn(pte_pfn(pteval)) Then | 
| 1159 | If Not pte_present(pteval) Then | 
| 1160 | result = SCAN_PTE_NON_PRESENT | 
| 1161 | Go to out_unmap | 
| 1167 | If Value for the false possibility is greater at compile time(!page) Then | 
| 1168 | result = SCAN_PAGE_NULL | 
| 1169 | Go to out_unmap | 
| 1173 | If PageCompound(page) Then | 
| 1174 | result = SCAN_PAGE_COMPOUND | 
| 1175 | Go to out_unmap | 
| 1184 | node = page_to_nid(page) | 
| 1185 | If khugepaged_scan_abort(node) Then | 
| 1186 | result = SCAN_SCAN_ABORT | 
| 1187 | Go to out_unmap | 
| 1189 | khugepaged_node_load[node]++ | 
| 1191 | result = SCAN_PAGE_LRU | 
| 1192 | Go to out_unmap | 
| 1194 | If PageLocked(page) Then | 
| 1195 | result = SCAN_PAGE_LOCK | 
| 1196 | Go to out_unmap | 
| 1199 | result = SCAN_PAGE_ANON | 
| 1200 | Go to out_unmap | 
| 1208 | If page_count(page) != 1 + PageSwapCache(page) Then | 
| 1209 | result = SCAN_PAGE_COUNT | 
| 1210 | Go to out_unmap | 
| 1212 | If pte_young(pteval) || page_is_young(page) || PageReferenced(page) || mmu_notifier_test_young(The address space we belong to. , address) Then referenced++ | 
| 1217 | If writable Then | 
| 1218 | If referenced Then | 
| 1219 | result = SCAN_SUCCEED | 
| 1220 | ret = 1 | 
| 1221 | Else | 
| 1222 | result = SCAN_LACK_REFERENCED_PAGE | 
| 1224 | Else | 
| 1225 | result = SCAN_PAGE_RO | 
| 1227 | out_unmap : | 
| 1228 | pte_unmap_unlock(pte, ptl) | 
| 1229 | If ret Then | 
| 1230 | node = khugepaged_find_target_node() | 
| 1232 | collapse_huge_page(mm, address, hpage, node, referenced) | 
| 1234 | out : | 
| 1237 | Return ret | 
| Name | Describe | 
|---|---|
| khugepaged_scan_mm_slot | 
| 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 |