On Thu, Mar 15, 2018 at 06:15:04PM +0530, Chintan Pandya wrote:
> @@ -91,10 +93,15 @@ static inline int ioremap_pmd_range(pud_t *pud, unsigned 
> long addr,
>  
>               if (ioremap_pmd_enabled() &&
>                   ((next - addr) == PMD_SIZE) &&
> -                 IS_ALIGNED(phys_addr + addr, PMD_SIZE) &&
> -                 pmd_free_pte_page(pmd)) {
> -                     if (pmd_set_huge(pmd, phys_addr + addr, prot))
> +                 IS_ALIGNED(phys_addr + addr, PMD_SIZE)) {
> +                     old_pmd = *pmd;
> +                     pmd_clear(pmd);
> +                     flush_tlb_pgtable(&init_mm, addr);
> +                     if (pmd_set_huge(pmd, phys_addr + addr, prot)) {
> +                             pmd_free_pte_page(&old_pmd);
>                               continue;
> +                     } else
> +                             set_pmd(pmd, old_pmd);
>               }
>  

Can we have something like a pmd_can_set_huge() helper? Then we could
avoid pointless modification and TLB invalidation work when
pmd_set_huge() will fail.

        if (ioremap_pmd_enabled() &&
            ((next - addr) == PMD_SIZE) &&
            IS_ALIGNED(phys_addr + addr, PMD_SIZE) &&
            pmd_can_set_huge(pmd, phys_addr + addr, prot)) {
                // clear entries, invalidate TLBs, and free tables
                ...
                continue;

        }

Thanks,
MArk.

Reply via email to