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