qemu-riscv.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com,
	bmeng@tinylab.org, liwei1518@gmail.com,
	zhiwei_liu@linux.alibaba.com, palmer@rivosinc.com,
	max.chou@sifive.com
Subject: Re: [PATCH v3 1/5] trans_rvv.c.inc: mark_vs_dirty() before stores
Date: Tue, 20 Feb 2024 18:10:08 -0300	[thread overview]
Message-ID: <ad667881-f55c-468e-b6a1-8138147f71ef@ventanamicro.com> (raw)
In-Reply-To: <32df58bf-cf71-4825-8b56-67108c81944d@linaro.org>



On 2/20/24 17:17, Richard Henderson wrote:
> On 2/20/24 09:26, Daniel Henrique Barboza wrote:
>> While discussing a problem with how we're (not) setting vstart_eq_zero
>> Richard had the following to say w.r.t the conditional mark_vs_dirty()
>> calls on load/store functions [1]:
>>
>> "I think it's required to have stores set dirty unconditionally, before
>> the operation.
>>
>> Consider a store that traps on the 2nd element, leaving vstart = 2, and
>> exiting to the main loop via exception. The exception enters the kernel
>> page fault handler. The kernel may need to fault in the page for the
>> process, and in the meantime task switch.
>>
>> If vs dirty is not already set, the kernel won't know to save vector
>> state on task switch."
>>
>> Do a mark_vs_dirty() before store operations. Keep the mark_vs_dirty()
>> call at the end for loads - the function is a no-op if mstatus_vs is
>> already set to EXT_STATUS_DIRTY so there's no hurt in store functions
>> calling it twice.
>>
>> [1] https://lore.kernel.org/qemu-riscv/72c7503b-0f43-44b8-aa82-fbafed2aac0c@linaro.org/
>>
>> Suggested-by: Richard Henderson <richard.henderson@linaro.org>
>> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
>> ---
>>   target/riscv/insn_trans/trans_rvv.c.inc | 29 +++++++++++++++----------
>>   1 file changed, 17 insertions(+), 12 deletions(-)
>>
>> diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
>> index 9e101ab434..2065e9064e 100644
>> --- a/target/riscv/insn_trans/trans_rvv.c.inc
>> +++ b/target/riscv/insn_trans/trans_rvv.c.inc
>> @@ -636,12 +636,13 @@ static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data,
>>       tcg_gen_addi_ptr(dest, tcg_env, vreg_ofs(s, vd));
>>       tcg_gen_addi_ptr(mask, tcg_env, vreg_ofs(s, 0));
>> -    fn(dest, mask, base, tcg_env, desc);
>> -
>> -    if (!is_store) {
>> +    if (is_store) {
>>           mark_vs_dirty(s);
>>       }
>> +    fn(dest, mask, base, tcg_env, desc);
>> +
>> +    mark_vs_dirty(s);
> 
> You misunderstood here, I think.
> Both loads and stores need to set dirty early, before any exit via exception path.
> 
> I see that I did say only stores in the quoted mail, but I believe that was merely in reference to stores not setting dirty *at all* beforehand.

hmmm it made sense when I read your reply to set just for stores because I thought
that loads wouldn't trigger page context switches in the kernel. TBH I got too
caught up by the existing "if (!is_store)" in the code, trying to figure it out
why it was there.

In another read in the spec there's nothing that indicates that stores needs
additional handling, which means that we can treat both equally in this regard.


I'll change it for v4. Thanks,


Daniel


> 
> 
> r~


  reply	other threads:[~2024-02-20 21:10 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-20 19:26 [PATCH v3 0/5] riscv: set vstart_eq_zero on mark_vs_dirty Daniel Henrique Barboza
2024-02-20 19:26 ` [PATCH v3 1/5] trans_rvv.c.inc: mark_vs_dirty() before stores Daniel Henrique Barboza
2024-02-20 20:17   ` Richard Henderson
2024-02-20 21:10     ` Daniel Henrique Barboza [this message]
2024-02-20 19:26 ` [PATCH v3 2/5] target/riscv: remove 'over' brconds from vector trans Daniel Henrique Barboza
2024-02-20 20:19   ` Richard Henderson
2024-02-20 19:26 ` [PATCH v3 3/5] target/riscv/vector_helper.c: set vstart = 0 in GEN_VEXT_VSLIDEUP_VX() Daniel Henrique Barboza
2024-02-20 20:20   ` Richard Henderson
2024-02-20 19:26 ` [PATCH v3 4/5] trans_rvv.c.inc: remove redundant mark_vs_dirty() calls Daniel Henrique Barboza
2024-02-20 20:20   ` Richard Henderson
2024-02-20 19:26 ` [PATCH v3 5/5] target/riscv: Clear vstart_qe_zero flag Daniel Henrique Barboza
2024-02-20 20:22   ` 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=ad667881-f55c-468e-b6a1-8138147f71ef@ventanamicro.com \
    --to=dbarboza@ventanamicro.com \
    --cc=alistair.francis@wdc.com \
    --cc=bmeng@tinylab.org \
    --cc=liwei1518@gmail.com \
    --cc=max.chou@sifive.com \
    --cc=palmer@rivosinc.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-riscv@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=zhiwei_liu@linux.alibaba.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).