函数逻辑报告 |
Source Code:mm\huge_memory.c |
Create Date:2022-07-27 17:35:42 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| 首页 | 函数Tree |
| 注解内核,赢得工具 | 下载SCCT | English |
函数名称:do_huge_pmd_wp_page_fallback
函数原型:static vm_fault_t do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, pmd_t orig_pmd, struct page *page)
返回类型:vm_fault_t
参数:
| 类型 | 参数 | 名称 |
|---|---|---|
| struct vm_fault * | vmf | |
| pmd_t | orig_pmd | |
| struct page * | page |
| 1201 | vma等于Target VMA |
| 1202 | haddr等于Faulting virtual address 按位与HPAGE_PMD_MASK |
| 1207 | ret等于0 |
| 1213 | 如果此条件成立可能性小(为编译器优化)(!pages)则 |
| 1214 | ret或等于VM_FAULT_OOM |
| 1215 | 转到:out |
| 1218 | 以i小于HPAGE_PMD_NR循环 |
| 1219 | pages[i]等于alloc_page_vma_node(GFP_HIGHUSER_MOVABLE, vma, Faulting virtual address , page_to_nid(page)) |
| 1221 | 如果此条件成立可能性小(为编译器优化)(!pages[i] || mem_cgroup_try_charge_delay(pages[i], The address space we belong to. , GFP_KERNEL, & memcg, false))则 |
| 1224 | 如果pages[i]则Perform a free_page(), also freeing any swap cache associated with* this page if it is the last user of the page. |
| 1227 | memcg等于page_private(pages[i]) |
| 1228 | set_page_private(pages[i], 0) |
| 1229 | mem_cgroup_cancel_charge(pages[i], memcg, false) |
| 1233 | 释放内存 |
| 1234 | ret或等于VM_FAULT_OOM |
| 1235 | 转到:out |
| 1237 | set_page_private(pages[i], (unsignedlong)memcg) |
| 1240 | 以i小于HPAGE_PMD_NR循环 |
| 1243 | __SetPageUptodate(pages[i]) |
| 1244 | cond_resched() |
| 1247 | mmu_notifier_range_init( & range, MMU_NOTIFY_CLEAR, 0, vma, The address space we belong to. , haddr, haddr + HPAGE_PMD_SIZE) |
| 1249 | mmu_notifier_invalidate_range_start( & range) |
| 1251 | Page table lock.* Protects pte page table if 'pte'* is not NULL, otherwise pmd.等于pmd_lock(The address space we belong to. , Pointer to pmd entry matching* the 'address' ) |
| 1252 | 如果此条件成立可能性小(为编译器优化)(!pmd_same( * Pointer to pmd entry matching* the 'address' , orig_pmd))则转到:out_free_pages |
| 1254 | VM_BUG_ON_PAGE(!PageHead(page), page) |
| 1267 | pmd_populate(The address space we belong to. , & _pmd, pgtable) |
| 1269 | 以i小于HPAGE_PMD_NR循环 |
| 1273 | memcg等于page_private(pages[i]) |
| 1274 | set_page_private(pages[i], 0) |
| 1276 | mem_cgroup_commit_charge(pages[i], memcg, TSC's on different sockets may be reset asynchronously.* This may cause the TSC ADJUST value on socket 0 to be NOT 0., false) |
| 1278 | Pointer to pte entry matching* the 'address'. NULL if the page* table hasn't been allocated.等于pte_offset_map( & _pmd, haddr) |
| 1279 | VM_BUG_ON(!pte_none( * Pointer to pte entry matching* the 'address'. NULL if the page* table hasn't been allocated.)) |
| 1283 | 释放内存 |
| 1285 | smp_wmb() |
| 1286 | pmd_populate(The address space we belong to. , Pointer to pmd entry matching* the 'address' , pgtable) |
| 1288 | 自旋锁解锁 |
| 1296 | ret或等于VM_FAULT_WRITE |
| 1299 | out : |
| 1300 | 返回:ret |
| 1302 | out_free_pages : |
| 1303 | 自旋锁解锁 |
| 1304 | mmu_notifier_invalidate_range_end( & range) |
| 1305 | 以i小于HPAGE_PMD_NR循环 |
| 1306 | memcg等于page_private(pages[i]) |
| 1307 | set_page_private(pages[i], 0) |
| 1308 | mem_cgroup_cancel_charge(pages[i], memcg, false) |
| 1311 | 释放内存 |
| 1312 | 转到:out |
| 名称 | 描述 |
|---|---|
| do_huge_pmd_wp_page |
| 源代码转换工具 开放的插件接口 | X |
|---|---|
| 支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |