1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#ifndef BLKTRACEAPI_H 2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLKTRACEAPI_H 3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <asm/types.h> 5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Trace categories 8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatenum { 10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_READ = 1 << 0, /* reads */ 11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_WRITE = 1 << 1, /* writes */ 12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_BARRIER = 1 << 2, /* barrier */ 13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_SYNC = 1 << 3, /* sync */ 14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_QUEUE = 1 << 4, /* queueing/merging */ 15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_REQUEUE = 1 << 5, /* requeueing */ 16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_ISSUE = 1 << 6, /* issue */ 17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_COMPLETE = 1 << 7, /* completions */ 18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_FS = 1 << 8, /* fs requests */ 19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_PC = 1 << 9, /* pc requests */ 20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_NOTIFY = 1 << 10, /* special message */ 21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_AHEAD = 1 << 11, /* readahead */ 22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_META = 1 << 12, /* metadata */ 23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_DISCARD = 1 << 13, /* discard requests */ 24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_DRV_DATA = 1 << 14, /* binary driver data */ 25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat BLK_TC_END = 1 << 15, /* only 16-bits, reminder */ 27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TC_SHIFT (16) 30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TC_ACT(act) ((act) << BLK_TC_SHIFT) 31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Basic trace actions 34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatenum { 36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_QUEUE = 1, /* queued */ 37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_BACKMERGE, /* back merged to existing rq */ 38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_FRONTMERGE, /* front merge to existing rq */ 39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_GETRQ, /* allocated new request */ 40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_SLEEPRQ, /* sleeping on rq allocation */ 41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_REQUEUE, /* request requeued */ 42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_ISSUE, /* sent to driver */ 43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_COMPLETE, /* completed by driver */ 44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_PLUG, /* queue was plugged */ 45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_UNPLUG_IO, /* queue was unplugged by io */ 46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_UNPLUG_TIMER, /* queue was unplugged by timer */ 47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_INSERT, /* insert request */ 48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_SPLIT, /* bio was split */ 49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_BOUNCE, /* bio was bounced */ 50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_REMAP, /* bio was remapped */ 51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_ABORT, /* request aborted */ 52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TA_DRV_DATA, /* binary driver data */ 53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Notify events. 57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatenum blktrace_notify { 59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TN_PROCESS = 0, /* establish pid/name mapping */ 60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TN_TIMESTAMP, /* include system clock */ 61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __BLK_TN_MESSAGE, /* Character string message */ 62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Trace actions in full. Additionally, read or write is masked 66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_QUEUE (__BLK_TA_QUEUE | BLK_TC_ACT(BLK_TC_QUEUE)) 68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_BACKMERGE (__BLK_TA_BACKMERGE | BLK_TC_ACT(BLK_TC_QUEUE)) 69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_FRONTMERGE (__BLK_TA_FRONTMERGE | BLK_TC_ACT(BLK_TC_QUEUE)) 70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_GETRQ (__BLK_TA_GETRQ | BLK_TC_ACT(BLK_TC_QUEUE)) 71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_SLEEPRQ (__BLK_TA_SLEEPRQ | BLK_TC_ACT(BLK_TC_QUEUE)) 72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_REQUEUE (__BLK_TA_REQUEUE | BLK_TC_ACT(BLK_TC_REQUEUE)) 73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_ISSUE (__BLK_TA_ISSUE | BLK_TC_ACT(BLK_TC_ISSUE)) 74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_COMPLETE (__BLK_TA_COMPLETE| BLK_TC_ACT(BLK_TC_COMPLETE)) 75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_PLUG (__BLK_TA_PLUG | BLK_TC_ACT(BLK_TC_QUEUE)) 76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_UNPLUG_IO (__BLK_TA_UNPLUG_IO | BLK_TC_ACT(BLK_TC_QUEUE)) 77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_UNPLUG_TIMER (__BLK_TA_UNPLUG_TIMER | BLK_TC_ACT(BLK_TC_QUEUE)) 78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_INSERT (__BLK_TA_INSERT | BLK_TC_ACT(BLK_TC_QUEUE)) 79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_SPLIT (__BLK_TA_SPLIT) 80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_BOUNCE (__BLK_TA_BOUNCE) 81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE)) 82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE)) 83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA)) 84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY)) 86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY)) 87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_TN_MESSAGE (__BLK_TN_MESSAGE | BLK_TC_ACT(BLK_TC_NOTIFY)) 88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_IO_TRACE_MAGIC 0x65617400 90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLK_IO_TRACE_VERSION 0x07 91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 93e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * The trace itself 94e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 95e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct blk_io_trace { 96e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 magic; /* MAGIC << 8 | version */ 97e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 sequence; /* event number */ 98e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u64 time; /* in nanoseconds */ 99e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u64 sector; /* disk offset */ 100e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 bytes; /* transfer length */ 101e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 action; /* what happened */ 102e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 pid; /* who did it */ 103e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 device; /* device identifier (dev_t) */ 104e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 cpu; /* on what cpu did it happen */ 105e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u16 error; /* completion error */ 106e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u16 pdu_len; /* length of data after this trace */ 107e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 108e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 109e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 110e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * The remap event 111e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 112e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct blk_io_trace_remap { 113e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 device_from; 114e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 device_to; 115e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u64 sector_from; 116e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 117e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 118e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 119e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * User setup structure passed with BLKSTARTTRACE 120e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 121e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstruct blk_user_trace_setup { 122e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char name[32]; /* output */ 123e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u16 act_mask; /* input */ 124e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 buf_size; /* input */ 125e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 buf_nr; /* input */ 126e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u64 start_lba; 127e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u64 end_lba; 128e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u32 pid; 129e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat}; 130e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 131e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLKTRACESETUP _IOWR(0x12,115,struct blk_user_trace_setup) 132e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLKTRACESTART _IO(0x12,116) 133e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLKTRACESTOP _IO(0x12,117) 134e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define BLKTRACETEARDOWN _IO(0x12,118) 135e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 136e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#endif 137