return;
 
        pr_debug("Validating PTE advanced\n");
+       if (WARN_ON(!args->ptep))
+               return;
+
        pte = pfn_pte(args->pte_pfn, args->page_prot);
        set_pte_at(args->mm, args->vaddr, args->ptep, pte);
        flush_dcache_page(page);
         * the unexpected overhead of cache flushing is acceptable.
         */
        pr_debug("Validating PTE clear\n");
+       if (WARN_ON(!args->ptep))
+               return;
+
 #ifndef CONFIG_RISCV
        pte = __pte(pte_val(pte) | RANDOM_ORVALUE);
 #endif
        args.ptep = pte_offset_map_lock(args.mm, args.pmdp, args.vaddr, &ptl);
        pte_clear_tests(&args);
        pte_advanced_tests(&args);
-       pte_unmap_unlock(args.ptep, ptl);
+       if (args.ptep)
+               pte_unmap_unlock(args.ptep, ptl);
 
        ptl = pmd_lock(args.mm, args.pmdp);
        pmd_clear_tests(&args);
 
                pte_t *ptep = pte_offset_map(&pmd, addr);
                unsigned long i;
 
+               if (WARN_ON(!ptep))
+                       return;
                for (i = 0; i < PTRS_PER_PTE; i++) {
                        __page_table_check_pte_clear(mm, addr, *ptep);
                        addr += PAGE_SIZE;