Index: sys/sparc64/include/ktr.h =================================================================== --- sys/sparc64/include/ktr.h (revision 222201) +++ sys/sparc64/include/ktr.h (working copy) @@ -85,7 +85,9 @@ lduw [PCPU(MID)], r1 ; \ mov 1, r2 ; \ sllx r2, r1, r1 ; \ +#if 0 TEST(ktr_cpumask, r1, r2, r3, l3) ; \ +#endif ATR(desc, r1, r2, r3, l1, l2) #endif /* LOCORE */ Index: sys/conf/NOTES =================================================================== --- sys/conf/NOTES (revision 222201) +++ sys/conf/NOTES (working copy) @@ -441,7 +441,7 @@ options KTR_ENTRIES=1024 options KTR_COMPILE=(KTR_INTR|KTR_PROC) options KTR_MASK=KTR_INTR -options KTR_CPUMASK=0x3 +options KTR_CPUMASK=("0x3") options KTR_VERBOSE # Index: sys/kern/kern_ktr.c =================================================================== --- sys/kern/kern_ktr.c (revision 222201) +++ sys/kern/kern_ktr.c (working copy) @@ -40,8 +40,10 @@ #include "opt_alq.h" #include +#include #include #include +#include #include #include #include @@ -68,10 +70,6 @@ #define KTR_MASK (0) #endif -#ifndef KTR_CPUMASK -#define KTR_CPUMASK (~0) -#endif - #ifndef KTR_TIME #define KTR_TIME get_cyclecount() #endif @@ -84,10 +82,10 @@ SYSCTL_NODE(_debug, OID_AUTO, ktr, CTLFLAG_RD, 0, "KTR options"); -int ktr_cpumask = KTR_CPUMASK; -TUNABLE_INT("debug.ktr.cpumask", &ktr_cpumask); -SYSCTL_INT(_debug_ktr, OID_AUTO, cpumask, CTLFLAG_RW, - &ktr_cpumask, 0, "Bitmask of CPUs on which KTR logging is enabled"); +static char ktr_cpumask[CPUSETBUFSIZ]; +TUNABLE_STR("debug.ktr.cpumask", ktr_cpumask, sizeof(ktr_cpumask)); +SYSCTL_STRING(_debug_ktr, OID_AUTO, cpumask, CTLFLAG_RW, ktr_cpumask, + sizeof(ktr_cpumask), "Bitmask of CPUs on which KTR logging is enabled"); int ktr_mask = KTR_MASK; TUNABLE_INT("debug.ktr.mask", &ktr_mask); @@ -198,6 +196,7 @@ u_long arg1, u_long arg2, u_long arg3, u_long arg4, u_long arg5, u_long arg6) { + cpuset_t intern_cpumask; struct ktr_entry *entry; #ifdef KTR_ALQ struct ale *ale = NULL; @@ -212,8 +211,16 @@ return; if ((ktr_mask & mask) == 0) return; +#ifndef KTR_CPUMASK + CPU_FILL(&intern_cpumask); +#else + if (ktr_cpumask[0] == '\0') + strncpy(ktr_cpumask, KTR_CPUMASK, sizeof(ktr_cpumask)); + if (cpusetobj_strscan(&intern_cpumask, ktr_cpumask) == -1) + return; +#endif cpu = KTR_CPU; - if (((1 << cpu) & ktr_cpumask) == 0) + if (!CPU_ISSET(cpu, &intern_cpumask)) return; #if defined(KTR_VERBOSE) || defined(KTR_ALQ) td = curthread; Index: sys/kern/kern_cpuset.c =================================================================== --- sys/kern/kern_cpuset.c (revision 222201) +++ sys/kern/kern_cpuset.c (working copy) @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -660,6 +661,41 @@ } /* + * Build a valid cpuset_t object from a string representation. + * It expects an incoming buffer at least sized as CPUSETBUFSIZ. + */ +int +cpusetobj_strscan(cpuset_t *set, const char *buf) +{ + u_int nwords; + int i; + + if (strlen(buf) > CPUSETBUFSIZ - 1) + return (-1); + + /* Allow to pass a shorter version of the mask when necessary. */ + nwords = 1; + for (i = 0; buf[i] != '\0'; i++) + if (buf[i] == ',') + nwords++; + if (nwords > _NCPUWORDS) + return (-1); + + CPU_ZERO(set); + for (i = nwords - 1; i > 0; i--) { + if (!sscanf(buf, "%lx, ", &set->__bits[i])) + return (-1); + buf = strstr(buf, " "); + if (buf == NULL) + return (-1); + buf++; + } + if (!sscanf(buf, "%lx", &set->__bits[0])) + return (-1); + return (0); +} + +/* * Apply an anonymous mask to a single thread. */ int Index: sys/sys/cpuset.h =================================================================== --- sys/sys/cpuset.h (revision 222201) +++ sys/sys/cpuset.h (working copy) @@ -216,6 +216,7 @@ int cpuset_setproc_update_set(struct proc *, struct cpuset *); int cpusetobj_ffs(const cpuset_t *); char *cpusetobj_strprint(char *, const cpuset_t *); +int cpusetobj_strscan(cpuset_t *, const char *); #else __BEGIN_DECLS Index: sys/sys/ktr.h =================================================================== --- sys/sys/ktr.h (revision 222201) +++ sys/sys/ktr.h (working copy) @@ -107,7 +107,6 @@ u_long ktr_parms[KTR_PARMS]; }; -extern int ktr_cpumask; extern int ktr_mask; extern int ktr_entries; extern int ktr_verbose;