xref: /freebsd/sys/compat/linux/stats_timing.d (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1*19e252baSAlexander Leidinger #!/usr/sbin/dtrace -qs
2*19e252baSAlexander Leidinger 
3*19e252baSAlexander Leidinger /*-
4*19e252baSAlexander Leidinger  * Copyright (c) 2008-2012 Alexander Leidinger <netchild@FreeBSD.org>
5*19e252baSAlexander Leidinger  * All rights reserved.
6*19e252baSAlexander Leidinger  *
7*19e252baSAlexander Leidinger  * Redistribution and use in source and binary forms, with or without
8*19e252baSAlexander Leidinger  * modification, are permitted provided that the following conditions
9*19e252baSAlexander Leidinger  * are met:
10*19e252baSAlexander Leidinger  * 1. Redistributions of source code must retain the above copyright
11*19e252baSAlexander Leidinger  *    notice, this list of conditions and the following disclaimer
12*19e252baSAlexander Leidinger  *    in this position and unchanged.
13*19e252baSAlexander Leidinger  * 2. Redistributions in binary form must reproduce the above copyright
14*19e252baSAlexander Leidinger  *    notice, this list of conditions and the following disclaimer in the
15*19e252baSAlexander Leidinger  *    documentation and/or other materials provided with the distribution.
16*19e252baSAlexander Leidinger  *
17*19e252baSAlexander Leidinger  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18*19e252baSAlexander Leidinger  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19*19e252baSAlexander Leidinger  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*19e252baSAlexander Leidinger  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21*19e252baSAlexander Leidinger  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22*19e252baSAlexander Leidinger  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*19e252baSAlexander Leidinger  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*19e252baSAlexander Leidinger  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*19e252baSAlexander Leidinger  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26*19e252baSAlexander Leidinger  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*19e252baSAlexander Leidinger  */
28*19e252baSAlexander Leidinger 
29*19e252baSAlexander Leidinger /**
30*19e252baSAlexander Leidinger  * Some statistics (all per provider):
31*19e252baSAlexander Leidinger  *  - number of calls to a function per executable binary (not per PID!)
32*19e252baSAlexander Leidinger  *    - allows to see where an optimization would be beneficial for a given
33*19e252baSAlexander Leidinger  *      application
34*19e252baSAlexander Leidinger  *  - graph of CPU time spend in functions per executable binary
35*19e252baSAlexander Leidinger  *    - together with the number of calls to this function this allows
36*19e252baSAlexander Leidinger  *      to determine if a kernel optimization would be beneficial / is
37*19e252baSAlexander Leidinger  *      possible for a given application
38*19e252baSAlexander Leidinger  *  - graph of longest running (CPU-time!) function in total
39*19e252baSAlexander Leidinger  *    - may help finding problem cases in the kernel code
40*19e252baSAlexander Leidinger  * - graph of longest held (CPU-time!) locks
41*19e252baSAlexander Leidinger  */
42*19e252baSAlexander Leidinger 
43*19e252baSAlexander Leidinger #pragma D option dynvarsize=32m
44*19e252baSAlexander Leidinger 
45*19e252baSAlexander Leidinger linuxulator*:::entry
46*19e252baSAlexander Leidinger {
47*19e252baSAlexander Leidinger 	self->time[probefunc] = vtimestamp;
48*19e252baSAlexander Leidinger 	@calls[probeprov, execname, probefunc] = count();
49*19e252baSAlexander Leidinger }
50*19e252baSAlexander Leidinger 
51*19e252baSAlexander Leidinger linuxulator*:::return
52*19e252baSAlexander Leidinger /self->time[probefunc] != 0/
53*19e252baSAlexander Leidinger {
54*19e252baSAlexander Leidinger 	this->timediff = self->time[probefunc] - vtimestamp;
55*19e252baSAlexander Leidinger 
56*19e252baSAlexander Leidinger 	@stats[probeprov, execname, probefunc] = quantize(this->timediff);
57*19e252baSAlexander Leidinger 	@longest[probeprov, probefunc] = max(this->timediff);
58*19e252baSAlexander Leidinger 
59*19e252baSAlexander Leidinger 	self->time[probefunc] = 0;
60*19e252baSAlexander Leidinger }
61*19e252baSAlexander Leidinger 
62*19e252baSAlexander Leidinger linuxulator*:::locked
63*19e252baSAlexander Leidinger {
64*19e252baSAlexander Leidinger 	self->lock[arg0] = vtimestamp;
65*19e252baSAlexander Leidinger }
66*19e252baSAlexander Leidinger 
67*19e252baSAlexander Leidinger linuxulator*:::unlock
68*19e252baSAlexander Leidinger /self->lock[arg0] != 0/
69*19e252baSAlexander Leidinger {
70*19e252baSAlexander Leidinger 	this->timediff = self->lock[arg0] - vtimestamp;
71*19e252baSAlexander Leidinger 
72*19e252baSAlexander Leidinger 	@lockstats[probefunc] = quantize(this->timediff);
73*19e252baSAlexander Leidinger 	@longlock[probefunc] = max(this->timediff);
74*19e252baSAlexander Leidinger 
75*19e252baSAlexander Leidinger 	self->lock[arg0] = 0;
76*19e252baSAlexander Leidinger }
77*19e252baSAlexander Leidinger 
78*19e252baSAlexander Leidinger END
79*19e252baSAlexander Leidinger {
80*19e252baSAlexander Leidinger 	printf("Number of calls per provider/application/kernel function:");
81*19e252baSAlexander Leidinger 	printa(@calls);
82*19e252baSAlexander Leidinger 	printf("CPU-timing statistics per provider/application/kernel function (in ns):");
83*19e252baSAlexander Leidinger 	printa(@stats);
84*19e252baSAlexander Leidinger 	printf("Longest running (CPU-time!) functions per provider (in ns):");
85*19e252baSAlexander Leidinger 	printa(@longest);
86*19e252baSAlexander Leidinger 	printf("Lock CPU-timing statistics:");
87*19e252baSAlexander Leidinger 	printa(@lockstats);
88*19e252baSAlexander Leidinger 	printf("Longest running (CPU-time!) locks:");
89*19e252baSAlexander Leidinger 	printa(@longlock);
90*19e252baSAlexander Leidinger }
91*19e252baSAlexander Leidinger 
92