[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC PATCH] target/ppc: fix address translation bug for hash table m
From: |
Bruno Piazera Larsen |
Subject: |
Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus |
Date: |
Tue, 8 Jun 2021 13:37:51 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 |
On 08/06/2021 12:35, Richard Henderson
wrote:
On
6/8/21 7:39 AM, Bruno Piazera Larsen wrote:
That's odd. We already have more
arguments than the number of argument registers... A 5x
slowdown is distinctly odd.
I did some more digging and the problem is not with
ppc_radix64_check_prot, the problem is ppc_radix64_xlate, which
currently has 7 arguments and we're increasing to 8. 7 feels
like the correct number, but I couldn't find docs supporting it,
so I could be wrong.
According to tcg/ppc/tcg-target.c.inc, there are 8 argument
registers for ppc hosts. But now I see you didn't actually say on
which host you observed the problem... It's 6 argument registers
for x86_64 host.
Oh, yes, sorry. I'm experiencing it in a POWER9 machine (ppc64le
architecture). According to tcg this shouldn't be the issue, then,
so idk if that's the real reason or not. All I know is that as
soon as gcc can't optimize an argument away it happens (fprintf in
radix64_xlate, using one of the mmuidx_* functions, defining those
as macros).
I'll test it in my x86_64 machine and see if such a slowdown
happens. It's not conclusive evidence, but the function is too
complex for me to follow the disassembly if I can avoid it...
That means we'd have to define radix_ctx_t
(or however we call it) in radix64.h, setup the struct on
ppc_xlate, then pass it to ppc_radix64_xlate.
Well, if you're going to change the xlate interface, you want to
do that across all of them. So, not call it radix_ctx_t.
I wouldn't change ppc_xlate's interface, I'd set up the struct in
that function and call ppc_radix64_xlate using the struct
From looking at the code, it seems the
most useful bits to put in the struct are: eaddr, g_addr,
h_addr, {h,g}_prot, {g,h}_page_size, mmu_idx and guest_visible.
They all seem reasonable to me, but I might be missing something
again.
I don't think h/g should be in this struct. I think h/g should
use different struct instances, because they are different
accesses.
Ok, makes sense
r~
- [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Bruno Larsen (billionai), 2021/06/02
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Richard Henderson, 2021/06/02
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Bruno Piazera Larsen, 2021/06/02
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Richard Henderson, 2021/06/02
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Bruno Piazera Larsen, 2021/06/07
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Richard Henderson, 2021/06/07
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Bruno Piazera Larsen, 2021/06/08
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Richard Henderson, 2021/06/08
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus,
Bruno Piazera Larsen <=
- Re: [RFC PATCH] target/ppc: fix address translation bug for hash table mmus, Bruno Piazera Larsen, 2021/06/08