Date: Tue, 28 Jul 2026 19:29:27 +0000 From: Warner Losh <imp@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Ali Mashtizadeh <ali@mashtizadeh.com> Subject: git: ce6ab51fc378 - main - pmc: enable the new pmc commands Message-ID: <6a690317.43317.5f4ea6a7@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=ce6ab51fc3784aec3d7501b50e7d2d0a75507a86 commit ce6ab51fc3784aec3d7501b50e7d2d0a75507a86 Author: Ali Mashtizadeh <ali@mashtizadeh.com> AuthorDate: 2026-07-28 17:46:57 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2026-07-28 19:27:45 +0000 pmc: enable the new pmc commands This change hooks everything up to the pmc command and improves the usage to document all functions. There are a couple older commands that are currently broken that I have hidden from the usage, but left in the code for those using it. I won't remove those until we have our replacements upstreamed that depend on the AMD PMC multiplexing patches. Sponsored by: Netflix Reviewed by: adrian, imp Differential Revision: https://reviews.freebsd.org/D57780 --- usr.sbin/pmc/Makefile | 6 ++++-- usr.sbin/pmc/cmd_pmc.h | 7 +++++-- usr.sbin/pmc/pmc.c | 52 +++++++++++++++++++++++++++++++++++--------------- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/usr.sbin/pmc/Makefile b/usr.sbin/pmc/Makefile index d2f482b8fa5c..c27ad797e696 100644 --- a/usr.sbin/pmc/Makefile +++ b/usr.sbin/pmc/Makefile @@ -6,10 +6,12 @@ MAN= CWARNFLAGS.gcc+= -Wno-redundant-decls CFLAGS+= -I${SRCTOP}/lib/libpmcstat -LIBADD= pmc m pmcstat elf +LIBADD= pmc m util ncursesw pmcstat elf dwarf SRCS= pmc.c pmc_util.c cmd_pmc_stat.c \ cmd_pmc_list.c cmd_pmc_filter.cc \ - cmd_pmc_summary.cc + cmd_pmc_summary.cc \ + cmd_pmc_frontend.cc cmd_pmc_record.cc cmd_pmc_info.cc \ + display.cc util.cc view.cc .include <bsd.prog.mk> diff --git a/usr.sbin/pmc/cmd_pmc.h b/usr.sbin/pmc/cmd_pmc.h index 83c279c4e8b7..795c762cbed5 100644 --- a/usr.sbin/pmc/cmd_pmc.h +++ b/usr.sbin/pmc/cmd_pmc.h @@ -41,10 +41,13 @@ typedef int (*cmd_disp_t)(int, char **); #if defined(__cplusplus) extern "C" { #endif - int cmd_pmc_stat(int, char **); + int cmd_pmc_info(int, char **); int cmd_pmc_filter(int, char **); - int cmd_pmc_stat_system(int, char **); + int cmd_pmc_frontend(int, char **); int cmd_pmc_list_events(int, char **); + int cmd_pmc_record(int, char **); + int cmd_pmc_stat(int, char **); + int cmd_pmc_stat_system(int, char **); int cmd_pmc_summary(int, char **); #if defined(__cplusplus) }; diff --git a/usr.sbin/pmc/pmc.c b/usr.sbin/pmc/pmc.c index 4b4d113e2bd4..92f27db55026 100644 --- a/usr.sbin/pmc/pmc.c +++ b/usr.sbin/pmc/pmc.c @@ -36,11 +36,11 @@ #include <string.h> #include <pmc.h> #include <pmclog.h> +#include <libelf.h> #include <libpmcstat.h> #include <sysexits.h> #include <unistd.h> -#include <libpmcstat.h> #include "cmd_pmc.h" int pmc_displayheight = DEFAULT_DISPLAY_HEIGHT; @@ -57,27 +57,44 @@ struct pmcstat_process_hash_list pmcstat_process_hash[PMCSTAT_NHASH]; struct cmd_handler { const char *ch_name; cmd_disp_t ch_fn; + const char *ch_desc; }; static struct cmd_handler disp_table[] = { - {"stat", cmd_pmc_stat}, - {"stat-system", cmd_pmc_stat_system}, - {"list-events", cmd_pmc_list_events}, - {"filter", cmd_pmc_filter}, - {"summary", cmd_pmc_summary}, - {NULL, NULL} + { "filter", cmd_pmc_filter, NULL }, + { "frontend", cmd_pmc_frontend, "Analyze front-end stalls" }, + { "info", cmd_pmc_info, "Display high level information about a log" }, + { "list-events", cmd_pmc_list_events, "List available PMC events" }, + { "record", cmd_pmc_record, "Record a performance sample" }, + { "stat", cmd_pmc_stat, NULL }, + { "stat-system", cmd_pmc_stat_system, NULL }, + { "summary", cmd_pmc_summary, NULL }, + { NULL, NULL, NULL } }; -static void __dead2 +static void usage(void) { - errx(EX_USAGE, - "\t pmc management utility\n" - "\t stat <program> run program and print stats\n" - "\t stat-system <program> run program and print system wide stats for duration of execution\n" - "\t list-events list PMC events available on host\n" - "\t filter filter records by lwp, pid, or event\n" - ); + int i; + + fprintf(stderr, "Usage: pmc <COMMAND> [OPTIONS] ...\n\n"); + fprintf(stderr, "PMC tool\n\n"); + + fprintf(stderr, "Commands:\n"); + for (i = 0; disp_table[i].ch_name != NULL; i++) { + // Hide stuff we plan to deprecate + if (disp_table[i].ch_desc) + fprintf(stderr, " %-12s %s\n", + disp_table[i].ch_name, disp_table[i].ch_desc); + } + + fprintf(stderr, "\nEnvironment Variables:\n"); + fprintf(stderr, " CLICOLOR Enables color graphs\n"); + fprintf(stderr, " SYSROOT Path to system root\n"); + fprintf(stderr, " SYMROOT Path to debug symbols\n"); + fprintf(stderr, " TERM Controls symbols and color palettes\n"); + + exit(EX_USAGE); } static cmd_disp_t @@ -109,9 +126,14 @@ main(int argc, char **argv) /* Allocate a kqueue */ if ((pmc_kq = kqueue()) < 0) err(EX_OSERR, "ERROR: Cannot allocate kqueue"); + if (pmc_init() < 0) err(EX_UNAVAILABLE, "ERROR: Initialization of the pmc(3) library failed" ); + + if (elf_version(EV_CURRENT) == EV_NONE) + err(EX_UNAVAILABLE, "ERROR: ELF library version too old"); + return (disp(argc, argv)); }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a690317.43317.5f4ea6a7>
