From: Max Chou <max.chou@sifive.com>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Cc: qemu-arm@nongnu.org, qemu-ppc@nongu.org, qemu-s390x@nongnu.org,
qemu-riscv@nongnu.org, balaton@eik.bme.hu
Subject: Re: [PATCH v2 13/13] target/riscv: Simplify probing in vext_ldff
Date: Mon, 15 Jul 2024 15:06:48 +0800 [thread overview]
Message-ID: <5a83ce12-9a9c-4c9d-9fee-e37fb6afd19d@sifive.com> (raw)
In-Reply-To: <20240710032814.104643-14-richard.henderson@linaro.org>
[-- Attachment #1: Type: text/plain, Size: 6082 bytes --]
On 2024/7/10 11:28 AM, Richard Henderson wrote:
> The current pairing of tlb_vaddr_to_host with extra is either
> inefficient (user-only, with page_check_range) or incorrect
> (system, with probe_pages).
>
> For proper non-fault behaviour, use probe_access_flags with
> its nonfault parameter set to true.
>
> Signed-off-by: Richard Henderson<richard.henderson@linaro.org>
> ---
> target/riscv/vector_helper.c | 34 ++++++++++++++++++----------------
> 1 file changed, 18 insertions(+), 16 deletions(-)
>
> diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
> index 1b4d5a8e37..4d72eb74d3 100644
> --- a/target/riscv/vector_helper.c
> +++ b/target/riscv/vector_helper.c
> @@ -474,7 +474,6 @@ vext_ldff(void *vd, void *v0, target_ulong base,
> vext_ldst_elem_fn *ldst_elem,
> uint32_t log2_esz, uintptr_t ra)
> {
> - void *host;
> uint32_t i, k, vl = 0;
> uint32_t nf = vext_nf(desc);
> uint32_t vm = vext_vm(desc);
> @@ -493,27 +492,31 @@ vext_ldff(void *vd, void *v0, target_ulong base,
> }
> addr = adjust_addr(env, base + i * (nf << log2_esz));
> if (i == 0) {
> + /* Allow fault on first element. */
> probe_pages(env, addr, nf << log2_esz, ra, MMU_DATA_LOAD);
> } else {
> - /* if it triggers an exception, no need to check watchpoint */
> remain = nf << log2_esz;
> while (remain > 0) {
> + void *host;
> + int flags;
> +
> offset = -(addr | TARGET_PAGE_MASK);
> - host = tlb_vaddr_to_host(env, addr, MMU_DATA_LOAD, mmu_index);
> - if (host) {
> -#ifdef CONFIG_USER_ONLY
> - if (!page_check_range(addr, offset, PAGE_READ)) {
> - vl = i;
> - goto ProbeSuccess;
> - }
> -#else
> - probe_pages(env, addr, offset, ra, MMU_DATA_LOAD);
> -#endif
> - } else {
> +
> + /* Probe nonfault on subsequent elements. */
> + flags = probe_access_flags(env, addr, offset, MMU_DATA_LOAD,
> + mmu_index, true, &host, 0);
> + if (flags) {
According to the section 7.7. Unit-stride Fault-Only-First Loads in the
v spec (v1.0)
When the fault-only-first instruction would trigger a debug
data-watchpoint trap on an element after the first,
implementations should not reduce vl but instead should trigger
the debug trap as otherwise the event might be lost.
I think that we need to filter out the watchpoint bit in the flag here
liked below.
+ if (flags & ~TLB_WATCHPOINT) {
> + /*
> + * Stop any flag bit set:
> + * invalid (unmapped)
> + * mmio (transaction failed)
> + * watchpoint (debug)
> + * In all cases, handle as the first load next time.
> + */
> vl = i;
> - goto ProbeSuccess;
> + break;
This break will just break the while loop, so the outside for loop will
continue checking the following elements that we may get unexpected vl.
> }
> - if (remain <= offset) {
> + if (remain <= offset) {
> break;
> }
> remain -= offset;
> @@ -521,7 +524,6 @@ vext_ldff(void *vd, void *v0, target_ulong base,
> }
> }
> }
> -ProbeSuccess:
> /* load bytes from guest memory */
> if (vl != 0) {
> env->vl = vl;
Thanks for this series patch set, I’m trying to rebase the RVV
optimization RFC patch set to this series then optimize the vext_ldff part.
And I think that there is a potential issue in the original
implementation that maybe we can fix in this patch.
We need to assign the correct element load size to the
probe_access_internal function called by tlb_vaddr_to_host in original
implementation or is called directly in this patch.
The size parameter will be used by the pmp_hart_has_privs function to do
the physical memory protection (PMP) checking.
If we set the size parameter to the remain page size, we may get
unexpected trap caused by the PMP rules that covered the regions of
masked-off elements.
Maybe we can replace the while loop liked below.
vext_ldff(void *vd, void *v0, target_ulong base,
...
{
...
uint32_t size = nf << log2_esz;
VSTART_CHECK_EARLY_EXIT(env);
/* probe every access */
for (i = env->vstart; i < env->vl; i++) {
if (!vm && !vext_elem_mask(v0, i)) {
continue;
}
addr = adjust_addr(env, base + i * size);
if (i == 0) {
probe_pages(env, addr, size, ra, MMU_DATA_LOAD);
} else {
/* if it triggers an exception, no need to check watchpoint */
void *host;
int flags;
/* Probe nonfault on subsequent elements. */
flags = probe_access_flags(env, addr, size, MMU_DATA_LOAD,
mmu_index, true, &host, 0);
if (flags & ~TLB_WATCHPOINT) {
/*
* Stop any flag bit set:
* invalid (unmapped)
* mmio (transaction failed)
* In all cases, handle as the first load next time.
*/
vl = i;
break;
}
}
}
/* load bytes from guest memory */
if (vl != 0) {
env->vl = vl;
}
...
}
[-- Attachment #2: Type: text/html, Size: 9104 bytes --]
next prev parent reply other threads:[~2024-07-15 7:08 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-10 3:28 [PATCH v2 00/13] Fixes for user-only munmap races Richard Henderson
2024-07-10 3:28 ` [PATCH v2 01/13] accel/tcg: Move {set, clear}_helper_retaddr to cpu_ldst.h Richard Henderson
2024-07-12 12:48 ` Peter Maydell
2024-07-10 3:28 ` [PATCH v2 02/13] target/arm: Use cpu_env in cpu_untagged_addr Richard Henderson
2024-07-12 12:49 ` Peter Maydell
2024-07-10 3:28 ` [PATCH v2 03/13] target/arm: Use set/clear_helper_retaddr in helper-a64.c Richard Henderson
2024-07-12 12:53 ` Peter Maydell
2024-07-10 3:28 ` [PATCH v2 04/13] target/arm: Use set/clear_helper_retaddr in SVE and SME helpers Richard Henderson
2024-07-12 13:00 ` Peter Maydell
2024-07-10 3:28 ` [PATCH v2 05/13] target/ppc/mem_helper.c: Remove a conditional from dcbz_common() Richard Henderson
2024-07-10 3:28 ` [PATCH v2 06/13] target/ppc: Hoist dcbz_size out of dcbz_common Richard Henderson
2024-07-10 12:11 ` BALATON Zoltan
2024-07-10 14:36 ` Richard Henderson
2024-07-10 3:28 ` [PATCH v2 07/13] target/ppc: Split out helper_dbczl for 970 Richard Henderson
2024-07-10 12:17 ` BALATON Zoltan
2024-07-10 3:28 ` [PATCH v2 08/13] target/ppc: Merge helper_{dcbz,dcbzep} Richard Henderson
2024-07-10 12:20 ` BALATON Zoltan
2024-07-10 14:41 ` Richard Henderson
2024-07-10 3:28 ` [PATCH v2 09/13] target/ppc: Improve helper_dcbz for user-only Richard Henderson
2024-07-10 12:25 ` BALATON Zoltan
2024-07-10 14:42 ` Richard Henderson
2024-07-10 3:28 ` [PATCH v2 10/13] target/s390x: Use user_or_likely in do_access_memset Richard Henderson
2024-07-12 13:02 ` Peter Maydell
2024-07-10 3:28 ` [PATCH v2 11/13] target/s390x: Use user_or_likely in access_memmove Richard Henderson
2024-07-10 3:28 ` [PATCH v2 12/13] target/s390x: Use set/clear_helper_retaddr in mem_helper.c Richard Henderson
2024-07-10 3:28 ` [PATCH v2 13/13] target/riscv: Simplify probing in vext_ldff Richard Henderson
2024-07-10 4:09 ` Alistair Francis
2024-07-15 7:06 ` Max Chou [this message]
2024-07-15 21:42 ` Richard Henderson
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=5a83ce12-9a9c-4c9d-9fee-e37fb6afd19d@sifive.com \
--to=max.chou@sifive.com \
--cc=balaton@eik.bme.hu \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongu.org \
--cc=qemu-riscv@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=richard.henderson@linaro.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;
as well as URLs for NNTP newsgroup(s).