qemu/docs/devel
Emilio G. Cota 194125e3eb translate-all: protect TB jumps with a per-destination-TB lock
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: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2018-06-15 08:18:48 -10:00
..
atomics.txt docs: document atomic_load_acquire and atomic_store_release 2018-03-12 16:12:47 +01:00
blkdebug.txt docs: create config/, devel/ and spin/ subdirectories 2017-06-07 18:22:03 +02:00
blkverify.txt docs: create config/, devel/ and spin/ subdirectories 2017-06-07 18:22:03 +02:00
build-system.txt build-sys: add a rule to print a variable 2018-01-12 13:22:02 +01:00
loads-stores.rst bswap: Add new stn_*_p() and ldn_*_p() memory access functions 2018-06-15 15:23:34 +01:00
lockcnt.txt docs: fix broken paths to docs/devel/atomics.txt 2017-07-31 13:12:47 +03:00
memory.txt memory: get rid of memory_region_init_reservation 2018-06-01 14:15:10 +02:00
migration.rst migration: update docs 2018-05-15 22:13:08 +02:00
multi-thread-tcg.txt translate-all: protect TB jumps with a per-destination-TB lock 2018-06-15 08:18:48 -10:00
multiple-iothreads.txt docs: mark nested AioContext locking as a legacy API 2017-12-19 10:25:09 +00:00
qapi-code-gen.txt qapi: introduce new cmd option "allow-preconfig" 2018-05-30 13:19:09 -03:00
rcu.txt docs: create config/, devel/ and spin/ subdirectories 2017-06-07 18:22:03 +02:00
stable-process.rst docs: document our stable process 2018-02-19 10:51:16 +01:00
testing.rst docs: Add docs/devel/testing.rst 2018-02-08 09:23:07 +08:00
tracing.txt trace: add trace_event_get_state_backends() 2017-08-01 12:13:07 +01:00
virtio-migration.txt docs: create config/, devel/ and spin/ subdirectories 2017-06-07 18:22:03 +02:00
writing-qmp-commands.txt qapi: Move qapi-schema.json to qapi/, rename generated files 2018-03-02 13:45:57 -06:00