From: Zhenyu Ye <yezhenyu2@huawei.com>
To: Peter Zijlstra <peterz@infradead.org>,
Steven Rostedt <rostedt@goodmis.org>
Cc: <mark.rutland@arm.com>, <will@kernel.org>,
<catalin.marinas@arm.com>, <aneesh.kumar@linux.ibm.com>,
<akpm@linux-foundation.org>, <npiggin@gmail.com>, <arnd@arndb.de>,
<maz@kernel.org>, <suzuki.poulose@arm.com>, <tglx@linutronix.de>,
<yuzhao@google.com>, <Dave.Martin@arm.com>,
<steven.price@arm.com>, <broonie@kernel.org>,
<guohanjun@huawei.com>, <linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <linux-arch@vger.kernel.org>,
<linux-mm@kvack.org>, <arm@kernel.org>, <xiexiangyou@huawei.com>,
<prime.zeng@hisilicon.com>, <zhangshaokun@hisilicon.com>,
<kuhn.chenqun@huawei.com>
Subject: Re: [PATCH v1 6/6] arm64: tlb: Set the TTL field in flush_tlb_range
Date: Tue, 21 Apr 2020 20:22:33 +0800 [thread overview]
Message-ID: <25267000-9c39-cd1c-33c8-c62bfb41d905@huawei.com> (raw)
In-Reply-To: <20200421083043.GP20730@hirez.programming.kicks-ass.net>
On 2020/4/21 16:30, Peter Zijlstra wrote:
> On Mon, Apr 20, 2020 at 08:06:16PM -0400, Steven Rostedt wrote:
>> Peter Zijlstra <peterz@infradead.org> wrote:
>>> On Fri, Apr 03, 2020 at 05:00:48PM +0800, Zhenyu Ye wrote:
>
>>>> +static inline int tlb_get_level(struct mmu_gather *tlb)
>>>> +{
>>>> + int sum = tlb->cleared_ptes + tlb->cleared_pmds +
>>>> + tlb->cleared_puds + tlb->cleared_p4ds;
>>>> +
>>>> + if (sum != 1)
>>>> + return 0;
>>>> + else if (tlb->cleared_ptes)
>>>> + return 3;
>>>> + else if (tlb->cleared_pmds)
>>>> + return 2;
>>>> + else if (tlb->cleared_puds)
>>>> + return 1;
>>>> +
>>>> + return 0;
>>>> +}
>>>
>>> That's some mighty wonky code. Please look at the generated asm.
>>
>> Without even looking at the generated asm, if a condition returns,
>> there's no reason to add an else for that condition.
>
> Not really the point; he wants to guarantee he only returns >0 when
> there's a single bit set. But the thing is, cleared_* is a bitfield, and
> I'm afraid that the above will result in some terrible code-gen.
>
> Maybe something like:
>
> if (tlb->cleared_ptes && !(tlb->cleared_pmds ||
> tlb->cleared_puds ||
> tlb->cleared_p4ds))
> return 3;
>
> if (tlb->cleared_pmds && !(tlb->cleared_ptes ||
> tlb->cleared_puds ||
> tlb->cleared_p4ds))
> return 2;
>
> if (tlb->cleared_puds && !(tlb->cleared_ptes ||
> tlb->cleared_pmds ||
> tlb->cleared_p4ds))
> return 1;
>
> return 0;
>
> Which I admit is far too much typing, but I suspect it generates far
> saner code (just a few masks and branches).
>
> But maybe the compiler surprises us, what do I konw.
Thanks for your review. In my view, the asm-code should behave the same
as the C code, even if cleared_* are bitfields (below 02 optimization).
Below is the generated asm of my code (gcc version is 7.3.0):
<tlb_flush_mmu_tlbonly.part.110>:
...
ubfx x5, x2, #3, #1 // x2 stores the values of cleared_*
ubfx x1, x2, #4, #1
add w1, w1, w5
ubfx x5, x2, #5, #1
add w1, w1, w5
ubfx x2, x2, #6, #1
add w1, w1, w2 // then the w1 = sum of cleared_*
tbnz w3, #3, 001030f8b8
tbz w3, #4, 001030fac0
cmp w1, #0x1 // cmp the w1 to select branch
mov w5, #0x2
... // do the if-else below...
Then with your code above, the generated asm is:
<tlb_flush_mmu_tlbonly.part.110>:
...
tbnz w1, #3, 001030f8a0 // w1 stores the values of cleared_*
tbz w1, #4, 001030fac0
and w2, w1, #0x78 // mask the cleared_* to w2
mov x4, #0x200000
mov w7, #0x15
mov w6, #0x3
cmp w2, #0x8 // cmp the w2 to 0x8, 0x10, 0x20 to
// select branch
b.ne ffff80001030f8b8
... // do the if-else below...
So at the gen-asm level, both of our codes are OK. But your code is really
more saner than mine at the gen-asm level.
Thanks for your suggestion of this, I will send a new patch series soon.
Zhenyu
.
prev parent reply other threads:[~2020-04-21 12:22 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-03 9:00 [PATCH v1 0/6] arm64: tlb: add support for TTL feature Zhenyu Ye
2020-04-03 9:00 ` [PATCH v1 1/6] arm64: Detect the ARMv8.4 " Zhenyu Ye
2020-04-21 16:53 ` Christoph Hellwig
2020-04-21 17:13 ` Peter Zijlstra
2020-04-21 17:16 ` Christoph Hellwig
2020-04-22 2:13 ` Zhenyu Ye
2020-04-03 9:00 ` [PATCH v1 2/6] arm64: Add level-hinted TLB invalidation helper Zhenyu Ye
2020-04-03 9:00 ` [PATCH v1 3/6] arm64: Add tlbi_user_level " Zhenyu Ye
2020-04-03 9:00 ` [PATCH v1 4/6] tlb: mmu_gather: add tlb_set_*_range APIs Zhenyu Ye
2020-04-20 11:46 ` Peter Zijlstra
2020-04-03 9:00 ` [PATCH v1 5/6] mm: tlb: Provide flush_*_tlb_range wrappers Zhenyu Ye
2020-04-20 12:09 ` Peter Zijlstra
2020-04-21 14:18 ` Zhenyu Ye
2020-04-03 9:00 ` [PATCH v1 6/6] arm64: tlb: Set the TTL field in flush_tlb_range Zhenyu Ye
2020-04-20 12:10 ` Peter Zijlstra
2020-04-21 0:06 ` Steven Rostedt
2020-04-21 8:30 ` Peter Zijlstra
2020-04-21 12:22 ` Zhenyu Ye [this message]
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=25267000-9c39-cd1c-33c8-c62bfb41d905@huawei.com \
--to=yezhenyu2@huawei.com \
--cc=Dave.Martin@arm.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.ibm.com \
--cc=arm@kernel.org \
--cc=arnd@arndb.de \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=guohanjun@huawei.com \
--cc=kuhn.chenqun@huawei.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=npiggin@gmail.com \
--cc=peterz@infradead.org \
--cc=prime.zeng@hisilicon.com \
--cc=rostedt@goodmis.org \
--cc=steven.price@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
--cc=xiexiangyou@huawei.com \
--cc=yuzhao@google.com \
--cc=zhangshaokun@hisilicon.com \
/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