Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/hwpmc/hwpmc_logging.c
| Show First 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | |||||
| #include <sys/signalvar.h> | #include <sys/signalvar.h> | ||||
| #include <sys/smp.h> | #include <sys/smp.h> | ||||
| #include <sys/syscallsubr.h> | #include <sys/syscallsubr.h> | ||||
| #include <sys/sysctl.h> | #include <sys/sysctl.h> | ||||
| #include <sys/systm.h> | #include <sys/systm.h> | ||||
| #include <sys/uio.h> | #include <sys/uio.h> | ||||
| #include <sys/unistd.h> | #include <sys/unistd.h> | ||||
| #include <sys/vnode.h> | #include <sys/vnode.h> | ||||
| #include <sys/syslog.h> | |||||
| #if defined(__i386__) || defined(__amd64__) | #if defined(__i386__) || defined(__amd64__) | ||||
| #include <machine/clock.h> | #include <machine/clock.h> | ||||
| #endif | #endif | ||||
| #define curdomain PCPU_GET(domain) | #define curdomain PCPU_GET(domain) | ||||
| /* | /* | ||||
| ▲ Show 20 Lines • Show All 1,162 Lines • ▼ Show 20 Lines | |||||
| */ | */ | ||||
| void | void | ||||
| pmclog_initialize(void) | pmclog_initialize(void) | ||||
| { | { | ||||
| struct pmclog_buffer *plb; | struct pmclog_buffer *plb; | ||||
| int domain, ncpus, total; | int domain, ncpus, total; | ||||
| if (pmclog_buffer_size <= 0 || pmclog_buffer_size > 16*1024) { | if (pmclog_buffer_size <= 0 || | ||||
| (void) printf("hwpmc: tunable logbuffersize=%d must be " | pmclog_buffer_size > PMC_LOG_BUFFER_SIZE_MAX) { | ||||
| "greater than zero and less than or equal to 16MB.\n", | log(LOG_WARNING, | ||||
| pmclog_buffer_size); | "hwpmc: logbuffersize=%d must be greater than zero " | ||||
| "and less than or equal to %d, resetting to %d\n", | |||||
| pmclog_buffer_size, PMC_LOG_BUFFER_SIZE_MAX, | |||||
| PMC_LOG_BUFFER_SIZE); | |||||
| pmclog_buffer_size = PMC_LOG_BUFFER_SIZE; | pmclog_buffer_size = PMC_LOG_BUFFER_SIZE; | ||||
| } | } | ||||
| if (pmc_nlogbuffers_pcpu <= 0) { | if (pmc_nlogbuffers_pcpu <= 0) { | ||||
| (void) printf("hwpmc: tunable nlogbuffers=%d must be greater " | log(LOG_WARNING, | ||||
| "than zero.\n", pmc_nlogbuffers_pcpu); | "hwpmc: nbuffers_pcpu=%d must be greater than zero, " | ||||
| "resetting to %d\n", | |||||
| pmc_nlogbuffers_pcpu, PMC_NLOGBUFFERS_PCPU); | |||||
| pmc_nlogbuffers_pcpu = PMC_NLOGBUFFERS_PCPU; | pmc_nlogbuffers_pcpu = PMC_NLOGBUFFERS_PCPU; | ||||
| } | } | ||||
| if (pmc_nlogbuffers_pcpu*pmclog_buffer_size > 32*1024) { | |||||
| (void) printf("hwpmc: memory allocated pcpu must be less than 32MB (is %dK).\n", | if (pmc_nlogbuffers_pcpu * pmclog_buffer_size > | ||||
| pmc_nlogbuffers_pcpu*pmclog_buffer_size); | PMC_NLOGBUFFERS_PCPU_MEM_MAX) { | ||||
| log(LOG_WARNING, | |||||
| "hwpmc: nbuffers_pcpu=%d * logbuffersize=%d exceeds " | |||||
| "%dMB per CPU limit, resetting to defaults (%d * %d)\n", | |||||
| pmc_nlogbuffers_pcpu, pmclog_buffer_size, | |||||
| PMC_NLOGBUFFERS_PCPU_MEM_MAX / 1024, | |||||
| PMC_NLOGBUFFERS_PCPU, PMC_LOG_BUFFER_SIZE); | |||||
| pmc_nlogbuffers_pcpu = PMC_NLOGBUFFERS_PCPU; | pmc_nlogbuffers_pcpu = PMC_NLOGBUFFERS_PCPU; | ||||
| pmclog_buffer_size = PMC_LOG_BUFFER_SIZE; | pmclog_buffer_size = PMC_LOG_BUFFER_SIZE; | ||||
| } | } | ||||
| for (domain = 0; domain < vm_ndomains; domain++) { | for (domain = 0; domain < vm_ndomains; domain++) { | ||||
| ncpus = pmc_dom_hdrs[domain]->pdbh_ncpus; | ncpus = pmc_dom_hdrs[domain]->pdbh_ncpus; | ||||
| total = ncpus * pmc_nlogbuffers_pcpu; | total = ncpus * pmc_nlogbuffers_pcpu; | ||||
| plb = malloc_domainset(sizeof(struct pmclog_buffer) * total, | plb = malloc_domainset(sizeof(struct pmclog_buffer) * total, | ||||
| M_PMC, DOMAINSET_PREF(domain), M_WAITOK | M_ZERO); | M_PMC, DOMAINSET_PREF(domain), M_WAITOK | M_ZERO); | ||||
| pmc_dom_hdrs[domain]->pdbh_plbs = plb; | pmc_dom_hdrs[domain]->pdbh_plbs = plb; | ||||
| for (; total > 0; total--, plb++) { | for (; total > 0; total--, plb++) { | ||||
| void *buf; | void *buf; | ||||
| buf = malloc_domainset(1024 * pmclog_buffer_size, M_PMC, | buf = malloc_domainset(1024 * pmclog_buffer_size, M_PMC, | ||||
| DOMAINSET_PREF(domain), M_WAITOK | M_ZERO); | DOMAINSET_PREF(domain), M_WAITOK | M_ZERO); | ||||
| PMCLOG_INIT_BUFFER_DESCRIPTOR(plb, buf, domain); | PMCLOG_INIT_BUFFER_DESCRIPTOR(plb, buf, domain); | ||||
| pmc_plb_rele_unlocked(plb); | pmc_plb_rele_unlocked(plb); | ||||
| } | } | ||||
| } | } | ||||
| mtx_init(&pmc_kthread_mtx, "pmc-kthread", "pmc-sleep", MTX_DEF); | mtx_init(&pmc_kthread_mtx, "pmc-kthread", "pmc-sleep", MTX_DEF); | ||||
| } | } | ||||
| /* | /* | ||||
| * Shutdown logging. | * Shutdown logging. | ||||
| * | * | ||||
| * Destroy mutexes and release memory back the to free pool. | * Destroy mutexes and release memory back the to free pool. | ||||
| */ | */ | ||||
| Show All 17 Lines | |||||