[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200324141939.51917225@why>
Date: Tue, 24 Mar 2020 14:19:39 +0000
From: Marc Zyngier <maz@...nel.org>
To: Zhenyu Ye <yezhenyu2@...wei.com>
Cc: <will@...nel.org>, <mark.rutland@....com>,
<catalin.marinas@....com>, <aneesh.kumar@...ux.ibm.com>,
<akpm@...ux-foundation.org>, <npiggin@...il.com>,
<peterz@...radead.org>, <arnd@...db.de>, <rostedt@...dmis.org>,
<suzuki.poulose@....com>, <tglx@...utronix.de>,
<yuzhao@...gle.com>, <Dave.Martin@....com>, <steven.price@....com>,
<broonie@...nel.org>, <guohanjun@...wei.com>,
<linux-arm-kernel@...ts.infradead.org>,
<linux-kernel@...r.kernel.org>, <linux-arch@...r.kernel.org>,
<linux-mm@...ck.org>, <arm@...nel.org>, <xiexiangyou@...wei.com>,
<prime.zeng@...ilicon.com>, <zhangshaokun@...ilicon.com>
Subject: Re: [RFC PATCH v4 3/6] arm64: Add level-hinted TLB invalidation
helper to tlbi_user
On Tue, 24 Mar 2020 21:45:31 +0800
Zhenyu Ye <yezhenyu2@...wei.com> wrote:
> Add a level-hinted parameter to __tlbi_user, which only gets used
> if ARMv8.4-TTL gets detected.
>
> ARMv8.4-TTL provides the TTL field in tlbi instruction to indicate
> the level of translation table walk holding the leaf entry for the
> address that is being invalidated.
>
> This patch set the default level value to 0.
>
> Signed-off-by: Zhenyu Ye <yezhenyu2@...wei.com>
> ---
> arch/arm64/include/asm/tlbflush.h | 42 ++++++++++++++++++++++++++-----
> 1 file changed, 36 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h
> index a3f70778a325..d141c080e494 100644
> --- a/arch/arm64/include/asm/tlbflush.h
> +++ b/arch/arm64/include/asm/tlbflush.h
> @@ -89,6 +89,36 @@
> __tlbi(op, arg); \
> } while(0)
>
> +#define __tlbi_user_level(op, addr, level) \
> + do { \
> + u64 arg = addr; \
> + \
> + if (!arm64_kernel_unmapped_at_el0()) \
> + break; \
> + \
> + if (cpus_have_const_cap(ARM64_HAS_ARMv8_4_TTL) && \
> + level) { \
> + u64 ttl = level; \
> + \
> + switch (PAGE_SIZE) { \
> + case SZ_4K: \
> + ttl |= 1 << 2; \
> + break; \
> + case SZ_16K: \
> + ttl |= 2 << 2; \
> + break; \
> + case SZ_64K: \
> + ttl |= 3 << 2; \
> + break; \
> + } \
> + \
> + arg &= ~TLBI_TTL_MASK; \
> + arg |= FIELD_PREP(TLBI_TTL_MASK, ttl); \
> + } \
> + \
> + __tlbi(op, (arg) | USER_ASID_FLAG);
> \
> + } while (0)
> +
Isn't this just:
define __tlbi_user_level(op, addr, level) \
do { \
if (!arm64_kernel_unmapped_at_el0()) \
break; \
\
__tlbi_level(op, addr | USER_ASID_FLAG, level); \
} while (0)
Thanks,
M.
--
Jazz is not dead. It just smells funny...
Powered by blists - more mailing lists