freebsd-skq/sys/dev/hwpmc
Matt Macy d9f1b8dbf2 hwpmc: Refactor sample ring buffer handling to fix races
Refactor sample ring buffer ring handling to make it more robust to
long running callchain collection handling

r338112 introduced a (now fixed) regression that exposed a number of race
conditions within the management of the sample buffers. This
simplifies the handling and moves the decision to overwrite a
callchain sample that has taken too long out of the NMI in to the
hardlock handler. With this change the problem no longer shows up as a
ring corruption but as the code spending all of its time in callchain
collection.

- Makes the producer / consumer index incrementing monotonic, making it
  easier (for me at least) to reason about.
- Moves the decision to overwrite a sample from NMI context to interrupt
  context where we can enforce serialization.
- Puts a time limit on waiting to collect a user callchain - putting a
  bound on head-of-line blocking causing samples to be dropped
- Removes the flush routine which was previously needed to purge
  dangling references to the pmc from the sample buffers but now is only
  a source of a race condition on unload.

Previously one could lock up or crash HEAD by running:
pmcstat -S inst_retired.any_p -T and then hitting ^C

After this change it is no longer possible.

PR:	231793
Reviewed by:	markj@
Approved by:	re (gjb@)
Differential Revision:	https://reviews.freebsd.org/D17011
2018-10-05 05:55:56 +00:00
..
hwpmc_amd.c Add library and kernel support for AMD Family 17h counters 2018-08-14 05:18:43 +00:00
hwpmc_amd.h sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_arm64_md.c
hwpmc_arm64.c hwpmc: fix arm64 INVARIANTS build 2018-06-08 05:48:28 +00:00
hwpmc_arm64.h
hwpmc_arm.c hwpmc: remove dangling references to hwpmc_xscale 2018-06-08 20:39:49 +00:00
hwpmc_armv7.c hwpmc: simplify calling convention for hwpmc interrupt handling 2018-06-08 04:58:03 +00:00
hwpmc_armv7.h
hwpmc_core.c hwpmc: avoid undefined variable on LINT 2018-06-08 05:01:09 +00:00
hwpmc_core.h hwpmc: ABI fixes 2018-06-04 02:05:48 +00:00
hwpmc_e500.c hwpmc: update files missed by r334827 2018-06-08 17:41:49 +00:00
hwpmc_intel.c hwpmc: remove unused pre-table driven bits for intel 2018-05-31 22:41:07 +00:00
hwpmc_logging.c hwpmc: Refactor sample ring buffer handling to fix races 2018-10-05 05:55:56 +00:00
hwpmc_mips24k.c sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_mips74k.c
hwpmc_mips.c hwpmc: update files missed by r334827 2018-06-08 17:41:49 +00:00
hwpmc_mod.c hwpmc: Refactor sample ring buffer handling to fix races 2018-10-05 05:55:56 +00:00
hwpmc_mpc7xxx.c hwpmc: update files missed by r334827 2018-06-08 17:41:49 +00:00
hwpmc_octeon.c sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_powerpc.c sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_powerpc.h sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_ppc970.c hwpmc: update files missed by r334827 2018-06-08 17:41:49 +00:00
hwpmc_riscv.h
hwpmc_soft.c hwpmc: simplify calling convention for hwpmc interrupt handling 2018-06-08 04:58:03 +00:00
hwpmc_soft.h sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_sparc64.c sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_tsc.c sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_tsc.h sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_uncore.c hwpmc: remove unused pre-table driven bits for intel 2018-05-31 22:41:07 +00:00
hwpmc_uncore.h hwpmc: remove unused pre-table driven bits for intel 2018-05-31 22:41:07 +00:00
hwpmc_x86.c sys/dev: further adoption of SPDX licensing ID tags. 2017-11-27 14:52:40 +00:00
hwpmc_xscale.h Revert r336773: it removed too much. 2018-07-27 21:25:01 +00:00
pmc_events.h Revert r336773: it removed too much. 2018-07-27 21:25:01 +00:00