ktr.h revision 256281
1129473Spjd/*- 2129473Spjd * Copyright (c) 1996 Berkeley Software Design, Inc. All rights reserved. 3129473Spjd * 4129473Spjd * Redistribution and use in source and binary forms, with or without 5129473Spjd * modification, are permitted provided that the following conditions 6129473Spjd * are met: 7129473Spjd * 1. Redistributions of source code must retain the above copyright 8129473Spjd * notice, this list of conditions and the following disclaimer. 9129473Spjd * 2. Redistributions in binary form must reproduce the above copyright 10129473Spjd * notice, this list of conditions and the following disclaimer in the 11129473Spjd * documentation and/or other materials provided with the distribution. 12129473Spjd * 3. Berkeley Software Design Inc's name may not be used to endorse or 13129473Spjd * promote products derived from this software without specific prior 14129473Spjd * written permission. 15129473Spjd * 16129473Spjd * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND 17129473Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18129473Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19129473Spjd * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE 20129473Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21129473Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22129473Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23129473Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24129473Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25129473Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26129473Spjd * SUCH DAMAGE. 27129473Spjd * 28129473Spjd * from BSDI $Id: ktr.h,v 1.10.2.7 2000/03/16 21:44:42 cp Exp $ 29129473Spjd * $FreeBSD: stable/10/sys/sys/ktr.h 244445 2012-12-19 20:10:00Z jeff $ 30129473Spjd */ 31129473Spjd 32129473Spjd/* 33129473Spjd * Wraparound kernel trace buffer support. 34129473Spjd */ 35129473Spjd 36129473Spjd#ifndef _SYS_KTR_H_ 37129473Spjd#define _SYS_KTR_H_ 38129473Spjd 39131878Spjd/* 40129473Spjd * Trace classes 41129473Spjd * 42129473Spjd * Two of the trace classes (KTR_DEV and KTR_SUBSYS) are special in that 43129473Spjd * they are really placeholders so that indvidual drivers and subsystems 44131878Spjd * can map their internal tracing to the general class when they wish to 45129473Spjd * have tracing enabled and map it to 0 when they don't. 46129473Spjd */ 47131878Spjd#define KTR_GEN 0x00000001 /* General (TR) */ 48129473Spjd#define KTR_NET 0x00000002 /* Network */ 49129473Spjd#define KTR_DEV 0x00000004 /* Device driver */ 50129473Spjd#define KTR_LOCK 0x00000008 /* MP locking */ 51129473Spjd#define KTR_SMP 0x00000010 /* MP general */ 52129473Spjd#define KTR_SUBSYS 0x00000020 /* Subsystem. */ 53129473Spjd#define KTR_PMAP 0x00000040 /* Pmap tracing */ 54129473Spjd#define KTR_MALLOC 0x00000080 /* Malloc tracing */ 55129473Spjd#define KTR_TRAP 0x00000100 /* Trap processing */ 56131878Spjd#define KTR_INTR 0x00000200 /* Interrupt tracing */ 57131878Spjd#define KTR_SIG 0x00000400 /* Signal processing */ 58129473Spjd#define KTR_SPARE2 0x00000800 /* XXX Used by cxgb */ 59129473Spjd#define KTR_PROC 0x00001000 /* Process scheduling */ 60129473Spjd#define KTR_SYSC 0x00002000 /* System call */ 61133318Sphk#define KTR_INIT 0x00004000 /* System initialization */ 62129473Spjd#define KTR_SPARE3 0x00008000 /* XXX Used by cxgb */ 63129473Spjd#define KTR_SPARE4 0x00010000 /* XXX Used by cxgb */ 64131878Spjd#define KTR_EVH 0x00020000 /* Eventhandler */ 65131878Spjd#define KTR_VFS 0x00040000 /* VFS events */ 66131878Spjd#define KTR_VOP 0x00080000 /* Auto-generated vop events */ 67129473Spjd#define KTR_VM 0x00100000 /* The virtual memory system */ 68129473Spjd#define KTR_INET 0x00200000 /* IPv4 stack */ 69131878Spjd#define KTR_RUNQ 0x00400000 /* Run queue */ 70131878Spjd#define KTR_CONTENTION 0x00800000 /* Lock contention */ 71131878Spjd#define KTR_UMA 0x01000000 /* UMA slab allocator */ 72131878Spjd#define KTR_CALLOUT 0x02000000 /* Callouts and timeouts */ 73131878Spjd#define KTR_GEOM 0x04000000 /* GEOM I/O events */ 74131878Spjd#define KTR_BUSDMA 0x08000000 /* busdma(9) events */ 75131878Spjd#define KTR_INET6 0x10000000 /* IPv6 stack */ 76131878Spjd#define KTR_SCHED 0x20000000 /* Machine parsed sched info. */ 77131878Spjd#define KTR_BUF 0x40000000 /* Buffer cache */ 78131878Spjd#define KTR_ALL 0x7fffffff 79131878Spjd 80129473Spjd/* Trace classes to compile in */ 81131878Spjd#ifdef KTR 82131878Spjd#ifndef KTR_COMPILE 83131878Spjd#define KTR_COMPILE (KTR_ALL) 84131878Spjd#endif 85131878Spjd#else /* !KTR */ 86131878Spjd#undef KTR_COMPILE 87131878Spjd#define KTR_COMPILE 0 88132095Spjd#endif /* KTR */ 89131878Spjd 90131878Spjd/* 91131878Spjd * Version number for ktr_entry struct. Increment this when you break binary 92132095Spjd * compatibility. 93133205Spjd */ 94133205Spjd#define KTR_VERSION 2 95133205Spjd 96131878Spjd#define KTR_PARMS 6 97129473Spjd 98129473Spjd#ifndef LOCORE 99129473Spjd 100129473Spjd#include <sys/param.h> 101129473Spjd#include <sys/_cpuset.h> 102129473Spjd 103129473Spjdstruct ktr_entry { 104129473Spjd u_int64_t ktr_timestamp; 105129473Spjd int ktr_cpu; 106129473Spjd int ktr_line; 107129473Spjd const char *ktr_file; 108129473Spjd const char *ktr_desc; 109129473Spjd struct thread *ktr_thread; 110129473Spjd u_long ktr_parms[KTR_PARMS]; 111129473Spjd}; 112129473Spjd 113129473Spjdextern cpuset_t ktr_cpumask; 114129473Spjdextern int ktr_mask; 115129473Spjdextern int ktr_entries; 116129473Spjdextern int ktr_verbose; 117129473Spjd 118129473Spjdextern volatile int ktr_idx; 119129473Spjdextern struct ktr_entry *ktr_buf; 120129473Spjd 121129473Spjd#ifdef KTR 122129473Spjd 123131878Spjdvoid ktr_tracepoint(u_int mask, const char *file, int line, 124131878Spjd const char *format, u_long arg1, u_long arg2, u_long arg3, 125131878Spjd u_long arg4, u_long arg5, u_long arg6); 126131878Spjd 127131878Spjd#define CTR6(m, format, p1, p2, p3, p4, p5, p6) do { \ 128131878Spjd if (KTR_COMPILE & (m)) \ 129131878Spjd ktr_tracepoint((m), __FILE__, __LINE__, format, \ 130131878Spjd (u_long)(p1), (u_long)(p2), (u_long)(p3), \ 131131878Spjd (u_long)(p4), (u_long)(p5), (u_long)(p6)); \ 132131878Spjd } while(0) 133131878Spjd#define CTR0(m, format) CTR6(m, format, 0, 0, 0, 0, 0, 0) 134131878Spjd#define CTR1(m, format, p1) CTR6(m, format, p1, 0, 0, 0, 0, 0) 135131878Spjd#define CTR2(m, format, p1, p2) CTR6(m, format, p1, p2, 0, 0, 0, 0) 136131878Spjd#define CTR3(m, format, p1, p2, p3) CTR6(m, format, p1, p2, p3, 0, 0, 0) 137131878Spjd#define CTR4(m, format, p1, p2, p3, p4) CTR6(m, format, p1, p2, p3, p4, 0, 0) 138131878Spjd#define CTR5(m, format, p1, p2, p3, p4, p5) CTR6(m, format, p1, p2, p3, p4, p5, 0) 139131878Spjd#else /* KTR */ 140129473Spjd#define CTR0(m, d) (void)0 141129473Spjd#define CTR1(m, d, p1) (void)0 142129473Spjd#define CTR2(m, d, p1, p2) (void)0 143129473Spjd#define CTR3(m, d, p1, p2, p3) (void)0 144129473Spjd#define CTR4(m, d, p1, p2, p3, p4) (void)0 145129473Spjd#define CTR5(m, d, p1, p2, p3, p4, p5) (void)0 146129473Spjd#define CTR6(m, d, p1, p2, p3, p4, p5, p6) (void)0 147129473Spjd#endif /* KTR */ 148129473Spjd 149129473Spjd#define TR0(d) CTR0(KTR_GEN, d) 150129473Spjd#define TR1(d, p1) CTR1(KTR_GEN, d, p1) 151129473Spjd#define TR2(d, p1, p2) CTR2(KTR_GEN, d, p1, p2) 152129473Spjd#define TR3(d, p1, p2, p3) CTR3(KTR_GEN, d, p1, p2, p3) 153129473Spjd#define TR4(d, p1, p2, p3, p4) CTR4(KTR_GEN, d, p1, p2, p3, p4) 154129473Spjd#define TR5(d, p1, p2, p3, p4, p5) CTR5(KTR_GEN, d, p1, p2, p3, p4, p5) 155129473Spjd#define TR6(d, p1, p2, p3, p4, p5, p6) CTR6(KTR_GEN, d, p1, p2, p3, p4, p5, p6) 156129473Spjd 157129473Spjd/* 158129473Spjd * The event macros implement KTR graphic plotting facilities provided 159129473Spjd * by src/tools/sched/schedgraph.py. Three generic types of events are 160129473Spjd * supported: states, counters, and points. 161129473Spjd * 162129473Spjd * m is the ktr class for ktr_mask. 163129473Spjd * ident is the string identifier that owns the event (ie: "thread 10001") 164129473Spjd * etype is the type of event to plot (state, counter, point) 165129473Spjd * edat is the event specific data (state name, counter value, point name) 166129473Spjd * up to four attributes may be supplied as a name, value pair of arguments. 167129473Spjd * 168129473Spjd * etype and attribute names must be string constants. This minimizes the 169132664Spjd * number of ktr slots required by construction the final format strings 170129473Spjd * at compile time. Both must also include a colon and format specifier 171129473Spjd * (ie. "prio:%d", prio). It is recommended that string arguments be 172129473Spjd * contained within escaped quotes if they may contain ',' or ':' characters. 173129473Spjd * 174129473Spjd * The special attribute (KTR_ATTR_LINKED, ident) creates a reference to another 175132664Spjd * id on the graph for easy traversal of related graph elements. 176129473Spjd */ 177129473Spjd 178129473Spjd#define KTR_ATTR_LINKED "linkedto:\"%s\"" 179129473Spjd#define KTR_EFMT(egroup, ident, etype) \ 180129473Spjd "KTRGRAPH group:\"" egroup "\", id:\"%s\", " etype ", attributes: " 181129473Spjd 182129473Spjd#define KTR_EVENT0(m, egroup, ident, etype, edat) \ 183129473Spjd CTR2(m, KTR_EFMT(egroup, ident, etype) "none", ident, edat) 184129473Spjd#define KTR_EVENT1(m, egroup, ident, etype, edat, a0, v0) \ 185129473Spjd CTR3(m, KTR_EFMT(egroup, ident, etype) a0, ident, edat, (v0)) 186129473Spjd#define KTR_EVENT2(m, egroup, ident, etype, edat, a0, v0, a1, v1) \ 187129473Spjd CTR4(m, KTR_EFMT(egroup, ident, etype) a0 ", " a1, \ 188129473Spjd ident, edat, (v0), (v1)) 189129473Spjd#define KTR_EVENT3(m, egroup, ident, etype, edat, a0, v0, a1, v1, a2, v2)\ 190129473Spjd CTR5(m,KTR_EFMT(egroup, ident, etype) a0 ", " a1 ", " a2, \ 191129473Spjd ident, edat, (v0), (v1), (v2)) 192129473Spjd#define KTR_EVENT4(m, egroup, ident, etype, edat, \ 193129473Spjd a0, v0, a1, v1, a2, v2, a3, v3) \ 194129473Spjd CTR6(m,KTR_EFMT(egroup, ident, etype) a0 ", " a1 ", " a2 ", " a3,\ 195129473Spjd ident, edat, (v0), (v1), (v2), (v3)) 196129473Spjd 197129473Spjd/* 198129473Spjd * State functions graph state changes on an ident. 199129473Spjd */ 200129473Spjd#define KTR_STATE0(m, egroup, ident, state) \ 201129473Spjd KTR_EVENT0(m, egroup, ident, "state:\"%s\"", state) 202129473Spjd#define KTR_STATE1(m, egroup, ident, state, a0, v0) \ 203129473Spjd KTR_EVENT1(m, egroup, ident, "state:\"%s\"", state, a0, (v0)) 204129473Spjd#define KTR_STATE2(m, egroup, ident, state, a0, v0, a1, v1) \ 205129473Spjd KTR_EVENT2(m, egroup, ident, "state:\"%s\"", state, a0, (v0), a1, (v1)) 206129473Spjd#define KTR_STATE3(m, egroup, ident, state, a0, v0, a1, v1, a2, v2) \ 207129473Spjd KTR_EVENT3(m, egroup, ident, "state:\"%s\"", \ 208129473Spjd state, a0, (v0), a1, (v1), a2, (v2)) 209129473Spjd#define KTR_STATE4(m, egroup, ident, state, a0, v0, a1, v1, a2, v2, a3, v3)\ 210129473Spjd KTR_EVENT4(m, egroup, ident, "state:\"%s\"", \ 211129473Spjd state, a0, (v0), a1, (v1), a2, (v2), a3, (v3)) 212129473Spjd 213129473Spjd/* 214129473Spjd * Counter functions graph counter values. The counter id 215129473Spjd * must not be intermixed with a state id. 216129473Spjd */ 217129473Spjd#define KTR_COUNTER0(m, egroup, ident, counter) \ 218129473Spjd KTR_EVENT0(m, egroup, ident, "counter:%d", counter) 219129473Spjd#define KTR_COUNTER1(m, egroup, ident, edat, a0, v0) \ 220129473Spjd KTR_EVENT1(m, egroup, ident, "counter:%d", counter, a0, (v0)) 221129473Spjd#define KTR_COUNTER2(m, egroup, ident, counter, a0, v0, a1, v1) \ 222129473Spjd KTR_EVENT2(m, egroup, ident, "counter:%d", counter, a0, (v0), a1, (v1)) 223129473Spjd#define KTR_COUNTER3(m, egroup, ident, counter, a0, v0, a1, v1, a2, v2) \ 224129473Spjd KTR_EVENT3(m, egroup, ident, "counter:%d", \ 225129473Spjd counter, a0, (v0), a1, (v1), a2, (v2)) 226129473Spjd#define KTR_COUNTER4(m, egroup, ident, counter, a0, v0, a1, v1, a2, v2, a3, v3)\ 227129473Spjd KTR_EVENT4(m, egroup, ident, "counter:%d", \ 228129473Spjd counter, a0, (v0), a1, (v1), a2, (v2), a3, (v3)) 229129473Spjd 230129473Spjd/* 231129473Spjd * Point functions plot points of interest on counter or state graphs. 232129473Spjd */ 233129473Spjd#define KTR_POINT0(m, egroup, ident, point) \ 234129473Spjd KTR_EVENT0(m, egroup, ident, "point:\"%s\"", point) 235129473Spjd#define KTR_POINT1(m, egroup, ident, point, a0, v0) \ 236129473Spjd KTR_EVENT1(m, egroup, ident, "point:\"%s\"", point, a0, (v0)) 237129473Spjd#define KTR_POINT2(m, egroup, ident, point, a0, v0, a1, v1) \ 238129473Spjd KTR_EVENT2(m, egroup, ident, "point:\"%s\"", point, a0, (v0), a1, (v1)) 239129473Spjd#define KTR_POINT3(m, egroup, ident, point, a0, v0, a1, v1, a2, v2) \ 240129473Spjd KTR_EVENT3(m, egroup, ident, "point:\"%s\"", point, \ 241129473Spjd a0, (v0), a1, (v1), a2, (v2)) 242129473Spjd#define KTR_POINT4(m, egroup, ident, point, a0, v0, a1, v1, a2, v2, a3, v3)\ 243129473Spjd KTR_EVENT4(m, egroup, ident, "point:\"%s\"", \ 244129473Spjd point, a0, (v0), a1, (v1), a2, (v2), a3, (v3)) 245129473Spjd 246129473Spjd/* 247129473Spjd * Start functions denote the start of a region of code or operation 248129473Spjd * and should be paired with stop functions for timing of nested 249129473Spjd * sequences. 250129473Spjd * 251129473Spjd * Specifying extra attributes with the name "key" will result in 252129473Spjd * multi-part keys. For example a block device and offset pair 253129473Spjd * might be used to describe a buf undergoing I/O. 254129473Spjd */ 255131878Spjd#define KTR_START0(m, egroup, ident, key) \ 256131878Spjd KTR_EVENT0(m, egroup, ident, "start:0x%jX", (uintmax_t)key) 257129473Spjd#define KTR_START1(m, egroup, ident, key, a0, v0) \ 258131878Spjd KTR_EVENT1(m, egroup, ident, "start:0x%jX", (uintmax_t)key, a0, (v0)) 259131878Spjd#define KTR_START2(m, egroup, ident, key, a0, v0, a1, v1) \ 260131878Spjd KTR_EVENT2(m, egroup, ident, "start:0x%jX", (uintmax_t)key, \ 261131878Spjd a0, (v0), a1, (v1)) 262131878Spjd#define KTR_START3(m, egroup, ident, key, a0, v0, a1, v1, a2, v2)\ 263131878Spjd KTR_EVENT3(m, egroup, ident, "start:0x%jX", (uintmax_t)key, \ 264131878Spjd a0, (v0), a1, (v1), a2, (v2)) 265131878Spjd#define KTR_START4(m, egroup, ident, key, \ 266131878Spjd a0, v0, a1, v1, a2, v2, a3, v3) \ 267131878Spjd KTR_EVENT4(m, egroup, ident, "start:0x%jX", (uintmax_t)key, \ 268131878Spjd a0, (v0), a1, (v1), a2, (v2), a3, (v3)) 269131878Spjd 270131878Spjd/* 271131878Spjd * Stop functions denote the end of a region of code or operation 272131878Spjd * and should be paired with start functions for timing of nested 273131878Spjd * sequences. 274131878Spjd */ 275131878Spjd#define KTR_STOP0(m, egroup, ident, key) \ 276131878Spjd KTR_EVENT0(m, egroup, ident, "stop:0x%jX", (uintmax_t)key) 277131878Spjd#define KTR_STOP1(m, egroup, ident, key, a0, v0) \ 278131878Spjd KTR_EVENT1(m, egroup, ident, "stop:0x%jX", (uintmax_t)key, a0, (v0)) 279131878Spjd#define KTR_STOP2(m, egroup, ident, key, a0, v0, a1, v1) \ 280131878Spjd KTR_EVENT2(m, egroup, ident, "stop:0x%jX", (uintmax_t)key, \ 281131878Spjd a0, (v0), a1, (v1)) 282131878Spjd#define KTR_STOP3(m, egroup, ident, key, a0, v0, a1, v1, a2, v2)\ 283131878Spjd KTR_EVENT3(m, egroup, ident, "stop:0x%jX", (uintmax_t)key, \ 284131878Spjd a0, (v0), a1, (v1), a2, (v2)) 285131878Spjd#define KTR_STOP4(m, egroup, ident, \ 286129473Spjd key, a0, v0, a1, v1, a2, v2, a3, v3) \ 287131878Spjd KTR_EVENT4(m, egroup, ident, "stop:0x%jX", (uintmax_t)key, \ 288131878Spjd a0, (v0), a1, (v1), a2, (v2), a3, (v3)) 289131878Spjd 290131878Spjd/* 291131878Spjd * Trace initialization events, similar to CTR with KTR_INIT, but 292131878Spjd * completely ifdef'ed out if KTR_INIT isn't in KTR_COMPILE (to 293131878Spjd * save string space, the compiler doesn't optimize out strings 294133204Spjd * for the conditional ones above). 295133204Spjd */ 296131878Spjd#if (KTR_COMPILE & KTR_INIT) != 0 297133204Spjd#define ITR0(d) CTR0(KTR_INIT, d) 298133204Spjd#define ITR1(d, p1) CTR1(KTR_INIT, d, p1) 299131878Spjd#define ITR2(d, p1, p2) CTR2(KTR_INIT, d, p1, p2) 300131878Spjd#define ITR3(d, p1, p2, p3) CTR3(KTR_INIT, d, p1, p2, p3) 301131878Spjd#define ITR4(d, p1, p2, p3, p4) CTR4(KTR_INIT, d, p1, p2, p3, p4) 302131878Spjd#define ITR5(d, p1, p2, p3, p4, p5) CTR5(KTR_INIT, d, p1, p2, p3, p4, p5) 303133204Spjd#define ITR6(d, p1, p2, p3, p4, p5, p6) CTR6(KTR_INIT, d, p1, p2, p3, p4, p5, p6) 304133204Spjd#else 305131878Spjd#define ITR0(d) 306131878Spjd#define ITR1(d, p1) 307131878Spjd#define ITR2(d, p1, p2) 308131878Spjd#define ITR3(d, p1, p2, p3) 309131878Spjd#define ITR4(d, p1, p2, p3, p4) 310131878Spjd#define ITR5(d, p1, p2, p3, p4, p5) 311131878Spjd#define ITR6(d, p1, p2, p3, p4, p5, p6) 312131878Spjd#endif 313131878Spjd 314131878Spjd#endif /* !LOCORE */ 315131878Spjd 316129473Spjd#endif /* !_SYS_KTR_H_ */ 317131878Spjd