• E
    translate-all: protect TB jumps with a per-destination-TB lock · 194125e3
    Emilio G. Cota 提交于
    This applies to both user-mode and !user-mode emulation.
    
    Instead of relying on a global lock, protect the list of incoming
    jumps with tb->jmp_lock. This lock also protects tb->cflags,
    so update all tb->cflags readers outside tb->jmp_lock to use
    atomic reads via tb_cflags().
    
    In order to find the destination TB (and therefore its jmp_lock)
    from the origin TB, we introduce tb->jmp_dest[].
    
    I considered not using a linked list of jumps, which simplifies
    code and makes the struct smaller. However, it unnecessarily increases
    memory usage, which results in a performance decrease. See for
    instance these numbers booting+shutting down debian-arm:
                          Time (s)  Rel. err (%)  Abs. err (s)  Rel. slowdown (%)
    ------------------------------------------------------------------------------
     before                  20.88          0.74      0.154512                 0.
     after                   20.81          0.38      0.079078        -0.33524904
     GTree                   21.02          0.28      0.058856         0.67049808
     GHashTable + xxhash     21.63          1.08      0.233604          3.5919540
    
    Using a hash table or a binary tree to keep track of the jumps
    doesn't really pay off, not only due to the increased memory usage,
    but also because most TBs have only 0 or 1 jumps to them. The maximum
    number of jumps when booting debian-arm that I measured is 35, but
    as we can see in the histogram below a TB with that many incoming jumps
    is extremely rare; the average TB has 0.80 incoming jumps.
    
    n_jumps: 379208; avg jumps/tb: 0.801099
    dist: [0.0,1.0)|▄█▁▁▁▁▁▁▁▁▁▁▁ ▁▁▁▁▁▁ ▁▁▁  ▁▁▁     ▁|[34.0,35.0]
    Reviewed-by: NRichard Henderson <richard.henderson@linaro.org>
    Signed-off-by: NEmilio G. Cota <cota@braap.org>
    Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
    194125e3
translate-all.c 77.8 KB