remove ihk_mc_pt_alloc_range()
This commit is contained in:
@ -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)
|
||||
{
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user