On Tue, Jul 13, 2021 at 10:07:03AM +0300, Adrian Hunter wrote:
[...]
+/*
- In the compat mode kernel runs in 64-bit and perf tool runs in 32-bit mode,
- 32-bit perf tool cannot access 64-bit value atomically, which might lead to
- the issues caused by the below sequence on multiple CPUs: when perf tool
- accesses either the load operation or the store operation for 64-bit value,
- on some architectures the operation is divided into two instructions, one
- is for accessing the low 32-bit value and another is for the high 32-bit;
- thus these two user operations can give the kernel chances to access the
- 64-bit value, and thus leads to the unexpected load values.
- kernel (64-bit) user (32-bit)
- if (LOAD ->aux_tail) { --, LOAD ->aux_head_lo
STORE $aux_data | ,--->
FLUSH $aux_data | | LOAD ->aux_head_hi
STORE ->aux_head --|-------` smp_rmb()
- } | LOAD $data
| smp_mb()
| STORE ->aux_tail_lo
`----------->
STORE ->aux_tail_hi
- For this reason, it's impossible for the perf tool to work correctly when
- the AUX head or tail is bigger than 4GB (more than 32 bits length); and we
- can not simply limit the AUX ring buffer to less than 4GB, the reason is
- the pointers can be increased monotonically (e.g in snapshot mode), whatever
At least for Intel PT, in snapshot mode, the head is always an offset into the buffer, so never more than 4GB for a 32-bit perf tool. So maybe leave out "(e.g in snapshot mode)"
Sure, will leave out "(e.g in snapshot mode)".
Thanks, Leo