1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM wbt 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_WBT_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_WBT_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/tracepoint.h> 9*4882a593Smuzhiyun #include "../../../block/blk-wbt.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /** 12*4882a593Smuzhiyun * wbt_stat - trace stats for blk_wb 13*4882a593Smuzhiyun * @stat: array of read/write stats 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun TRACE_EVENT(wbt_stat, 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun TP_PROTO(struct backing_dev_info *bdi, struct blk_rq_stat *stat), 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun TP_ARGS(bdi, stat), 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun TP_STRUCT__entry( 22*4882a593Smuzhiyun __array(char, name, 32) 23*4882a593Smuzhiyun __field(s64, rmean) 24*4882a593Smuzhiyun __field(u64, rmin) 25*4882a593Smuzhiyun __field(u64, rmax) 26*4882a593Smuzhiyun __field(s64, rnr_samples) 27*4882a593Smuzhiyun __field(s64, rtime) 28*4882a593Smuzhiyun __field(s64, wmean) 29*4882a593Smuzhiyun __field(u64, wmin) 30*4882a593Smuzhiyun __field(u64, wmax) 31*4882a593Smuzhiyun __field(s64, wnr_samples) 32*4882a593Smuzhiyun __field(s64, wtime) 33*4882a593Smuzhiyun ), 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun TP_fast_assign( 36*4882a593Smuzhiyun strlcpy(__entry->name, bdi_dev_name(bdi), 37*4882a593Smuzhiyun ARRAY_SIZE(__entry->name)); 38*4882a593Smuzhiyun __entry->rmean = stat[0].mean; 39*4882a593Smuzhiyun __entry->rmin = stat[0].min; 40*4882a593Smuzhiyun __entry->rmax = stat[0].max; 41*4882a593Smuzhiyun __entry->rnr_samples = stat[0].nr_samples; 42*4882a593Smuzhiyun __entry->wmean = stat[1].mean; 43*4882a593Smuzhiyun __entry->wmin = stat[1].min; 44*4882a593Smuzhiyun __entry->wmax = stat[1].max; 45*4882a593Smuzhiyun __entry->wnr_samples = stat[1].nr_samples; 46*4882a593Smuzhiyun ), 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun TP_printk("%s: rmean=%llu, rmin=%llu, rmax=%llu, rsamples=%llu, " 49*4882a593Smuzhiyun "wmean=%llu, wmin=%llu, wmax=%llu, wsamples=%llu", 50*4882a593Smuzhiyun __entry->name, __entry->rmean, __entry->rmin, __entry->rmax, 51*4882a593Smuzhiyun __entry->rnr_samples, __entry->wmean, __entry->wmin, 52*4882a593Smuzhiyun __entry->wmax, __entry->wnr_samples) 53*4882a593Smuzhiyun ); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /** 56*4882a593Smuzhiyun * wbt_lat - trace latency event 57*4882a593Smuzhiyun * @lat: latency trigger 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun TRACE_EVENT(wbt_lat, 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun TP_PROTO(struct backing_dev_info *bdi, unsigned long lat), 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun TP_ARGS(bdi, lat), 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun TP_STRUCT__entry( 66*4882a593Smuzhiyun __array(char, name, 32) 67*4882a593Smuzhiyun __field(unsigned long, lat) 68*4882a593Smuzhiyun ), 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun TP_fast_assign( 71*4882a593Smuzhiyun strlcpy(__entry->name, bdi_dev_name(bdi), 72*4882a593Smuzhiyun ARRAY_SIZE(__entry->name)); 73*4882a593Smuzhiyun __entry->lat = div_u64(lat, 1000); 74*4882a593Smuzhiyun ), 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun TP_printk("%s: latency %lluus", __entry->name, 77*4882a593Smuzhiyun (unsigned long long) __entry->lat) 78*4882a593Smuzhiyun ); 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /** 81*4882a593Smuzhiyun * wbt_step - trace wb event step 82*4882a593Smuzhiyun * @msg: context message 83*4882a593Smuzhiyun * @step: the current scale step count 84*4882a593Smuzhiyun * @window: the current monitoring window 85*4882a593Smuzhiyun * @bg: the current background queue limit 86*4882a593Smuzhiyun * @normal: the current normal writeback limit 87*4882a593Smuzhiyun * @max: the current max throughput writeback limit 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun TRACE_EVENT(wbt_step, 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun TP_PROTO(struct backing_dev_info *bdi, const char *msg, 92*4882a593Smuzhiyun int step, unsigned long window, unsigned int bg, 93*4882a593Smuzhiyun unsigned int normal, unsigned int max), 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun TP_ARGS(bdi, msg, step, window, bg, normal, max), 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun TP_STRUCT__entry( 98*4882a593Smuzhiyun __array(char, name, 32) 99*4882a593Smuzhiyun __field(const char *, msg) 100*4882a593Smuzhiyun __field(int, step) 101*4882a593Smuzhiyun __field(unsigned long, window) 102*4882a593Smuzhiyun __field(unsigned int, bg) 103*4882a593Smuzhiyun __field(unsigned int, normal) 104*4882a593Smuzhiyun __field(unsigned int, max) 105*4882a593Smuzhiyun ), 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun TP_fast_assign( 108*4882a593Smuzhiyun strlcpy(__entry->name, bdi_dev_name(bdi), 109*4882a593Smuzhiyun ARRAY_SIZE(__entry->name)); 110*4882a593Smuzhiyun __entry->msg = msg; 111*4882a593Smuzhiyun __entry->step = step; 112*4882a593Smuzhiyun __entry->window = div_u64(window, 1000); 113*4882a593Smuzhiyun __entry->bg = bg; 114*4882a593Smuzhiyun __entry->normal = normal; 115*4882a593Smuzhiyun __entry->max = max; 116*4882a593Smuzhiyun ), 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun TP_printk("%s: %s: step=%d, window=%luus, background=%u, normal=%u, max=%u", 119*4882a593Smuzhiyun __entry->name, __entry->msg, __entry->step, __entry->window, 120*4882a593Smuzhiyun __entry->bg, __entry->normal, __entry->max) 121*4882a593Smuzhiyun ); 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /** 124*4882a593Smuzhiyun * wbt_timer - trace wb timer event 125*4882a593Smuzhiyun * @status: timer state status 126*4882a593Smuzhiyun * @step: the current scale step count 127*4882a593Smuzhiyun * @inflight: tracked writes inflight 128*4882a593Smuzhiyun */ 129*4882a593Smuzhiyun TRACE_EVENT(wbt_timer, 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun TP_PROTO(struct backing_dev_info *bdi, unsigned int status, 132*4882a593Smuzhiyun int step, unsigned int inflight), 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun TP_ARGS(bdi, status, step, inflight), 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun TP_STRUCT__entry( 137*4882a593Smuzhiyun __array(char, name, 32) 138*4882a593Smuzhiyun __field(unsigned int, status) 139*4882a593Smuzhiyun __field(int, step) 140*4882a593Smuzhiyun __field(unsigned int, inflight) 141*4882a593Smuzhiyun ), 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun TP_fast_assign( 144*4882a593Smuzhiyun strlcpy(__entry->name, bdi_dev_name(bdi), 145*4882a593Smuzhiyun ARRAY_SIZE(__entry->name)); 146*4882a593Smuzhiyun __entry->status = status; 147*4882a593Smuzhiyun __entry->step = step; 148*4882a593Smuzhiyun __entry->inflight = inflight; 149*4882a593Smuzhiyun ), 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun TP_printk("%s: status=%u, step=%d, inflight=%u", __entry->name, 152*4882a593Smuzhiyun __entry->status, __entry->step, __entry->inflight) 153*4882a593Smuzhiyun ); 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #endif /* _TRACE_WBT_H */ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* This part must be outside protection */ 158*4882a593Smuzhiyun #include <trace/define_trace.h> 159