summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe/rf_acctrace.h
blob: 4c31bd17d32117edbe9f7df42fcd56c4f2ab669d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*	$OpenBSD: rf_acctrace.h,v 1.3 2002/12/16 07:01:03 tdeval Exp $	*/
/*	$NetBSD: rf_acctrace.h,v 1.3 1999/02/05 00:06:06 oster Exp $	*/

/*
 * Copyright (c) 1995 Carnegie-Mellon University.
 * All rights reserved.
 *
 * Author: Mark Holland
 *
 * Permission to use, copy, modify and distribute this software and
 * its documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */

/*****************************************************************************
 *
 * acctrace.h -- Header file for acctrace.c
 *
 *****************************************************************************/


#ifndef	_RF__RF_ACCTRACE_H_
#define	_RF__RF_ACCTRACE_H_

#include "rf_types.h"
#include "rf_hist.h"
#include "rf_etimer.h"

typedef struct RF_user_acc_stats_s {
	RF_uint64	suspend_ovhd_us;/*
					 * usec spent mucking in the
					 * access-suspension code.
					 */
	RF_uint64	map_us;		/* usec spent mapping the access. */
	RF_uint64	lock_us;	/*
					 * usec spent locking & unlocking
					 * stripes, including time spent
					 * blocked.
					 */
	RF_uint64	dag_create_us;	/* usec spent creating the DAGs. */
	RF_uint64	dag_retry_us;	/*
					 * _total_ usec spent retrying the op
					 * -- not broken down into components.
					 */
	RF_uint64	exec_us;	/* usec spent in DispatchDAG. */
	RF_uint64	exec_engine_us;	/*
					 * usec spent in engine, not including
					 * blocking time.
					 */
	RF_uint64	cleanup_us;	/*
					 * usec spent tearing down the dag &
					 * maps, and generally cleaning up.
					 */
} RF_user_acc_stats_t;

typedef struct RF_recon_acc_stats_s {
	RF_uint32	recon_start_to_fetch_us;
	RF_uint32	recon_fetch_to_return_us;
	RF_uint32	recon_return_to_submit_us;
} RF_recon_acc_stats_t;

typedef struct RF_acctrace_entry_s {
	union {
		RF_user_acc_stats_t	user;
		RF_recon_acc_stats_t	recon;
	}		specific;
	RF_uint8	reconacc;	/*
					 * Whether this is a tracerec for a
					 * user acc or a recon acc.
					 */
	RF_uint64	xor_us;		/* usec spent doing XORs. */
	RF_uint64	q_us;		/* usec spent doing XORs. */
	RF_uint64	plog_us;	/*
					 * usec spent waiting to stuff parity
					 * into log.
					 */
	RF_uint64	diskqueue_us;	/*
					 * _total_ usec spent in disk queue(s),
					 * incl concurrent ops.
					 */
	RF_uint64	diskwait_us;	/*
					 * _total_ usec spent actually waiting
					 * on the disk, incl concurrent ops.
					 */
	RF_uint64	total_us;	/* Total usec spent on this access. */
	RF_uint64	num_phys_ios;	/* Number of physical I/Os invoked. */
	RF_uint64	phys_io_us;	/* Time of physical I/O. */
	RF_Etimer_t	tot_timer;	/*
					 * A timer used to compute total
					 * access time.
					 */
	RF_Etimer_t	timer;		/*
					 * A generic timer val for timing
					 * events that live across procedure
					 * boundaries.
					 */
	RF_Etimer_t	recon_timer;	/* Generic timer for recon stuff. */
	RF_uint64	index;
} RF_AccTraceEntry_t;

typedef struct RF_AccTotals_s {
	/* User acc stats. */
	RF_uint64	suspend_ovhd_us;
	RF_uint64	map_us;
	RF_uint64	lock_us;
	RF_uint64	dag_create_us;
	RF_uint64	dag_retry_us;
	RF_uint64	exec_us;
	RF_uint64	exec_engine_us;
	RF_uint64	cleanup_us;
	RF_uint64	user_reccount;
	/* Recon acc stats. */
	RF_uint64	recon_start_to_fetch_us;
	RF_uint64	recon_fetch_to_return_us;
	RF_uint64	recon_return_to_submit_us;
	RF_uint64	recon_io_overflow_count;
	RF_uint64	recon_phys_io_us;
	RF_uint64	recon_num_phys_ios;
	RF_uint64	recon_diskwait_us;
	RF_uint64	recon_reccount;
	/* Trace entry stats. */
	RF_uint64	xor_us;
	RF_uint64	q_us;
	RF_uint64	plog_us;
	RF_uint64	diskqueue_us;
	RF_uint64	diskwait_us;
	RF_uint64	total_us;
	RF_uint64	num_log_ents;
	RF_uint64	phys_io_overflow_count;
	RF_uint64	num_phys_ios;
	RF_uint64	phys_io_us;
	RF_uint64	bigvals;
	/* Histograms. */
	RF_Hist_t	dw_hist[RF_HIST_NUM_BUCKETS];
	RF_Hist_t	tot_hist[RF_HIST_NUM_BUCKETS];
} RF_AccTotals_t;

#if	RF_UTILITY == 0
RF_DECLARE_EXTERN_MUTEX(rf_tracing_mutex);
#endif	/* RF_UTILITY == 0 */

int  rf_ConfigureAccessTrace(RF_ShutdownList_t **);
void rf_LogTraceRec(RF_Raid_t * raid, RF_AccTraceEntry_t *);
void rf_FlushAccessTraceBuf(void);

#endif	/* !_RF__RF_ACCTRACE_H_ */