xdlg@sundew ~$ kstat eff_freq cpu:0:eff_freq:0 devname: cpu0 tsc: 1236550926085232 0x000464a2f2b22c70 cycles mperf: 69964401124589 0x00003fa1db46a4ed cycles aperf: 37230110386056 0x000021dc4f812788 cycles cpu:1:eff_freq:0 devname: cpu1 tsc: 1236550926613288 0x000464a2f2ba3b28 cycles mperf: 66086455883334 0x00003c1af3ba3646 cycles aperf: 37711401439750 0x0000224c5eafd206 cycles cpu:2:eff_freq:0 devname: cpu2 tsc: 1236550926744624 0x000464a2f2bc3c30 cycles mperf: 117891806849605 0x00006b38d344ea45 cycles aperf: 108054024558633 0x0000624649c01829 cycles cpu:3:eff_freq:0 devname: cpu3 tsc: 1236550926952048 0x000464a2f2bf6670 cycles mperf: 43795326847898 0x000027d4e4e64b9a cycles aperf: 22100464346721 0x00001419aa53a661 cycles cpu:4:eff_freq:0 devname: cpu4 tsc: 1236550927159832 0x000464a2f2c29218 cycles mperf: 32255061127038 0x00001d55f775ef7e cycles aperf: 37549068271859 0x0000222692e040f3 cycles cpu:5:eff_freq:0 devname: cpu5 tsc: 1236550927275792 0x000464a2f2c45710 cycles mperf: 66390311689758 0x00003c61b2f1de1e cycles aperf: 33367425148960 0x00001e58f585e820 cycles cpu:6:eff_freq:0 devname: cpu6 tsc: 1236550927393128 0x000464a2f2c62168 cycles mperf: 78949220393956 0x000047cdcc3ca3e4 cycles aperf: 42184893786904 0x0000265def9beb18 cycles cpu:7:eff_freq:0 devname: cpu7 tsc: 1236550927506600 0x000464a2f2c7dca8 cycles mperf: 84409157666563 0x00004cc509dbc703 cycles aperf: 42394853531438 0x0000268ed22f5f2e cycles cpu:8:eff_freq:0 devname: cpu8 tsc: 1236550927621752 0x000464a2f2c99e78 cycles mperf: 103228778750524 0x00005de2d2b0223c cycles aperf: 71900729260873 0x00004164b16d3b49 cycles cpu:9:eff_freq:0 devname: cpu9 tsc: 1236550927757680 0x000464a2f2cbb170 cycles mperf: 68682687833248 0x00003e776f35e4a0 cycles aperf: 34501715121655 0x00001f610e7955f7 cycles cpu:10:eff_freq:0 devname: cpu10 tsc: 1236550927871168 0x000464a2f2cd6cc0 cycles mperf: 74543252851864 0x000043cbf41b4c98 cycles aperf: 40001771622465 0x00002461a3635041 cycles cpu:11:eff_freq:0 devname: cpu11 tsc: 1236550927999216 0x000464a2f2cf60f0 cycles mperf: 76567777242320 0x000045a35329ecd0 cycles aperf: 39545590552081 0x000023f76ce09611 cycles cpu:12:eff_freq:0 devname: cpu12 tsc: 1236550928114656 0x000464a2f2d123e0 cycles mperf: 80333333346346 0x000049100fcc382a cycles aperf: 42887966441499 0x00002701a201401b cycles cpu:13:eff_freq:0 devname: cpu13 tsc: 1236550928323480 0x000464a2f2d45398 cycles mperf: 1350233458982 0x0000013a602f8926 cycles aperf: 716986956162 0x000000a6efc0b982 cycles cpu:14:eff_freq:0 devname: cpu14 tsc: 1236550928527408 0x000464a2f2d77030 cycles mperf: 1347047459836 0x00000139a2490bfc cycles aperf: 761248042924 0x000000b13deb4fac cycles cpu:15:eff_freq:0 devname: cpu15 tsc: 1236550928738232 0x000464a2f2daa7b8 cycles mperf: 1332186123286 0x000001362c7b0c16 cycles aperf: 707449404280 0x000000a4b7453b78 cycles cpu:16:eff_freq:0 devname: cpu16 tsc: 1236550928844856 0x000464a2f2dc4838 cycles mperf: 1074905606777 0x000000fa455dea79 cycles aperf: 613240893244 0x0000008ec8016f3c cycles cpu:17:eff_freq:0 devname: cpu17 tsc: 1236550929052984 0x000464a2f2df7538 cycles mperf: 1141801654271 0x00000109d8ae97ff cycles aperf: 610730614724 0x0000008e32619fc4 cycles cpu:18:eff_freq:0 devname: cpu18 tsc: 1236550929228776 0x000464a2f2e223e8 cycles mperf: 1040641032976 0x000000f24b0a0310 cycles aperf: 592445961687 0x00000089f087f5d7 cycles cpu:19:eff_freq:0 devname: cpu19 tsc: 1236550929445872 0x000464a2f2e573f0 cycles mperf: 1116950534459 0x000001040f70993b cycles aperf: 597888857497 0x0000008b34f3f599 cycles cpu:20:eff_freq:0 devname: cpu20 tsc: 1236550929652840 0x000464a2f2e89c68 cycles mperf: 1055590304549 0x000000f5c615cb25 cycles aperf: 601495661805 0x0000008c0bef6ced cycles cpu:21:eff_freq:0 devname: cpu21 tsc: 1236550929765168 0x000464a2f2ea5330 cycles mperf: 839375454774 0x000000c36ead0236 cycles aperf: 458183973511 0x0000006aade49a87 cycles cpu:22:eff_freq:0 devname: cpu22 tsc: 1236550929867472 0x000464a2f2ebe2d0 cycles mperf: 784966004953 0x000000b6c39eb0d9 cycles aperf: 459273361653 0x0000006aeed358f5 cycles cpu:23:eff_freq:0 devname: cpu23 tsc: 1236550929964608 0x000464a2f2ed5e40 cycles mperf: 865234850680 0x000000c974041378 cycles aperf: 470630345638 0x0000006d93c12ba6 cycles cpu:24:eff_freq:0 devname: cpu24 tsc: 1236550930070168 0x000464a2f2eefa98 cycles mperf: 804489225119 0x000000bb4f4b639f cycles aperf: 469900434954 0x0000006d683f9e0a cycles cpu:25:eff_freq:0 devname: cpu25 tsc: 1236550930174384 0x000464a2f2f091b0 cycles mperf: 847403941106 0x000000c54d35fcf2 cycles aperf: 460654008704 0x0000006b411e5980 cycles cpu:26:eff_freq:0 devname: cpu26 tsc: 1236550930277984 0x000464a2f2f22660 cycles mperf: 800864553830 0x000000ba773f4b66 cycles aperf: 466862683745 0x0000006cb32f3661 cycles cpu:27:eff_freq:0 devname: cpu27 tsc: 1236550930382960 0x000464a2f2f3c070 cycles mperf: 848510985376 0x000000c58f3224a0 cycles aperf: 461125285817 0x0000006b5d3577b9 cycles cpu:28:eff_freq:0 devname: cpu28 tsc: 1236550930481216 0x000464a2f2f54040 cycles mperf: 804326436337 0x000000bb45976df1 cycles aperf: 467810876170 0x0000006cebb37b0a cycles cpu:29:eff_freq:0 devname: cpu29 tsc: 1236550930689776 0x000464a2f2f86ef0 cycles mperf: 1127023654636 0x0000010667d836ec cycles aperf: 599798222681 0x0000008ba6c28f59 cycles cpu:30:eff_freq:0 devname: cpu30 tsc: 1236550930896376 0x000464a2f2fb95f8 cycles mperf: 1065092605586 0x000000f7fc776692 cycles aperf: 605310953057 0x0000008cef582661 cycles cpu:31:eff_freq:0 devname: cpu31 tsc: 1236550931105728 0x000464a2f2fec7c0 cycles mperf: 13471536808003 0x00000c40962a8043 cycles aperf: 7133663079678 0x0000067cef742cfe cycles Index: cpu.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v retrieving revision 1.154 diff -u -p -r1.154 cpu.c --- cpu.c 31 Aug 2021 17:40:59 -0000 1.154 +++ cpu.c 17 Jan 2022 05:26:53 -0000 @@ -69,6 +69,7 @@ #include "vmm.h" #include "pctr.h" #include "pvbus.h" +#include "kstat.h" #include #include @@ -113,6 +114,10 @@ #include #endif +#if NKSTAT > 0 +#include +#endif + #include #include #include @@ -686,6 +691,69 @@ replacexsave(void) splx(s); } +#if NKSTAT > 0 +struct cpu_perf_kstat { + struct kstat_kv kp_devname; + struct kstat_kv kp_tsc; + struct kstat_kv kp_mperf; + struct kstat_kv kp_aperf; +}; + +int +cpu_perf_read(struct kstat *ks) +{ + struct cpu_perf_kstat *kp = ks->ks_data; + unsigned long s; + + s = intr_disable(); + kstat_kv_u64(&kp->kp_tsc) = rdtsc(); + kstat_kv_u64(&kp->kp_mperf) = rdmsr(0xe7); + kstat_kv_u64(&kp->kp_aperf) = rdmsr(0xe8); + intr_restore(s); + + nanouptime(&ks->ks_updated); + + return (0); +} + +void +cpu_init_kstat(struct cpu_info *ci) +{ + struct kstat *ks; + struct cpu_perf_kstat *kp; + + ks = kstat_create("cpu", CPU_INFO_UNIT(ci), "eff_freq", 0, + KSTAT_T_KV, 0); + if (ks == NULL) { + printf("%s: unable to create kstats\n", ci->ci_dev->dv_xname); + return; + } + + kstat_set_cpu(ks, ci); + + kp = malloc(sizeof(*kp), M_DEVBUF, M_WAITOK|M_ZERO); + + kstat_kv_init(&kp->kp_devname, "devname", KSTAT_KV_T_ISTR); + if (strlcpy(kstat_kv_istr(&kp->kp_devname), ci->ci_dev->dv_xname, + sizeof(kstat_kv_istr(&kp->kp_devname))) >= + sizeof(kstat_kv_istr(&kp->kp_devname))) + panic("%s: devname too long", __func__); + + kstat_kv_unit_init(&kp->kp_tsc, "tsc", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_CYCLES); + kstat_kv_unit_init(&kp->kp_mperf, "mperf", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_CYCLES); + kstat_kv_unit_init(&kp->kp_aperf, "aperf", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_CYCLES); + + ks->ks_data = kp; + ks->ks_datalen = sizeof(*kp); + ks->ks_read = cpu_perf_read; + + //ci->ci_kstat = ks; + kstat_install(ks); +} +#endif /* NKSTAT > 0 */ /* * Initialize the processor appropriately. @@ -810,6 +878,10 @@ cpu_boot_secondary_processors(void) continue; if ((ci->ci_flags & CPUF_PRESENT) == 0) continue; +#if NKSTAT > 0 + /* this is a convenient place to do this */ + cpu_init_kstat(ci); +#endif if (ci->ci_flags & (CPUF_BSP | CPUF_SP | CPUF_PRIMARY)) continue; ci->ci_randseed = (arc4random() & 0x7fffffff) + 1;