Emilio G. Cota <c...@braap.org> writes: > 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] > > Signed-off-by: Emilio G. Cota <c...@braap.org>
This now conflicts with master -- Alex Bennée