diff options
author | avg <avg@FreeBSD.org> | 2013-02-03 09:57:39 +0000 |
---|---|---|
committer | avg <avg@FreeBSD.org> | 2013-02-03 09:57:39 +0000 |
commit | 08016a40d72d610ac6322ad147f8a8ff7ac0e1e7 (patch) | |
tree | 0cbd8af6d2fcc2391a51c88f2c190865a8310018 /sys/kern/kern_ktr.c | |
parent | e1f3d4e1aa9f4cf116f0046597bb1fe1ee36951b (diff) | |
download | FreeBSD-src-08016a40d72d610ac6322ad147f8a8ff7ac0e1e7.zip FreeBSD-src-08016a40d72d610ac6322ad147f8a8ff7ac0e1e7.tar.gz |
allow for large KTR_ENTRIES values by allocating ktr_buf using malloc(9)
Only during very early boot, before malloc(9) is functional (SI_SUB_KMEM),
the static ktr_buf_init is used. Size of the static buffer is determined
by a new kernel option KTR_BOOT_ENTRIES. Its default value is 1024.
This commit builds on top of r243046.
Reviewed by: alc
MFC after: 17 days
Diffstat (limited to 'sys/kern/kern_ktr.c')
-rw-r--r-- | sys/kern/kern_ktr.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/sys/kern/kern_ktr.c b/sys/kern/kern_ktr.c index a83cedf..5b9d7aa 100644 --- a/sys/kern/kern_ktr.c +++ b/sys/kern/kern_ktr.c @@ -66,6 +66,10 @@ __FBSDID("$FreeBSD$"); #include <ddb/db_output.h> #endif +#ifndef KTR_BOOT_ENTRIES +#define KTR_BOOT_ENTRIES 1024 +#endif + #ifndef KTR_ENTRIES #define KTR_ENTRIES 1024 #endif @@ -96,9 +100,9 @@ FEATURE(ktr, "Kernel support for KTR kernel tracing facility"); volatile int ktr_idx = 0; int ktr_mask = KTR_MASK; int ktr_compile = KTR_COMPILE; -int ktr_entries = KTR_ENTRIES; +int ktr_entries = KTR_BOOT_ENTRIES; int ktr_version = KTR_VERSION; -struct ktr_entry ktr_buf_init[KTR_ENTRIES]; +struct ktr_entry ktr_buf_init[KTR_BOOT_ENTRIES]; struct ktr_entry *ktr_buf = ktr_buf_init; cpuset_t ktr_cpumask = CPUSET_T_INITIALIZER(KTR_CPUMASK); static char ktr_cpumask_str[CPUSETBUFSIZ]; @@ -194,6 +198,28 @@ SYSCTL_PROC(_debug_ktr, OID_AUTO, mask, CTLTYPE_UINT|CTLFLAG_RW, 0, 0, sysctl_debug_ktr_mask, "IU", "Bitmask of KTR event classes for which logging is enabled"); +#if KTR_ENTRIES != KTR_BOOT_ENTRIES +/* + * A simplified version of sysctl_debug_ktr_entries. + * No need to care about SMP, scheduling, etc. + */ +static void +ktr_entries_initializer(void *dummy __unused) +{ + int mask; + + /* Temporarily disable ktr in case malloc() is being traced. */ + mask = ktr_mask; + ktr_mask = 0; + ktr_buf = malloc(sizeof(*ktr_buf) * KTR_ENTRIES, M_KTR, + M_WAITOK | M_ZERO); + ktr_entries = KTR_ENTRIES; + ktr_mask = mask; +} +SYSINIT(ktr_entries_initializer, SI_SUB_KMEM, SI_ORDER_ANY, + ktr_entries_initializer, NULL); +#endif + static int sysctl_debug_ktr_entries(SYSCTL_HANDLER_ARGS) { |