From a3aa96af197942ce2c6dc043d29c3fd27575a765 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Wed, 25 Apr 2018 16:15:26 +0900 Subject: [PATCH] MM: introduction of ihk_mc_pt_lookup_fault_pte() --- arch/x86_64/kernel/memory.c | 24 +++++++++++++++++++++++- lib/include/ihk/mm.h | 5 ++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/arch/x86_64/kernel/memory.c b/arch/x86_64/kernel/memory.c index 2835463a..d23d15c1 100644 --- a/arch/x86_64/kernel/memory.c +++ b/arch/x86_64/kernel/memory.c @@ -1987,6 +1987,28 @@ out: return ptep; } +pte_t *ihk_mc_pt_lookup_fault_pte(struct process_vm *vm, void *virt, + int pgshift, void **basep, size_t *sizep, int *p2alignp) +{ + int faulted = 0; + pte_t *ptep; + +retry: + ptep = ihk_mc_pt_lookup_pte(vm->address_space->page_table, + virt, pgshift, basep, sizep, p2alignp); + if (!faulted && (!ptep || !pte_is_present(ptep))) { + page_fault_process_vm(vm, virt, PF_POPULATE | PF_USER); + faulted = 1; + goto retry; + } + + if (faulted && ptep && pte_is_present(ptep)) { + kprintf("%s: successfully faulted 0x%lx\n", __FUNCTION__, virt); + } + + return ptep; +} + pte_t *ihk_mc_pt_lookup_pte(page_table_t pt, void *virt, int pgshift, void **basep, size_t *sizep, int *p2alignp) { @@ -2286,7 +2308,7 @@ out: int ihk_mc_pt_set_range(page_table_t pt, struct process_vm *vm, void *start, void *end, uintptr_t phys, enum ihk_mc_pt_attribute attr, - int pgshift, struct vm_range *range) + int pgshift, struct vm_range *range) { int error; struct set_range_args args; diff --git a/lib/include/ihk/mm.h b/lib/include/ihk/mm.h index 3053de49..e380b2c4 100644 --- a/lib/include/ihk/mm.h +++ b/lib/include/ihk/mm.h @@ -176,7 +176,10 @@ int ihk_mc_pt_free_range(page_table_t pt, struct process_vm *vm, int ihk_mc_pt_change_attr_range(page_table_t pt, void *start, void *end, enum ihk_mc_pt_attribute clrattr, enum ihk_mc_pt_attribute setattr); -pte_t *ihk_mc_pt_lookup_pte(page_table_t pt, void *virt, int pgshift, void **pgbasep, size_t *pgsizep, int *p2alignp); +pte_t *ihk_mc_pt_lookup_pte(page_table_t pt, void *virt, int pgshift, + void **pgbasep, size_t *pgsizep, int *p2alignp); +pte_t *ihk_mc_pt_lookup_fault_pte(struct process_vm *vm, void *virt, + int pgshift, void **basep, size_t *sizep, int *p2alignp); int ihk_mc_pt_set_range(page_table_t pt, struct process_vm *vm, void *start, void *end, uintptr_t phys, enum ihk_mc_pt_attribute attr, int pgshift, struct vm_range *range);