From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] arm64: Use last level TLBI for user pte changes
Date: Mon, 27 Jul 2015 18:49:15 +0100 [thread overview]
Message-ID: <20150727174915.GM3358@arm.com> (raw)
In-Reply-To: <1437728396-5408-3-git-send-email-catalin.marinas@arm.com>
On Fri, Jul 24, 2015 at 09:59:56AM +0100, Catalin Marinas wrote:
> The flush_tlb_page() function is used on user address ranges when PTEs
> (or PMDs/PUDs for huge pages) were changed (attributes or clearing). For
> such cases, it is more efficient to invalidate only the last level of
> the TLB with the "tlbi vale1is" instruction.
>
> In the TLB shoot-down case, the TLB caching of the intermediate page
> table levels (pmd, pud, pgd) is handled by __flush_tlb_pgtable() via the
> __(pte|pmd|pud)_free_tlb() functions and it is not deferred to
> tlb_finish_mmu() (as of commit 285994a62c80 - "arm64: Invalidate the TLB
> corresponding to intermediate page table levels"). The tlb_flush()
> function only needs to invalidate the TLB for the last level of page
> tables; a new arm64-specific __flush_tlb_page_range() function performs
> only the last level TLBI.
[...]
> diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h
> index 1643908eb5f3..48794ab79cc0 100644
> --- a/arch/arm64/include/asm/tlbflush.h
> +++ b/arch/arm64/include/asm/tlbflush.h
> @@ -87,7 +87,7 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
> ((unsigned long)ASID(vma->vm_mm) << 48);
>
> dsb(ishst);
> - asm("tlbi vae1is, %0" : : "r" (addr));
> + asm("tlbi vale1is, %0" : : "r" (addr));
> dsb(ish);
> }
>
> @@ -97,6 +97,26 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
> */
> #define MAX_TLB_RANGE (1024UL << PAGE_SHIFT)
>
> +static inline void __flush_tlb_page_range(struct vm_area_struct *vma,
> + unsigned long start, unsigned long end)
> +{
> + unsigned long asid = (unsigned long)ASID(vma->vm_mm) << 48;
> + unsigned long addr;
> +
> + if ((end - start) > MAX_TLB_RANGE) {
> + flush_tlb_mm(vma->vm_mm);
> + return;
> + }
> +
> + start = asid | (start >> 12);
> + end = asid | (end >> 12);
> +
> + dsb(ishst);
> + for (addr = start; addr < end; addr += 1 << (PAGE_SHIFT - 12))
> + asm("tlbi vale1is, %0" : : "r"(addr));
> + dsb(ish);
> +}
This is identical to __flush_tlb_range apart from the asm op.
What happens if you add a "const bool leaf" parameter and stick a
conditional inside the loop?
Will
next prev parent reply other threads:[~2015-07-27 17:49 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-24 8:59 [PATCH 0/2] Last level (leaf) TLBI support Catalin Marinas
2015-07-24 8:59 ` [PATCH 1/2] arm64: Clean up __flush_tlb(_kernel)_range functions Catalin Marinas
2015-07-24 8:59 ` [PATCH 2/2] arm64: Use last level TLBI for user pte changes Catalin Marinas
2015-07-27 17:49 ` Will Deacon [this message]
2015-07-28 9:45 ` Catalin Marinas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150727174915.GM3358@arm.com \
--to=will.deacon@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.