at v3.8 3.3 kB view raw
1#ifndef BLKTRACE_H 2#define BLKTRACE_H 3 4#include <linux/blkdev.h> 5#include <linux/relay.h> 6#include <linux/compat.h> 7#include <uapi/linux/blktrace_api.h> 8 9#if defined(CONFIG_BLK_DEV_IO_TRACE) 10 11#include <linux/sysfs.h> 12 13struct blk_trace { 14 int trace_state; 15 struct rchan *rchan; 16 unsigned long __percpu *sequence; 17 unsigned char __percpu *msg_data; 18 u16 act_mask; 19 u64 start_lba; 20 u64 end_lba; 21 u32 pid; 22 u32 dev; 23 struct dentry *dir; 24 struct dentry *dropped_file; 25 struct dentry *msg_file; 26 atomic_t dropped; 27}; 28 29extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *); 30extern void blk_trace_shutdown(struct request_queue *); 31extern int do_blk_trace_setup(struct request_queue *q, char *name, 32 dev_t dev, struct block_device *bdev, 33 struct blk_user_trace_setup *buts); 34extern __printf(2, 3) 35void __trace_note_message(struct blk_trace *, const char *fmt, ...); 36 37/** 38 * blk_add_trace_msg - Add a (simple) message to the blktrace stream 39 * @q: queue the io is for 40 * @fmt: format to print message in 41 * args... Variable argument list for format 42 * 43 * Description: 44 * Records a (simple) message onto the blktrace stream. 45 * 46 * NOTE: BLK_TN_MAX_MSG characters are output at most. 47 * NOTE: Can not use 'static inline' due to presence of var args... 48 * 49 **/ 50#define blk_add_trace_msg(q, fmt, ...) \ 51 do { \ 52 struct blk_trace *bt = (q)->blk_trace; \ 53 if (unlikely(bt)) \ 54 __trace_note_message(bt, fmt, ##__VA_ARGS__); \ 55 } while (0) 56#define BLK_TN_MAX_MSG 128 57 58extern void blk_add_driver_data(struct request_queue *q, struct request *rq, 59 void *data, size_t len); 60extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 61 struct block_device *bdev, 62 char __user *arg); 63extern int blk_trace_startstop(struct request_queue *q, int start); 64extern int blk_trace_remove(struct request_queue *q); 65extern void blk_trace_remove_sysfs(struct device *dev); 66extern int blk_trace_init_sysfs(struct device *dev); 67 68extern struct attribute_group blk_trace_attr_group; 69 70#else /* !CONFIG_BLK_DEV_IO_TRACE */ 71# define blk_trace_ioctl(bdev, cmd, arg) (-ENOTTY) 72# define blk_trace_shutdown(q) do { } while (0) 73# define do_blk_trace_setup(q, name, dev, bdev, buts) (-ENOTTY) 74# define blk_add_driver_data(q, rq, data, len) do {} while (0) 75# define blk_trace_setup(q, name, dev, bdev, arg) (-ENOTTY) 76# define blk_trace_startstop(q, start) (-ENOTTY) 77# define blk_trace_remove(q) (-ENOTTY) 78# define blk_add_trace_msg(q, fmt, ...) do { } while (0) 79# define blk_trace_remove_sysfs(dev) do { } while (0) 80static inline int blk_trace_init_sysfs(struct device *dev) 81{ 82 return 0; 83} 84 85#endif /* CONFIG_BLK_DEV_IO_TRACE */ 86 87#ifdef CONFIG_COMPAT 88 89struct compat_blk_user_trace_setup { 90 char name[32]; 91 u16 act_mask; 92 u32 buf_size; 93 u32 buf_nr; 94 compat_u64 start_lba; 95 compat_u64 end_lba; 96 u32 pid; 97}; 98#define BLKTRACESETUP32 _IOWR(0x12, 115, struct compat_blk_user_trace_setup) 99 100#endif 101 102#if defined(CONFIG_EVENT_TRACING) && defined(CONFIG_BLOCK) 103 104static inline int blk_cmd_buf_len(struct request *rq) 105{ 106 return (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? rq->cmd_len * 3 : 1; 107} 108 109extern void blk_dump_cmd(char *buf, struct request *rq); 110extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes); 111 112#endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ 113 114#endif