Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8302294f authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'tracing/core-v2' into tracing-for-linus

Conflicts:
	include/linux/slub_def.h
	lib/Kconfig.debug
	mm/slob.c
	mm/slub.c
parents 4fe70410 2e572895
Loading
Loading
Loading
Loading
+71 −0
Original line number Diff line number Diff line
What:		/sys/kernel/debug/kmemtrace/
Date:		July 2008
Contact:	Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
Description:

In kmemtrace-enabled kernels, the following files are created:

/sys/kernel/debug/kmemtrace/
	cpu<n>		(0400)	Per-CPU tracing data, see below. (binary)
	total_overruns	(0400)	Total number of bytes which were dropped from
				cpu<n> files because of full buffer condition,
				non-binary. (text)
	abi_version	(0400)	Kernel's kmemtrace ABI version. (text)

Each per-CPU file should be read according to the relay interface. That is,
the reader should set affinity to that specific CPU and, as currently done by
the userspace application (though there are other methods), use poll() with
an infinite timeout before every read(). Otherwise, erroneous data may be
read. The binary data has the following _core_ format:

	Event ID	(1 byte)	Unsigned integer, one of:
		0 - represents an allocation (KMEMTRACE_EVENT_ALLOC)
		1 - represents a freeing of previously allocated memory
		    (KMEMTRACE_EVENT_FREE)
	Type ID		(1 byte)	Unsigned integer, one of:
		0 - this is a kmalloc() / kfree()
		1 - this is a kmem_cache_alloc() / kmem_cache_free()
		2 - this is a __get_free_pages() et al.
	Event size	(2 bytes)	Unsigned integer representing the
					size of this event. Used to extend
					kmemtrace. Discard the bytes you
					don't know about.
	Sequence number	(4 bytes)	Signed integer used to reorder data
					logged on SMP machines. Wraparound
					must be taken into account, although
					it is unlikely.
	Caller address	(8 bytes)	Return address to the caller.
	Pointer to mem	(8 bytes)	Pointer to target memory area. Can be
					NULL, but not all such calls might be
					recorded.

In case of KMEMTRACE_EVENT_ALLOC events, the next fields follow:

	Requested bytes	(8 bytes)	Total number of requested bytes,
					unsigned, must not be zero.
	Allocated bytes (8 bytes)	Total number of actually allocated
					bytes, unsigned, must not be lower
					than requested bytes.
	Requested flags	(4 bytes)	GFP flags supplied by the caller.
	Target CPU	(4 bytes)	Signed integer, valid for event id 1.
					If equal to -1, target CPU is the same
					as origin CPU, but the reverse might
					not be true.

The data is made available in the same endianness the machine has.

Other event ids and type ids may be defined and added. Other fields may be
added by increasing event size, but see below for details.
Every modification to the ABI, including new id definitions, are followed
by bumping the ABI version by one.

Adding new data to the packet (features) is done at the end of the mandatory
data:
	Feature size	(2 byte)
	Feature ID	(1 byte)
	Feature data	(Feature size - 3 bytes)


Users:
	kmemtrace-user - git://repo.or.cz/kmemtrace-user.git
+769 −365

File changed.

Preview size limit exceeded, changes collapsed.

+12 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ parameter is applicable:
	ISAPNP	ISA PnP code is enabled.
	ISDN	Appropriate ISDN support is enabled.
	JOY	Appropriate joystick support is enabled.
	KMEMTRACE kmemtrace is enabled.
	LIBATA  Libata driver is enabled
	LP	Printer support is enabled.
	LOOP	Loopback device support is enabled.
@@ -1078,6 +1079,15 @@ and is between 256 and 4096 characters. It is defined in the file
			use the HighMem zone if it exists, and the Normal
			zone if it does not.

	kmemtrace.enable=	[KNL,KMEMTRACE] Format: { yes | no }
				Controls whether kmemtrace is enabled
				at boot-time.

	kmemtrace.subbufs=n	[KNL,KMEMTRACE] Overrides the number of
			subbufs kmemtrace's relay channel has. Set this
			higher than default (KMEMTRACE_N_SUBBUFS in code) if
			you experience buffer overruns.

	movablecore=nn[KMG]	[KNL,X86-32,IA-64,PPC,X86-64] This parameter
			is similar to kernelcore except it specifies the
			amount of memory used for migratable allocations.
@@ -2362,6 +2372,8 @@ and is between 256 and 4096 characters. It is defined in the file

	tp720=		[HW,PS2]

	trace_buf_size=nn[KMG] [ftrace] will set tracing buffer size.

	trix=		[HW,OSS] MediaTrix AudioTrix Pro
			Format:
			<io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>
+2 −0
Original line number Diff line number Diff line
@@ -115,6 +115,8 @@ On all - write a character to /proc/sysrq-trigger. e.g.:

'x'	- Used by xmon interface on ppc/powerpc platforms.

'z'	- Dump the ftrace buffer

'0'-'9' - Sets the console log level, controlling which kernel messages
          will be printed to your console. ('0', for example would make
          it so that only emergency messages like PANICs or OOPSes would
+11 −10
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@ In include/trace/subsys.h :
#include <linux/tracepoint.h>

DECLARE_TRACE(subsys_eventname,
	TPPROTO(int firstarg, struct task_struct *p),
	TPARGS(firstarg, p));
	TP_PROTO(int firstarg, struct task_struct *p),
	TP_ARGS(firstarg, p));

In subsys/file.c (where the tracing statement must be added) :

@@ -66,10 +66,10 @@ Where :
    - subsys is the name of your subsystem.
    - eventname is the name of the event to trace.

- TPPROTO(int firstarg, struct task_struct *p) is the prototype of the
- TP_PROTO(int firstarg, struct task_struct *p) is the prototype of the
  function called by this tracepoint.

- TPARGS(firstarg, p) are the parameters names, same as found in the
- TP_ARGS(firstarg, p) are the parameters names, same as found in the
  prototype.

Connecting a function (probe) to a tracepoint is done by providing a
@@ -103,13 +103,14 @@ used to export the defined tracepoints.

* Probe / tracepoint example

See the example provided in samples/tracepoints/src
See the example provided in samples/tracepoints

Compile them with your kernel.
Compile them with your kernel.  They are built during 'make' (not
'make modules') when CONFIG_SAMPLE_TRACEPOINTS=m.

Run, as root :
modprobe tracepoint-example (insmod order is not important)
modprobe tracepoint-probe-example
cat /proc/tracepoint-example (returns an expected error)
rmmod tracepoint-example tracepoint-probe-example
modprobe tracepoint-sample (insmod order is not important)
modprobe tracepoint-probe-sample
cat /proc/tracepoint-sample (returns an expected error)
rmmod tracepoint-sample tracepoint-probe-sample
dmesg
Loading