create_safe_exec_page() is going to be split into two parts in preparation
of moving page table handling code out of hibernate.c

Remove allocator parameter, and rename dst to page. Also, remove the
goto's, as we can return directly without cleanups.

Signed-off-by: Pavel Tatashin <[email protected]>
---
 arch/arm64/kernel/hibernate.c | 60 +++++++++++++++--------------------
 1 file changed, 26 insertions(+), 34 deletions(-)

diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
index 9341fcc6e809..96b6f8da7e49 100644
--- a/arch/arm64/kernel/hibernate.c
+++ b/arch/arm64/kernel/hibernate.c
@@ -196,57 +196,51 @@ EXPORT_SYMBOL(arch_hibernation_header_restore);
  */
 static int create_safe_exec_page(void *src_start, size_t length,
                                 unsigned long dst_addr,
-                                phys_addr_t *phys_dst_addr,
-                                void *(*allocator)(gfp_t mask),
-                                gfp_t mask)
+                                phys_addr_t *phys_dst_addr)
 {
-       int rc = 0;
+       void *page = (void *)get_safe_page(GFP_ATOMIC);
+       pgd_t *trans_table;
        pgd_t *pgdp;
        pud_t *pudp;
        pmd_t *pmdp;
        pte_t *ptep;
-       unsigned long dst = (unsigned long)allocator(mask);
 
-       if (!dst) {
-               rc = -ENOMEM;
-               goto out;
-       }
+       if (!page)
+               return -ENOMEM;
+
+       memcpy((void *)page, src_start, length);
+       __flush_icache_range((unsigned long)page, (unsigned long)page + length);
 
-       memcpy((void *)dst, src_start, length);
-       __flush_icache_range(dst, dst + length);
+       trans_table = (void *)get_safe_page(GFP_ATOMIC);
+       if (!trans_table)
+               return -ENOMEM;
 
-       pgdp = pgd_offset_raw(allocator(mask), dst_addr);
+       pgdp = pgd_offset_raw(trans_table, dst_addr);
        if (pgd_none(READ_ONCE(*pgdp))) {
-               pudp = allocator(mask);
-               if (!pudp) {
-                       rc = -ENOMEM;
-                       goto out;
-               }
+               pudp = (void *)get_safe_page(GFP_ATOMIC);
+               if (!pudp)
+                       return -ENOMEM;
                pgd_populate(&init_mm, pgdp, pudp);
        }
 
        pudp = pud_offset(pgdp, dst_addr);
        if (pud_none(READ_ONCE(*pudp))) {
-               pmdp = allocator(mask);
-               if (!pmdp) {
-                       rc = -ENOMEM;
-                       goto out;
-               }
+               pmdp = (void *)get_safe_page(GFP_ATOMIC);
+               if (!pmdp)
+                       return -ENOMEM;
                pud_populate(&init_mm, pudp, pmdp);
        }
 
        pmdp = pmd_offset(pudp, dst_addr);
        if (pmd_none(READ_ONCE(*pmdp))) {
-               ptep = allocator(mask);
-               if (!ptep) {
-                       rc = -ENOMEM;
-                       goto out;
-               }
+               ptep = (void *)get_safe_page(GFP_ATOMIC);
+               if (!ptep)
+                       return -ENOMEM;
                pmd_populate_kernel(&init_mm, pmdp, ptep);
        }
 
        ptep = pte_offset_kernel(pmdp, dst_addr);
-       set_pte(ptep, pfn_pte(virt_to_pfn(dst), PAGE_KERNEL_EXEC));
+       set_pte(ptep, pfn_pte(virt_to_pfn(page), PAGE_KERNEL_EXEC));
 
        /*
         * Load our new page tables. A strict BBM approach requires that we
@@ -262,13 +256,12 @@ static int create_safe_exec_page(void *src_start, size_t 
length,
         */
        cpu_set_reserved_ttbr0();
        local_flush_tlb_all();
-       write_sysreg(phys_to_ttbr(virt_to_phys(pgdp)), ttbr0_el1);
+       write_sysreg(phys_to_ttbr(virt_to_phys(trans_table)), ttbr0_el1);
        isb();
 
-       *phys_dst_addr = virt_to_phys((void *)dst);
+       *phys_dst_addr = virt_to_phys((void *)page);
 
-out:
-       return rc;
+       return 0;
 }
 
 #define dcache_clean_range(start, end) __flush_dcache_area(start, (end - 
start))
@@ -523,8 +516,7 @@ int swsusp_arch_resume(void)
         */
        rc = create_safe_exec_page(__hibernate_exit_text_start, exit_size,
                                   (unsigned long)hibernate_exit,
-                                  &phys_hibernate_exit,
-                                  (void *)get_safe_page, GFP_ATOMIC);
+                                  &phys_hibernate_exit);
        if (rc) {
                pr_err("Failed to create safe executable page for 
hibernate_exit code.\n");
                goto out;
-- 
2.22.1

Reply via email to