From 209748d9130e7d0f81191c99affd16332b01c720 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Fri, 7 Jul 2017 07:32:53 +0900 Subject: [PATCH] visit_pte_range(): visit L1 PTEs but don't free for MF_PREMAP files --- arch/x86/kernel/memory.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/arch/x86/kernel/memory.c b/arch/x86/kernel/memory.c index efb48f11..6fbe8ab4 100644 --- a/arch/x86/kernel/memory.c +++ b/arch/x86/kernel/memory.c @@ -1075,7 +1075,6 @@ int visit_pte_range(page_table_t pt, void *start0, void *end0, int pgshift, struct clear_range_args { int free_physical; - int dont_walk_l1; struct memobj *memobj; 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); - if (!args->dont_walk_l1) { - error = walk_pte_l1(pt, base, start, end, &clear_range_l1, args0); - if (error && (error != -ENOENT)) { - return error; - } + error = walk_pte_l1(pt, base, start, end, &clear_range_l1, args0); + if (error && (error != -ENOENT)) { + return error; } 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)) { args.free_physical = 0; } - args.dont_walk_l1 = 0; if (memobj && ((memobj->flags & MF_PREMAP))) { - args.dont_walk_l1 = 1; + args.free_physical = 0; } args.memobj = memobj; args.vm = vm;