diff --git a/arch/x86/kernel/memory.c b/arch/x86/kernel/memory.c index 7ddaa64d..bae4b1ce 100644 --- a/arch/x86/kernel/memory.c +++ b/arch/x86/kernel/memory.c @@ -1303,132 +1303,6 @@ int ihk_mc_pt_change_attr_range(page_table_t pt, void *start0, void *end0, return walk_pte_l4(pt, 0, start, end, &change_attr_range_l4, &args); } -static int alloc_range_l1(void *arg0, pte_t *ptep, uint64_t base, - uint64_t start, uint64_t end) -{ - enum ihk_mc_pt_attribute *attrp = arg0; - void *vp; - - if (*ptep == PTE_NULL) { - /* not mapped */ - vp = ihk_mc_alloc_pages(1, IHK_MC_AP_NOWAIT); - if (vp == NULL) { - return -ENOMEM; - } - memset(vp, 0, PTL1_SIZE); - - *ptep = virt_to_phys(vp) | attr_to_l1attr(*attrp); - } - else if (!(*ptep & PFL1_PRESENT)) { - kprintf("alloc_range_l1(%p,%p,%lx,%lx,%lx):inactive %lx\n", - arg0, ptep, base, start, end, *ptep); - return -EBUSY; - } - - return 0; -} - -static int alloc_range_l2(void *arg0, pte_t *ptep, uint64_t base, - uint64_t start, uint64_t end) -{ - struct page_table *pt; -#ifdef USE_LARGE_PAGES - enum ihk_mc_pt_attribute *attrp = arg0; - void *vp; -#endif /* USE_LARGE_PAGES */ - - if (*ptep != PTE_NULL) { - if (!(*ptep & PFL2_PRESENT)) { - kprintf("alloc_range_l2(%p,%p,%lx,%lx,%lx):inactive %lx\n", - arg0, ptep, base, start, end, *ptep); - return -EBUSY; - } - else if (*ptep & PFL2_SIZE) { - return 0; - } - - pt = phys_to_virt(*ptep & PT_PHYSMASK); - } - else { -#ifdef USE_LARGE_PAGES - if ((start <= base) && ((base + PTL2_SIZE) <= end)) { - vp = ihk_mc_alloc_aligned_pages(LARGE_PAGE_SIZE/PAGE_SIZE, - LARGE_PAGE_P2ALIGN, IHK_MC_AP_NOWAIT); - if (vp != NULL) { - memset(vp, 0, PTL2_SIZE); - - *ptep = virt_to_phys(vp) - | attr_to_l2attr(*attrp | PTATTR_LARGEPAGE); - return 0; - } - } -#endif /* USE_LARGE_PAGES */ - pt = __alloc_new_pt(IHK_MC_AP_NOWAIT); - if (pt == NULL) { - return -ENOMEM; - } - - *ptep = virt_to_phys(pt) | PFL2_PDIR_ATTR; - } - - return walk_pte_l1(pt, base, start, end, &alloc_range_l1, arg0); -} - -static int alloc_range_l3(void *arg0, pte_t *ptep, uint64_t base, - uint64_t start, uint64_t end) -{ - struct page_table *pt; - - if (*ptep != PTE_NULL) { - if (!(*ptep & PFL3_PRESENT)) { - kprintf("alloc_range_l3(%p,%p,%lx,%lx,%lx):inactive %lx\n", - arg0, ptep, base, start, end, *ptep); - panic("alloc_range_l3:inactive"); - } - pt = phys_to_virt(*ptep & PT_PHYSMASK); - } - else { - pt = __alloc_new_pt(IHK_MC_AP_NOWAIT); - if (pt == NULL) { - return -ENOMEM; - } - *ptep = virt_to_phys(pt) | PFL3_PDIR_ATTR; - } - - return walk_pte_l2(pt, base, start, end, &alloc_range_l2, arg0); -} - -static int alloc_range_l4(void *arg0, pte_t *ptep, uint64_t base, - uint64_t start, uint64_t end) -{ - struct page_table *pt; - - if (*ptep != PTE_NULL) { - if (!(*ptep & PFL4_PRESENT)) { - kprintf("alloc_range_l4(%p,%p,%lx,%lx,%lx):inactive %lx\n", - arg0, ptep, base, start, end, *ptep); - panic("alloc_range_l4:inactive"); - } - pt = phys_to_virt(*ptep & PT_PHYSMASK); - } - else { - pt = __alloc_new_pt(IHK_MC_AP_NOWAIT); - if (pt == NULL) { - return -ENOMEM; - } - *ptep = virt_to_phys(pt) | PFL4_PDIR_ATTR; - } - - return walk_pte_l3(pt, base, start, end, &alloc_range_l3, arg0); -} - -int ihk_mc_pt_alloc_range(page_table_t pt, void *start, void *end, - enum ihk_mc_pt_attribute attr) -{ - return walk_pte_l4(pt, 0, (intptr_t)start, (intptr_t)end, - &alloc_range_l4, &attr); -} - static pte_t *lookup_pte(struct page_table *pt, uintptr_t virt, uintptr_t *basep, size_t *sizep, int *p2alignp) { diff --git a/kernel/process.c b/kernel/process.c index 0cb19aaf..91f16740 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1214,21 +1214,6 @@ int change_prot_process_memory_range(struct process_vm *vm, goto out; } - if (((range->flag & VR_PROT_MASK) == PROT_NONE) - && !(range->flag & VR_DEMAND_PAGING)) { - ihk_mc_spinlock_lock_noirq(&vm->page_table_lock); - error = ihk_mc_pt_alloc_range(vm->address_space->page_table, - (void *)range->start, (void *)range->end, - newattr); - ihk_mc_spinlock_unlock_noirq(&vm->page_table_lock); - if (error) { - ekprintf("change_prot_process_memory_range(%p,%lx-%lx,%lx):" - "ihk_mc_pt_alloc_range failed: %d\n", - vm, range->start, range->end, protflag, error); - goto out; - } - } - range->flag = newflag; error = 0; out: diff --git a/lib/include/ihk/mm.h b/lib/include/ihk/mm.h index d17b4375..3bc59183 100644 --- a/lib/include/ihk/mm.h +++ b/lib/include/ihk/mm.h @@ -127,8 +127,6 @@ 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); -int ihk_mc_pt_alloc_range(page_table_t pt, void *start, void *end, - enum ihk_mc_pt_attribute attr); pte_t *ihk_mc_pt_lookup_pte(page_table_t pt, void *virt, void **pgbasep, size_t *pgsizep, 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);