From owner-svn-src-all@freebsd.org Mon Jun 4 02:05:51 2018 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2779DFDCF9C; Mon, 4 Jun 2018 02:05:51 +0000 (UTC) (envelope-from mmacy@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id C7D0D6A0F0; Mon, 4 Jun 2018 02:05:50 +0000 (UTC) (envelope-from mmacy@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id A89A026DFD; Mon, 4 Jun 2018 02:05:50 +0000 (UTC) (envelope-from mmacy@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w5425owX074530; Mon, 4 Jun 2018 02:05:50 GMT (envelope-from mmacy@FreeBSD.org) Received: (from mmacy@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w5425m1P074519; Mon, 4 Jun 2018 02:05:48 GMT (envelope-from mmacy@FreeBSD.org) Message-Id: <201806040205.w5425m1P074519@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mmacy set sender to mmacy@FreeBSD.org using -f From: Matt Macy Date: Mon, 4 Jun 2018 02:05:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r334596 - in head: lib/libpmc sys/amd64/include sys/dev/hwpmc sys/i386/include sys/sys X-SVN-Group: head X-SVN-Commit-Author: mmacy X-SVN-Commit-Paths: in head: lib/libpmc sys/amd64/include sys/dev/hwpmc sys/i386/include sys/sys X-SVN-Commit-Revision: 334596 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Jun 2018 02:05:51 -0000 Author: mmacy Date: Mon Jun 4 02:05:48 2018 New Revision: 334596 URL: https://svnweb.freebsd.org/changeset/base/334596 Log: hwpmc: ABI fixes - increase pmc cpuid field from 8 to 12 bits - add cpuid version string to initialize entry in the log so that filter can identify which counter index an event name maps to - GC unused config flags - make fixed counter assignment more robust as well as the changes needed to be properly identified for filter Modified: head/lib/libpmc/libpmc_pmu_util.c (contents, props changed) head/lib/libpmc/pmclog.c head/lib/libpmc/pmclog.h head/sys/amd64/include/pmc_mdep.h head/sys/dev/hwpmc/hwpmc_core.c head/sys/dev/hwpmc/hwpmc_core.h head/sys/dev/hwpmc/hwpmc_logging.c head/sys/i386/include/pmc_mdep.h head/sys/sys/pmc.h head/sys/sys/pmclog.h Modified: head/lib/libpmc/libpmc_pmu_util.c ============================================================================== --- head/lib/libpmc/libpmc_pmu_util.c Mon Jun 4 01:10:23 2018 (r334595) +++ head/lib/libpmc/libpmc_pmu_util.c Mon Jun 4 02:05:48 2018 (r334596) @@ -69,13 +69,14 @@ static struct pmu_alias pmu_alias_table[] = { {NULL, NULL}, }; -static const char *fixed_mode_cntrs[] = { - "inst_retired.any", - "cpu_clk_unhalted.thread", - "cpu_clk_unhalted.thread_any", - "cpu_clk_unhalted.ref_tsc", - NULL -}; +/* + * The Intel fixed mode counters are: + * "inst_retired.any", + * "cpu_clk_unhalted.thread", + * "cpu_clk_unhalted.thread_any", + * "cpu_clk_unhalted.ref_tsc", + * + */ static const char * pmu_alias_get(const char *name) @@ -95,7 +96,7 @@ struct pmu_event_desc { uint32_t ped_frontend; uint32_t ped_ldlat; uint32_t ped_config1; - uint8_t ped_umask; + int16_t ped_umask; uint8_t ped_cmask; uint8_t ped_any; uint8_t ped_inv; @@ -168,6 +169,7 @@ pmu_parse_event(struct pmu_event_desc *ped, const char return (ENOMEM); r = event; bzero(ped, sizeof(*ped)); + ped->ped_umask = -1; while ((kvp = strsep(&event, ",")) != NULL) { key = strsep(&kvp, "="); if (key == NULL) @@ -341,7 +343,6 @@ pmc_pmu_pmcallocate(const char *event_name, struct pmc const struct pmu_event *pe; struct pmu_event_desc ped; struct pmc_md_iap_op_pmcallocate *iap; - struct pmc_md_iaf_op_pmcallocate *iaf; int idx, isfixed; iap = &pm->pm_md.pm_iap; @@ -358,35 +359,22 @@ pmc_pmu_pmcallocate(const char *event_name, struct pmc if (pmu_parse_event(&ped, pe->event)) return (ENOENT); - for (idx = 0; fixed_mode_cntrs[idx] != NULL; idx++) - if (strcmp(fixed_mode_cntrs[idx], event_name) == 0) - isfixed = 1; - if (isfixed) { - iaf = &pm->pm_md.pm_iaf; - pm->pm_class = PMC_CLASS_IAF; - if (strcasestr(pe->desc, "retired") != NULL) - pm->pm_ev = PMC_EV_IAF_INSTR_RETIRED_ANY; - else if (strcasestr(pe->desc, "core") != NULL || - strcasestr(pe->desc, "unhalted")) - pm->pm_ev = PMC_EV_IAF_CPU_CLK_UNHALTED_CORE; - else if (strcasestr(pe->desc, "ref") != NULL) - pm->pm_ev = PMC_EV_IAF_CPU_CLK_UNHALTED_REF; - iaf->pm_iaf_flags |= (IAF_USR | IAF_OS); - if (ped.ped_any) - iaf->pm_iaf_flags |= IAF_ANY; - if (pm->pm_caps & PMC_CAP_INTERRUPT) - iaf->pm_iaf_flags |= IAF_PMI; - return (0); - } else if (strcasestr(event_name, "UNC_") == event_name || - strcasestr(event_name, "uncore") != NULL) { + + if (strcasestr(event_name, "UNC_") == event_name || + strcasestr(event_name, "uncore") != NULL) { pm->pm_class = PMC_CLASS_UCP; - } else { pm->pm_caps |= PMC_CAP_QUALIFIER; + } else if ((ped.ped_umask == -1) || + (ped.ped_event == 0x0 && ped.ped_umask == 0x3)) { + pm->pm_class = PMC_CLASS_IAF; + } else { pm->pm_class = PMC_CLASS_IAP; + pm->pm_caps |= PMC_CAP_QUALIFIER; } pm->pm_ev = idx; iap->pm_iap_config |= IAP_EVSEL(ped.ped_event); - iap->pm_iap_config |= IAP_UMASK(ped.ped_umask); + if (ped.ped_umask > 0) + iap->pm_iap_config |= IAP_UMASK(ped.ped_umask); iap->pm_iap_config |= IAP_CMASK(ped.ped_cmask); iap->pm_iap_rsp = ped.ped_offcore_rsp; Modified: head/lib/libpmc/pmclog.c ============================================================================== --- head/lib/libpmc/pmclog.c Mon Jun 4 01:10:23 2018 (r334595) +++ head/lib/libpmc/pmclog.c Mon Jun 4 02:05:48 2018 (r334596) @@ -348,6 +348,8 @@ pmclog_get_event(void *cookie, char **data, ssize_t *l case PMCLOG_TYPE_INITIALIZE: PMCLOG_READ32(le,ev->pl_u.pl_i.pl_version); PMCLOG_READ32(le,ev->pl_u.pl_i.pl_arch); + PMCLOG_READ32(le, noop); + PMCLOG_READSTRING(le, ev->pl_u.pl_i.pl_cpuid, PMC_CPUID_LEN); ps->ps_version = ev->pl_u.pl_i.pl_version; ps->ps_arch = ev->pl_u.pl_i.pl_arch; ps->ps_initialized = 1; Modified: head/lib/libpmc/pmclog.h ============================================================================== --- head/lib/libpmc/pmclog.h Mon Jun 4 01:10:23 2018 (r334595) +++ head/lib/libpmc/pmclog.h Mon Jun 4 02:05:48 2018 (r334596) @@ -64,6 +64,7 @@ struct pmclog_ev_closelog { struct pmclog_ev_initialize { uint32_t pl_version; uint32_t pl_arch; + char pl_cpuid[PATH_MAX]; }; struct pmclog_ev_map_in { Modified: head/sys/amd64/include/pmc_mdep.h ============================================================================== --- head/sys/amd64/include/pmc_mdep.h Mon Jun 4 01:10:23 2018 (r334595) +++ head/sys/amd64/include/pmc_mdep.h Mon Jun 4 02:05:48 2018 (r334596) @@ -73,7 +73,6 @@ struct pmc_mdep; union pmc_md_op_pmcallocate { struct pmc_md_amd_op_pmcallocate pm_amd; - struct pmc_md_iaf_op_pmcallocate pm_iaf; struct pmc_md_iap_op_pmcallocate pm_iap; struct pmc_md_ucf_op_pmcallocate pm_ucf; struct pmc_md_ucp_op_pmcallocate pm_ucp; Modified: head/sys/dev/hwpmc/hwpmc_core.c ============================================================================== --- head/sys/dev/hwpmc/hwpmc_core.c Mon Jun 4 01:10:23 2018 (r334595) +++ head/sys/dev/hwpmc/hwpmc_core.c Mon Jun 4 02:05:48 2018 (r334596) @@ -224,8 +224,9 @@ static int iaf_allocate_pmc(int cpu, int ri, struct pmc *pm, const struct pmc_op_pmcallocate *a) { - enum pmc_event ev; - uint32_t caps, flags, validflags; + uint8_t ev, umask; + uint32_t caps, flags, config; + const struct pmc_md_iap_op_pmcallocate *iap; KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), ("[core,%d] illegal CPU %d", __LINE__, cpu)); @@ -241,19 +242,32 @@ iaf_allocate_pmc(int cpu, int ri, struct pmc *pm, (caps & IAF_PMC_CAPS) != caps) return (EINVAL); - ev = pm->pm_event; + iap = &a->pm_md.pm_iap; + config = iap->pm_iap_config; + ev = IAP_EVSEL_GET(config); + umask = IAP_UMASK_GET(config); - - if (ev == PMC_EV_IAF_INSTR_RETIRED_ANY && ri != 0) + /* INST_RETIRED.ANY */ + if (ev == 0xC0 && ri != 0) return (EINVAL); - if (ev == PMC_EV_IAF_CPU_CLK_UNHALTED_CORE && ri != 1) + /* CPU_CLK_UNHALTED.THREAD */ + else if (ev == 0x3C && ri != 1) return (EINVAL); - if (ev == PMC_EV_IAF_CPU_CLK_UNHALTED_REF && ri != 2) + /* CPU_CLK_UNHALTED.REF */ + else if (ev == 0x0 && umask == 0x3 && ri != 2) return (EINVAL); + else + return (EINVAL); - flags = a->pm_md.pm_iaf.pm_iaf_flags; - - validflags = IAF_MASK; + flags = 0; + if (config & IAP_OS) + flags |= IAF_OS; + if (config & IAP_USR) + flags |= IAF_USR; + if (config & IAP_ANY) + flags |= IAF_ANY; + if (config & IAP_INT) + flags |= IAF_PMI; if (caps & PMC_CAP_INTERRUPT) flags |= IAF_PMI; Modified: head/sys/dev/hwpmc/hwpmc_core.h ============================================================================== --- head/sys/dev/hwpmc/hwpmc_core.h Mon Jun 4 01:10:23 2018 (r334595) +++ head/sys/dev/hwpmc/hwpmc_core.h Mon Jun 4 02:05:48 2018 (r334596) @@ -39,13 +39,6 @@ #define PERFCAP_SMM_FREEZE 0x1000 #define PERFCAP_FW_WRITE 0x2000 /* full width write aliases */ -/* - * Fixed-function PMCs. - */ -struct pmc_md_iaf_op_pmcallocate { - uint16_t pm_iaf_flags; /* additional flags */ -}; - #define IAF_OS 0x1 #define IAF_USR 0x2 #define IAF_ANY 0x4 Modified: head/sys/dev/hwpmc/hwpmc_logging.c ============================================================================== --- head/sys/dev/hwpmc/hwpmc_logging.c Mon Jun 4 01:10:23 2018 (r334595) +++ head/sys/dev/hwpmc/hwpmc_logging.c Mon Jun 4 02:05:48 2018 (r334596) @@ -726,6 +726,7 @@ pmclog_configure_log(struct pmc_mdep *md, struct pmc_o sizeof(struct pmclog_initialize)); PMCLOG_EMIT32(PMC_VERSION); PMCLOG_EMIT32(md->pmd_cputype); + PMCLOG_EMITSTRING(pmc_cpuid, PMC_CPUID_LEN); PMCLOG_DESPATCH_SYNC(po); return (0); Modified: head/sys/i386/include/pmc_mdep.h ============================================================================== --- head/sys/i386/include/pmc_mdep.h Mon Jun 4 01:10:23 2018 (r334595) +++ head/sys/i386/include/pmc_mdep.h Mon Jun 4 02:05:48 2018 (r334596) @@ -79,7 +79,6 @@ struct pmc_mdep; union pmc_md_op_pmcallocate { struct pmc_md_amd_op_pmcallocate pm_amd; - struct pmc_md_iaf_op_pmcallocate pm_iaf; struct pmc_md_iap_op_pmcallocate pm_iap; struct pmc_md_ucf_op_pmcallocate pm_ucf; struct pmc_md_ucp_op_pmcallocate pm_ucp; Modified: head/sys/sys/pmc.h ============================================================================== --- head/sys/sys/pmc.h Mon Jun 4 01:10:23 2018 (r334595) +++ head/sys/sys/pmc.h Mon Jun 4 02:05:48 2018 (r334596) @@ -61,13 +61,17 @@ * * The patch version is incremented for every bug fix. */ -#define PMC_VERSION_MAJOR 0x05 +#define PMC_VERSION_MAJOR 0x06 #define PMC_VERSION_MINOR 0x01 #define PMC_VERSION_PATCH 0x0000 #define PMC_VERSION (PMC_VERSION_MAJOR << 24 | \ PMC_VERSION_MINOR << 16 | PMC_VERSION_PATCH) +#define PMC_CPUID_LEN 64 +/* cpu model name for pmu lookup */ +extern char pmc_cpuid[PMC_CPUID_LEN]; + /* * Kinds of CPUs known. * @@ -360,13 +364,13 @@ enum pmc_ops { * Flags used in operations on PMCs. */ -#define PMC_F_FORCE 0x00000001 /*OP ADMIN force operation */ +#define PMC_F_UNUSED1 0x00000001 /* unused */ #define PMC_F_DESCENDANTS 0x00000002 /*OP ALLOCATE track descendants */ #define PMC_F_LOG_PROCCSW 0x00000004 /*OP ALLOCATE track ctx switches */ #define PMC_F_LOG_PROCEXIT 0x00000008 /*OP ALLOCATE log proc exits */ #define PMC_F_NEWVALUE 0x00000010 /*OP RW write new value */ #define PMC_F_OLDVALUE 0x00000020 /*OP RW get old value */ -#define PMC_F_KGMON 0x00000040 /*OP ALLOCATE kgmon(8) profiling */ + /* V2 API */ #define PMC_F_CALLCHAIN 0x00000080 /*OP ALLOCATE capture callchains */ #define PMC_F_USERCALLCHAIN 0x00000100 /*OP ALLOCATE use userspace stack */ @@ -392,15 +396,15 @@ typedef uint64_t pmc_value_t; /* * PMC IDs have the following format: * - * +--------+----------+-----------+-----------+ - * | CPU | PMC MODE | PMC CLASS | ROW INDEX | - * +--------+----------+-----------+-----------+ + * +-----------------------+-------+-----------+ + * | CPU | PMC MODE | CLASS | ROW INDEX | + * +-----------------------+-------+-----------+ * - * where each field is 8 bits wide. Field 'CPU' is set to the - * requested CPU for system-wide PMCs or PMC_CPU_ANY for process-mode - * PMCs. Field 'PMC MODE' is the allocated PMC mode. Field 'PMC - * CLASS' is the class of the PMC. Field 'ROW INDEX' is the row index - * for the PMC. + * where CPU is 12 bits, MODE 8, CLASS 4, and ROW INDEX 8 Field 'CPU' + * is set to the requested CPU for system-wide PMCs or PMC_CPU_ANY for + * process-mode PMCs. Field 'PMC MODE' is the allocated PMC mode. + * Field 'PMC CLASS' is the class of the PMC. Field 'ROW INDEX' is the + * row index for the PMC. * * The 'ROW INDEX' ranges over 0..NWPMCS where NHWPMCS is the total * number of hardware PMCs on this cpu. @@ -408,12 +412,12 @@ typedef uint64_t pmc_value_t; #define PMC_ID_TO_ROWINDEX(ID) ((ID) & 0xFF) -#define PMC_ID_TO_CLASS(ID) (((ID) & 0xFF00) >> 8) -#define PMC_ID_TO_MODE(ID) (((ID) & 0xFF0000) >> 16) -#define PMC_ID_TO_CPU(ID) (((ID) & 0xFF000000) >> 24) +#define PMC_ID_TO_CLASS(ID) (((ID) & 0xF00) >> 8) +#define PMC_ID_TO_MODE(ID) (((ID) & 0xFF000) >> 12) +#define PMC_ID_TO_CPU(ID) (((ID) & 0xFFF00000) >> 20) #define PMC_ID_MAKE_ID(CPU,MODE,CLASS,ROWINDEX) \ - ((((CPU) & 0xFF) << 24) | (((MODE) & 0xFF) << 16) | \ - (((CLASS) & 0xFF) << 8) | ((ROWINDEX) & 0xFF)) + ((((CPU) & 0xFFF) << 20) | (((MODE) & 0xFF) << 12) | \ + (((CLASS) & 0xF) << 8) | ((ROWINDEX) & 0xFF)) /* * Data structures for system calls supported by the pmc driver. @@ -1064,9 +1068,6 @@ extern struct pmc_cpu **pmc_pcpu; /* driver statistics */ extern struct pmc_driverstats pmc_stats; - -/* cpu model name for pmu lookup */ -extern char pmc_cpuid[64]; #if defined(HWPMC_DEBUG) #include Modified: head/sys/sys/pmclog.h ============================================================================== --- head/sys/sys/pmclog.h Mon Jun 4 01:10:23 2018 (r334595) +++ head/sys/sys/pmclog.h Mon Jun 4 02:05:48 2018 (r334596) @@ -134,6 +134,7 @@ struct pmclog_initialize { uint32_t pl_version; /* driver version */ uint32_t pl_cpu; /* enum pmc_cputype */ uint32_t pl_pad; + char pl_cpuid[PMC_CPUID_LEN]; } __packed; struct pmclog_map_in {