From: David Daney <david.daney@cavium.com>
To: Hillf Danton <dhillf@gmail.com>, Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org,
"Jayachandran C." <jayachandranc@netlogicmicro.com>
Subject: Re: [RFC] Flush huge TLB
Date: Mon, 10 Oct 2011 10:17:11 -0700 [thread overview]
Message-ID: <4E932897.9050301@cavium.com> (raw)
In-Reply-To: <CAJd=RBBPd6frOA5zCg5juHuWdZ6wHzmOhhufgGhUCOc=rkNEzA@mail.gmail.com>
On 10/09/2011 05:53 AM, Hillf Danton wrote:
> When flushing TLB, if @vma is backed by huge page, huge TLB should be flushed,
> due to the fact that huge page is defined to be far from normal page, and the
> flushing is shorten a bit.
>
> Any comment is welcome.
>
Note that the current implementation works, but is not optimal.
> Thanks
>
> Signed-off-by: Hillf Danton<dhillf@gmail.com>
> ---
>
> --- a/arch/mips/mm/tlb-r4k.c Mon May 30 21:17:04 2011
> +++ b/arch/mips/mm/tlb-r4k.c Sun Oct 9 20:50:06 2011
> @@ -120,22 +120,35 @@ void local_flush_tlb_range(struct vm_are
>
> if (cpu_context(cpu, mm) != 0) {
> unsigned long size, flags;
> + int huge = is_vm_hugetlb_page(vma);
>
> ENTER_CRITICAL(flags);
> - size = (end - start + (PAGE_SIZE - 1))>> PAGE_SHIFT;
> - size = (size + 1)>> 1;
> + if (huge) {
> + size = (end - start) / HPAGE_SIZE;
> + } else {
> + size = (end - start + (PAGE_SIZE - 1))>> PAGE_SHIFT;
> + size = (size + 1)>> 1;
> + }
Perhaps:
if (huge) {
start = round_down(start, HPAGE_SIZE);
end = round_up(start, HPAGE_SIZE);
size = (end - start) >> HPAGE_SHIFT;
} else {
start = round_down(start, PAGE_SIZE << 1);
end = round_up(start, PAGE_SIZE << 1);
size = (end - start) >> (PAGE_SHIFT + 1);
}
.
.
.
> if (size<= current_cpu_data.tlbsize/2) {
Has anybody benchmarked this heuristic? I guess it seems reasonable.
> int oldpid = read_c0_entryhi();
> int newpid = cpu_asid(cpu, mm);
>
> - start&= (PAGE_MASK<< 1);
> - end += ((PAGE_SIZE<< 1) - 1);
> - end&= (PAGE_MASK<< 1);
> + if (huge) {
> + start&= HPAGE_MASK;
> + end&= HPAGE_MASK;
> + } else {
> + start&= (PAGE_MASK<< 1);
> + end += ((PAGE_SIZE<< 1) - 1);
> + end&= (PAGE_MASK<< 1);
> + }
This stuff is done above so is removed.
> while (start< end) {
> int idx;
>
> write_c0_entryhi(start | newpid);
> - start += (PAGE_SIZE<< 1);
> + if (huge)
> + start += HPAGE_SIZE;
> + else
> + start += (PAGE_SIZE<< 1);
> mtc0_tlbw_hazard();
> tlb_probe();
> tlb_probe_hazard();
>
>
If we do something like that, then...
Acked-by: David Daney <david.daney@cavium.com>
next prev parent reply other threads:[~2011-10-10 17:17 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-09 12:53 [RFC] Flush huge TLB Hillf Danton
2011-10-10 17:17 ` David Daney [this message]
2011-10-14 13:09 ` Hillf Danton
2011-11-16 14:52 ` Ralf Baechle
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=4E932897.9050301@cavium.com \
--to=david.daney@cavium.com \
--cc=dhillf@gmail.com \
--cc=jayachandranc@netlogicmicro.com \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox