From 50de3820ad7dd94df208817a80cd356daed5504d Mon Sep 17 00:00:00 2001 From: "TOIDA,Suguru" Date: Fri, 30 Nov 2018 09:18:33 +0900 Subject: [PATCH] ContiguousPTE[9/12] modify ihk_mc_pt_clear|free_range Change-Id: I75d821b81d351f4fdfd504c791543db174634261 --- arch/arm64/kernel/memory.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/arch/arm64/kernel/memory.c b/arch/arm64/kernel/memory.c index 159e9299..ee72f6cb 100644 --- a/arch/arm64/kernel/memory.c +++ b/arch/arm64/kernel/memory.c @@ -1981,6 +1981,8 @@ static int clear_range(struct page_table *pt, struct process_vm *vm, int error; struct clear_range_args args; translation_table_t* tt; + pte_t *ptep; + size_t pgsize; if ((start < vm->region.user_start) || (vm->region.user_end < end) @@ -2001,6 +2003,30 @@ static int clear_range(struct page_table *pt, struct process_vm *vm, args.memobj = memobj; args.vm = vm; + ptep = ihk_mc_pt_lookup_pte(pt, (void *)start, + 0, NULL, &pgsize, NULL); + if (ptep && pte_is_contiguous(ptep)) { + if (!page_is_contiguous_head(ptep, pgsize)) { + // start pte is not contiguous head + error = split_contiguous_pages(ptep, pgsize); + if (error) { + return error; + } + } + } + + ptep = ihk_mc_pt_lookup_pte(pt, (void *)end - 1, + 0, NULL, &pgsize, NULL); + if (ptep && pte_is_contiguous(ptep)) { + if (!page_is_contiguous_tail(ptep, pgsize)) { + // end pte is not contiguous tail + error = split_contiguous_pages(ptep, pgsize); + if (error) { + return error; + } + } + } + tt = get_translation_table(pt); error = initial_lookup.walk(tt, 0, start, end, initial_lookup.callback, &args); return error;