Performance Monitoring Counters
Contact: Mitchell Horne <mhorne@FreeBSD.org>
This quarter, some improvements were made to the
pmc(3)
library and hwpmc(4)
kernel
module.
Background: Traditionally, PMC event codes have been defined
manually in the sys/dev/hwpmc/pmc_events.h
header and
compiled statically into the kernel. These definitions provide a
translation between an event’s name and its encoding and are
leveraged by PMC tools like pmcstat(8)
via the
pmc(3)
library. In 2018, a new source of truth for
event definitions was introduced for the amd64 and i386
architectures, which is the pmu-events tables. These are a set of
json files, maintained by the Linux kernel, which are compiled
directly into libpmc and provide a more complete set of event
definitions.
The main result of this work was porting the use of the
pmu-events definitions to arm64. Some minor refactoring to libpmc
was performed, making porting to other platforms in the future
easier. A few small bugs were found and fixed along the way;
notably, the "instructions" alias for pmcstat(8)
should work again on Intel CPUs. The ability was added to query the
legacy event tables when pmu-events does not contain the desired
event, restoring the ability to use the pmc.soft(3)
events on x86. Finally, event definitions for newer AMD Zen3 CPUs
were imported (credits: Greg V).
An larger update of the PMU event definitions is planned for Q3 of 2021. This will bring us in sync with 3 years of updates for x86 CPUs and greatly increase the number of events available on arm64 platforms.
Those who make regular or occasional use of FreeBSD’s PMC tools are encouraged to test their typical workflow and report any regressions.
Sponsor: The FreeBSD Foundation
Last modified on: July 24, 2021 by Daniel Ebdrup Jensen