| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 1 | #ifndef BLKTRACE_H | 
|  | 2 | #define BLKTRACE_H | 
|  | 3 |  | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 4 | #include <linux/blkdev.h> | 
|  | 5 | #include <linux/relay.h> | 
| Arnd Bergmann | 62c2a7d | 2010-07-07 16:51:26 +0200 | [diff] [blame] | 6 | #include <linux/compat.h> | 
| David Howells | 607ca46 | 2012-10-13 10:46:48 +0100 | [diff] [blame] | 7 | #include <uapi/linux/blktrace_api.h> | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 8 |  | 
| Sven Schuetz | c0ddffa | 2008-09-26 10:58:02 +0200 | [diff] [blame] | 9 | #if defined(CONFIG_BLK_DEV_IO_TRACE) | 
| Arnaldo Carvalho de Melo | 157f9c0 | 2009-01-26 15:00:56 -0200 | [diff] [blame] | 10 |  | 
|  | 11 | #include <linux/sysfs.h> | 
|  | 12 |  | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 13 | struct blk_trace { | 
|  | 14 | int trace_state; | 
| Tejun Heo | 3a366e6 | 2013-01-11 13:06:33 -0800 | [diff] [blame] | 15 | bool rq_based; | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 16 | struct rchan *rchan; | 
| Tejun Heo | 43cf38e | 2010-02-02 14:38:57 +0900 | [diff] [blame] | 17 | unsigned long __percpu *sequence; | 
|  | 18 | unsigned char __percpu *msg_data; | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 19 | u16 act_mask; | 
|  | 20 | u64 start_lba; | 
|  | 21 | u64 end_lba; | 
|  | 22 | u32 pid; | 
|  | 23 | u32 dev; | 
|  | 24 | struct dentry *dir; | 
|  | 25 | struct dentry *dropped_file; | 
| Alan D. Brunelle | 02c6230 | 2008-06-11 09:12:52 +0200 | [diff] [blame] | 26 | struct dentry *msg_file; | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 27 | atomic_t dropped; | 
|  | 28 | }; | 
|  | 29 |  | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 30 | extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *); | 
| Jens Axboe | 165125e | 2007-07-24 09:28:11 +0200 | [diff] [blame] | 31 | extern void blk_trace_shutdown(struct request_queue *); | 
| Shawn Du | d0deef5 | 2009-04-14 13:58:56 +0800 | [diff] [blame] | 32 | extern int do_blk_trace_setup(struct request_queue *q, char *name, | 
|  | 33 | dev_t dev, struct block_device *bdev, | 
|  | 34 | struct blk_user_trace_setup *buts); | 
| Joe Perches | b9075fa | 2011-10-31 17:11:33 -0700 | [diff] [blame] | 35 | extern __printf(2, 3) | 
| Joe Perches | 08e8138 | 2011-06-13 10:42:49 +0200 | [diff] [blame] | 36 | void __trace_note_message(struct blk_trace *, const char *fmt, ...); | 
| Arnd Bergmann | 171044d4 | 2007-10-09 13:23:53 +0200 | [diff] [blame] | 37 |  | 
| Alan D. Brunelle | 9d5f09a | 2008-05-27 14:54:41 +0200 | [diff] [blame] | 38 | /** | 
|  | 39 | * blk_add_trace_msg - Add a (simple) message to the blktrace stream | 
|  | 40 | * @q:		queue the io is for | 
|  | 41 | * @fmt:	format to print message in | 
|  | 42 | * args...	Variable argument list for format | 
|  | 43 | * | 
|  | 44 | * Description: | 
|  | 45 | *     Records a (simple) message onto the blktrace stream. | 
|  | 46 | * | 
|  | 47 | *     NOTE: BLK_TN_MAX_MSG characters are output at most. | 
|  | 48 | *     NOTE: Can not use 'static inline' due to presence of var args... | 
|  | 49 | * | 
|  | 50 | **/ | 
|  | 51 | #define blk_add_trace_msg(q, fmt, ...)					\ | 
|  | 52 | do {								\ | 
|  | 53 | struct blk_trace *bt = (q)->blk_trace;			\ | 
|  | 54 | if (unlikely(bt))					\ | 
|  | 55 | __trace_note_message(bt, fmt, ##__VA_ARGS__);	\ | 
|  | 56 | } while (0) | 
| Jens Axboe | 6456591 | 2008-05-28 14:45:33 +0200 | [diff] [blame] | 57 | #define BLK_TN_MAX_MSG		128 | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 58 |  | 
| Arnaldo Carvalho de Melo | 5f3ea37 | 2008-10-30 08:34:33 +0100 | [diff] [blame] | 59 | extern void blk_add_driver_data(struct request_queue *q, struct request *rq, | 
|  | 60 | void *data, size_t len); | 
| Martin K. Petersen | 7da975a | 2008-01-29 19:12:06 +0100 | [diff] [blame] | 61 | extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, | 
| Shawn Du | d0deef5 | 2009-04-14 13:58:56 +0800 | [diff] [blame] | 62 | struct block_device *bdev, | 
| Christof Schmitt | 6da127a | 2008-01-11 10:09:43 +0100 | [diff] [blame] | 63 | char __user *arg); | 
| Martin K. Petersen | 7da975a | 2008-01-29 19:12:06 +0100 | [diff] [blame] | 64 | extern int blk_trace_startstop(struct request_queue *q, int start); | 
|  | 65 | extern int blk_trace_remove(struct request_queue *q); | 
| Zdenek Kabelac | 48c0d4d | 2009-09-25 06:19:26 +0200 | [diff] [blame] | 66 | extern void blk_trace_remove_sysfs(struct device *dev); | 
| Li Zefan | 1d54ad6 | 2009-04-14 14:00:05 +0800 | [diff] [blame] | 67 | extern int blk_trace_init_sysfs(struct device *dev); | 
| Christof Schmitt | 6da127a | 2008-01-11 10:09:43 +0100 | [diff] [blame] | 68 |  | 
| Arnaldo Carvalho de Melo | 157f9c0 | 2009-01-26 15:00:56 -0200 | [diff] [blame] | 69 | extern struct attribute_group blk_trace_attr_group; | 
|  | 70 |  | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 71 | #else /* !CONFIG_BLK_DEV_IO_TRACE */ | 
| Shawn Du | d0deef5 | 2009-04-14 13:58:56 +0800 | [diff] [blame] | 72 | # define blk_trace_ioctl(bdev, cmd, arg)		(-ENOTTY) | 
|  | 73 | # define blk_trace_shutdown(q)				do { } while (0) | 
|  | 74 | # define do_blk_trace_setup(q, name, dev, bdev, buts)	(-ENOTTY) | 
|  | 75 | # define blk_add_driver_data(q, rq, data, len)		do {} while (0) | 
|  | 76 | # define blk_trace_setup(q, name, dev, bdev, arg)	(-ENOTTY) | 
|  | 77 | # define blk_trace_startstop(q, start)			(-ENOTTY) | 
|  | 78 | # define blk_trace_remove(q)				(-ENOTTY) | 
|  | 79 | # define blk_add_trace_msg(q, fmt, ...)			do { } while (0) | 
| Jun'ichi Nomura | b0da3f0 | 2009-10-01 21:16:13 +0200 | [diff] [blame] | 80 | # define blk_trace_remove_sysfs(dev)			do { } while (0) | 
| Li Zefan | 1d54ad6 | 2009-04-14 14:00:05 +0800 | [diff] [blame] | 81 | static inline int blk_trace_init_sysfs(struct device *dev) | 
|  | 82 | { | 
|  | 83 | return 0; | 
|  | 84 | } | 
|  | 85 |  | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 86 | #endif /* CONFIG_BLK_DEV_IO_TRACE */ | 
| Shawn Du | d0deef5 | 2009-04-14 13:58:56 +0800 | [diff] [blame] | 87 |  | 
| Stephen Rothwell | 2669b19 | 2010-07-09 14:24:38 +1000 | [diff] [blame] | 88 | #ifdef CONFIG_COMPAT | 
|  | 89 |  | 
|  | 90 | struct compat_blk_user_trace_setup { | 
|  | 91 | char name[32]; | 
|  | 92 | u16 act_mask; | 
|  | 93 | u32 buf_size; | 
|  | 94 | u32 buf_nr; | 
|  | 95 | compat_u64 start_lba; | 
|  | 96 | compat_u64 end_lba; | 
|  | 97 | u32 pid; | 
|  | 98 | }; | 
|  | 99 | #define BLKTRACESETUP32 _IOWR(0x12, 115, struct compat_blk_user_trace_setup) | 
|  | 100 |  | 
|  | 101 | #endif | 
|  | 102 |  | 
| Li Zefan | f1db457 | 2009-06-10 10:06:24 +0800 | [diff] [blame] | 103 | #if defined(CONFIG_EVENT_TRACING) && defined(CONFIG_BLOCK) | 
| Li Zefan | 5578213 | 2009-06-09 13:43:05 +0800 | [diff] [blame] | 104 |  | 
|  | 105 | static inline int blk_cmd_buf_len(struct request *rq) | 
|  | 106 | { | 
| Christoph Hellwig | 33659eb | 2010-08-07 18:17:56 +0200 | [diff] [blame] | 107 | return (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? rq->cmd_len * 3 : 1; | 
| Li Zefan | 5578213 | 2009-06-09 13:43:05 +0800 | [diff] [blame] | 108 | } | 
|  | 109 |  | 
|  | 110 | extern void blk_dump_cmd(char *buf, struct request *rq); | 
|  | 111 | extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); | 
| Li Zefan | 5578213 | 2009-06-09 13:43:05 +0800 | [diff] [blame] | 112 |  | 
| Li Zefan | f1db457 | 2009-06-10 10:06:24 +0800 | [diff] [blame] | 113 | #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ | 
| Li Zefan | 5578213 | 2009-06-09 13:43:05 +0800 | [diff] [blame] | 114 |  | 
| Jens Axboe | 2056a78 | 2006-03-23 20:00:26 +0100 | [diff] [blame] | 115 | #endif |