Message ID | 20190821183204.23576-10-pasha.tatashin@soleen.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: MMU enabled kexec relocation | expand |
Hi Pavel, On 21/08/2019 19:31, Pavel Tatashin wrote: > This functions returns a zeroed trans_pgd using the allocator that is > specified in the info argument. > > trans_pgds should be created by using this function. This function takes the allocator you give it, and calls it once. Given both users need one pgd, and have to provide the allocator, it seems strange that they aren't trusted to call it. I don't think this patch is necessary. Let the caller pass in the pgd_t to the helpers. Thanks, James
On Fri, Sep 6, 2019 at 11:20 AM James Morse <james.morse@arm.com> wrote: > > Hi Pavel, > > On 21/08/2019 19:31, Pavel Tatashin wrote: > > This functions returns a zeroed trans_pgd using the allocator that is > > specified in the info argument. > > > > trans_pgds should be created by using this function. > > This function takes the allocator you give it, and calls it once. > > Given both users need one pgd, and have to provide the allocator, it seems strange that > they aren't trusted to call it. > > I don't think this patch is necessary. > > Let the caller pass in the pgd_t to the helpers. Ok. Thank you, Pasha
diff --git a/arch/arm64/include/asm/trans_pgd.h b/arch/arm64/include/asm/trans_pgd.h index e3d022b1b526..26e5a63676b5 100644 --- a/arch/arm64/include/asm/trans_pgd.h +++ b/arch/arm64/include/asm/trans_pgd.h @@ -40,6 +40,9 @@ struct trans_pgd_info { unsigned long trans_flags; }; +/* Create and empty trans_pgd page table */ +int trans_pgd_create_empty(struct trans_pgd_info *info, pgd_t **trans_pgd); + int trans_pgd_create_copy(pgd_t **dst_pgdp, unsigned long start, unsigned long end); diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c index 17426dc8cb54..8c2641a9bb09 100644 --- a/arch/arm64/kernel/hibernate.c +++ b/arch/arm64/kernel/hibernate.c @@ -216,9 +216,9 @@ static int create_safe_exec_page(void *src_start, size_t length, memcpy(page, src_start, length); __flush_icache_range((unsigned long)page, (unsigned long)page + length); - trans_pgd = (void *)get_safe_page(GFP_ATOMIC); - if (!trans_pgd) - return -ENOMEM; + rc = trans_pgd_create_empty(&trans_info, &trans_pgd); + if (rc) + return rc; rc = trans_pgd_map_page(&trans_info, trans_pgd, page, dst_addr, PAGE_KERNEL_EXEC); diff --git a/arch/arm64/mm/trans_pgd.c b/arch/arm64/mm/trans_pgd.c index dbabccd78cc4..ece797aa1841 100644 --- a/arch/arm64/mm/trans_pgd.c +++ b/arch/arm64/mm/trans_pgd.c @@ -164,6 +164,18 @@ static int copy_page_tables(pgd_t *dst_pgdp, unsigned long start, return 0; } +int trans_pgd_create_empty(struct trans_pgd_info *info, pgd_t **trans_pgd) +{ + pgd_t *dst_pgdp = trans_alloc(info); + + if (!dst_pgdp) + return -ENOMEM; + + *trans_pgd = dst_pgdp; + + return 0; +} + int trans_pgd_create_copy(pgd_t **dst_pgdp, unsigned long start, unsigned long end) {
This functions returns a zeroed trans_pgd using the allocator that is specified in the info argument. trans_pgds should be created by using this function. Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> --- arch/arm64/include/asm/trans_pgd.h | 3 +++ arch/arm64/kernel/hibernate.c | 6 +++--- arch/arm64/mm/trans_pgd.c | 12 ++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-)