visit_pte_range(): visit L1 PTEs but don't free for MF_PREMAP files
This commit is contained in:
@@ -1075,7 +1075,6 @@ int visit_pte_range(page_table_t pt, void *start0, void *end0, int pgshift,
|
|||||||
|
|
||||||
struct clear_range_args {
|
struct clear_range_args {
|
||||||
int free_physical;
|
int free_physical;
|
||||||
int dont_walk_l1;
|
|
||||||
struct memobj *memobj;
|
struct memobj *memobj;
|
||||||
struct process_vm *vm;
|
struct process_vm *vm;
|
||||||
};
|
};
|
||||||
@@ -1167,11 +1166,9 @@ static int clear_range_l2(void *args0, pte_t *ptep, uint64_t base,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pt = phys_to_virt(*ptep & PT_PHYSMASK);
|
pt = phys_to_virt(*ptep & PT_PHYSMASK);
|
||||||
if (!args->dont_walk_l1) {
|
error = walk_pte_l1(pt, base, start, end, &clear_range_l1, args0);
|
||||||
error = walk_pte_l1(pt, base, start, end, &clear_range_l1, args0);
|
if (error && (error != -ENOENT)) {
|
||||||
if (error && (error != -ENOENT)) {
|
return error;
|
||||||
return error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((start <= base) && ((base + PTL2_SIZE) <= end)) {
|
if ((start <= base) && ((base + PTL2_SIZE) <= end)) {
|
||||||
@@ -1281,9 +1278,8 @@ static int clear_range(struct page_table *pt, struct process_vm *vm,
|
|||||||
if (memobj && (memobj->flags & MF_DEV_FILE)) {
|
if (memobj && (memobj->flags & MF_DEV_FILE)) {
|
||||||
args.free_physical = 0;
|
args.free_physical = 0;
|
||||||
}
|
}
|
||||||
args.dont_walk_l1 = 0;
|
|
||||||
if (memobj && ((memobj->flags & MF_PREMAP))) {
|
if (memobj && ((memobj->flags & MF_PREMAP))) {
|
||||||
args.dont_walk_l1 = 1;
|
args.free_physical = 0;
|
||||||
}
|
}
|
||||||
args.memobj = memobj;
|
args.memobj = memobj;
|
||||||
args.vm = vm;
|
args.vm = vm;
|
||||||
|
|||||||
Reference in New Issue
Block a user