xref: /spdk/lib/ftl/ftl_trace.h (revision 5977aad8f7486552c94c5cc93ea9bb110e1cb5d0)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright (c) Intel Corporation.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef FTL_TRACE_H
35 #define FTL_TRACE_H
36 
37 #include "ftl_ppa.h"
38 
39 #define FTL_TRACE_INVALID_ID ((uint64_t) -1)
40 
41 typedef uint64_t ftl_trace_group_t;
42 
43 enum ftl_trace_source {
44 	FTL_TRACE_SOURCE_INTERNAL = 0x20,
45 	FTL_TRACE_SOURCE_USER,
46 };
47 
48 enum ftl_trace_type {
49 	FTL_TRACE_TYPE_READ,
50 	FTL_TRACE_TYPE_MD_READ,
51 	FTL_TRACE_TYPE_WRITE,
52 	FTL_TRACE_TYPE_MD_WRITE,
53 	FTL_TRACE_TYPE_ERASE,
54 	FTL_TRACE_TYPE_OTHER,
55 };
56 
57 enum ftl_trace_point {
58 	FTL_TRACE_POINT_SCHEDULED,
59 	FTL_TRACE_POINT_RWB_FILL,
60 	FTL_TRACE_POINT_SUBMISSION,
61 	FTL_TRACE_POINT_OTHER,
62 };
63 
64 enum ftl_trace_completion {
65 	FTL_TRACE_COMPLETION_INVALID = FTL_TRACE_POINT_OTHER + 1,
66 	FTL_TRACE_COMPLETION_CACHE,
67 	FTL_TRACE_COMPLETION_DISK,
68 };
69 
70 struct ftl_event {
71 	/* Id used for grouping multiple events of the same request */
72 	uint64_t		id;
73 } __attribute__((packed));
74 
75 
76 struct ftl_trace;
77 struct ftl_io;
78 struct ftl_rwb_entry;
79 struct ftl_band;
80 
81 #if defined(FTL_TRACE_ENABLED)
82 
83 #define ftl_trace(fn, trace, ...) \
84 	do { \
85 		if (trace) { \
86 			ftl_trace_##fn(trace, ## __VA_ARGS__); \
87 		} \
88 	} while (0)
89 
90 struct ftl_trace *ftl_trace_init(void);
91 void	ftl_trace_free(struct ftl_trace *trace);
92 ftl_trace_group_t ftl_trace_alloc_group(struct ftl_trace *trace);
93 void	ftl_trace_defrag_band(struct ftl_trace *trace, const struct ftl_band *band);
94 void	ftl_trace_write_band(struct ftl_trace *trace, const struct ftl_band *band);
95 void	ftl_trace_lba_io_init(struct ftl_trace *trace, const struct ftl_io *io);
96 void	ftl_trace_rwb_fill(struct ftl_trace *trace, const struct ftl_io *io);
97 void	ftl_trace_rwb_pop(struct ftl_trace *trace, const struct ftl_rwb_entry *entry);
98 void	ftl_trace_submission(struct ftl_trace *trace,
99 			     const struct ftl_io *io,
100 			     struct ftl_ppa ppa, size_t ppa_cnt);
101 void	ftl_trace_completion(struct ftl_trace *trace,
102 			     const struct ftl_io *io,
103 			     enum ftl_trace_completion type);
104 void	ftl_trace_limits(struct ftl_trace *trace, const size_t *limits, size_t num_free);
105 
106 #else
107 #define ftl_trace(fn, trace, ...)
108 #define ftl_trace_alloc_group(trace) FTL_TRACE_INVALID_ID
109 #endif
110 
111 #endif /* FTL_TRACE_H */
112