HomeFreeBSD

hwpmc: fix a race between amd_stop_pmc and amd_intr

Description

hwpmc: fix a race between amd_stop_pmc and amd_intr

It is possible that wrmsr in amd_stop_pmc() causes an overflow in a counter
that it disables. In that case a non-maskable interrupt is generated. The
interrupt handler code was written in such a way that it would re-enable the
counter. That would lead to an unexpected interrupt later on.

This problem was easy to reproduce with
$ pmcstat -T -P instructions -t $pid
if the target process is sufficiently busy and there are context switches from
time to time. There would be a lot of interrupts to "race" with amd_stop_pmc()
called during the context switches. The problem affected only AMD processors.

While there, trace whether amd_intr() claimed an interrupt.

Reviewed by: jhb
MFC after: 2 weeks

Details

Provenance
avgAuthored on
Reviewer
jhb
Parents
rS308100: compile libunwind c source with -fexceptions
Branches
Unknown
Tags
Unknown