summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_ktr.c
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2013-02-03 09:57:39 +0000
committeravg <avg@FreeBSD.org>2013-02-03 09:57:39 +0000
commit08016a40d72d610ac6322ad147f8a8ff7ac0e1e7 (patch)
tree0cbd8af6d2fcc2391a51c88f2c190865a8310018 /sys/kern/kern_ktr.c
parente1f3d4e1aa9f4cf116f0046597bb1fe1ee36951b (diff)
downloadFreeBSD-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.c30
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)
{
OpenPOWER on IntegriCloud