diff options
Diffstat (limited to 'include/trace')
35 files changed, 3153 insertions, 356 deletions
diff --git a/include/trace/events/asoc.h b/include/trace/events/asoc.h index 5fc2dcdd21c..c75c795a377 100644 --- a/include/trace/events/asoc.h +++ b/include/trace/events/asoc.h @@ -11,100 +11,9 @@  struct snd_soc_jack;  struct snd_soc_codec; -struct snd_soc_platform;  struct snd_soc_card;  struct snd_soc_dapm_widget; - -/* - * Log register events - */ -DECLARE_EVENT_CLASS(snd_soc_reg, - -	TP_PROTO(struct snd_soc_codec *codec, unsigned int reg, -		 unsigned int val), - -	TP_ARGS(codec, reg, val), - -	TP_STRUCT__entry( -		__string(	name,		codec->name	) -		__field(	int,		id		) -		__field(	unsigned int,	reg		) -		__field(	unsigned int,	val		) -	), - -	TP_fast_assign( -		__assign_str(name, codec->name); -		__entry->id = codec->id; -		__entry->reg = reg; -		__entry->val = val; -	), - -	TP_printk("codec=%s.%d reg=%x val=%x", __get_str(name), -		  (int)__entry->id, (unsigned int)__entry->reg, -		  (unsigned int)__entry->val) -); - -DEFINE_EVENT(snd_soc_reg, snd_soc_reg_write, - -	TP_PROTO(struct snd_soc_codec *codec, unsigned int reg, -		 unsigned int val), - -	TP_ARGS(codec, reg, val) - -); - -DEFINE_EVENT(snd_soc_reg, snd_soc_reg_read, - -	TP_PROTO(struct snd_soc_codec *codec, unsigned int reg, -		 unsigned int val), - -	TP_ARGS(codec, reg, val) - -); - -DECLARE_EVENT_CLASS(snd_soc_preg, - -	TP_PROTO(struct snd_soc_platform *platform, unsigned int reg, -		 unsigned int val), - -	TP_ARGS(platform, reg, val), - -	TP_STRUCT__entry( -		__string(	name,		platform->name	) -		__field(	int,		id		) -		__field(	unsigned int,	reg		) -		__field(	unsigned int,	val		) -	), - -	TP_fast_assign( -		__assign_str(name, platform->name); -		__entry->id = platform->id; -		__entry->reg = reg; -		__entry->val = val; -	), - -	TP_printk("platform=%s.%d reg=%x val=%x", __get_str(name), -		  (int)__entry->id, (unsigned int)__entry->reg, -		  (unsigned int)__entry->val) -); - -DEFINE_EVENT(snd_soc_preg, snd_soc_preg_write, - -	TP_PROTO(struct snd_soc_platform *platform, unsigned int reg, -		 unsigned int val), - -	TP_ARGS(platform, reg, val) - -); - -DEFINE_EVENT(snd_soc_preg, snd_soc_preg_read, - -	TP_PROTO(struct snd_soc_platform *platform, unsigned int reg, -		 unsigned int val), - -	TP_ARGS(platform, reg, val) - -); +struct snd_soc_dapm_path;  DECLARE_EVENT_CLASS(snd_soc_card, diff --git a/include/trace/events/bcache.h b/include/trace/events/bcache.h index 5ebda976ea9..c9c3c044b32 100644 --- a/include/trace/events/bcache.h +++ b/include/trace/events/bcache.h @@ -6,11 +6,9 @@  #include <linux/tracepoint.h> -struct search; -  DECLARE_EVENT_CLASS(bcache_request, -	TP_PROTO(struct search *s, struct bio *bio), -	TP_ARGS(s, bio), +	TP_PROTO(struct bcache_device *d, struct bio *bio), +	TP_ARGS(d, bio),  	TP_STRUCT__entry(  		__field(dev_t,		dev			) @@ -24,12 +22,12 @@ DECLARE_EVENT_CLASS(bcache_request,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->orig_major	= s->d->disk->major; -		__entry->orig_minor	= s->d->disk->first_minor; -		__entry->sector		= bio->bi_sector; -		__entry->orig_sector	= bio->bi_sector - 16; -		__entry->nr_sector	= bio->bi_size >> 9; -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		__entry->orig_major	= d->disk->major; +		__entry->orig_minor	= d->disk->first_minor; +		__entry->sector		= bio->bi_iter.bi_sector; +		__entry->orig_sector	= bio->bi_iter.bi_sector - 16; +		__entry->nr_sector	= bio->bi_iter.bi_size >> 9; +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  	),  	TP_printk("%d,%d %s %llu + %u (from %d,%d @ %llu)", @@ -79,13 +77,13 @@ DECLARE_EVENT_CLASS(btree_node,  /* request.c */  DEFINE_EVENT(bcache_request, bcache_request_start, -	TP_PROTO(struct search *s, struct bio *bio), -	TP_ARGS(s, bio) +	TP_PROTO(struct bcache_device *d, struct bio *bio), +	TP_ARGS(d, bio)  );  DEFINE_EVENT(bcache_request, bcache_request_end, -	TP_PROTO(struct search *s, struct bio *bio), -	TP_ARGS(s, bio) +	TP_PROTO(struct bcache_device *d, struct bio *bio), +	TP_ARGS(d, bio)  );  DECLARE_EVENT_CLASS(bcache_bio, @@ -101,9 +99,9 @@ DECLARE_EVENT_CLASS(bcache_bio,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; -		__entry->nr_sector	= bio->bi_size >> 9; -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		__entry->sector		= bio->bi_iter.bi_sector; +		__entry->nr_sector	= bio->bi_iter.bi_size >> 9; +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  	),  	TP_printk("%d,%d  %s %llu + %u", @@ -136,9 +134,9 @@ TRACE_EVENT(bcache_read,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; -		__entry->nr_sector	= bio->bi_size >> 9; -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		__entry->sector		= bio->bi_iter.bi_sector; +		__entry->nr_sector	= bio->bi_iter.bi_size >> 9; +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  		__entry->cache_hit = hit;  		__entry->bypass = bypass;  	), @@ -164,9 +162,9 @@ TRACE_EVENT(bcache_write,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; -		__entry->nr_sector	= bio->bi_size >> 9; -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		__entry->sector		= bio->bi_iter.bi_sector; +		__entry->nr_sector	= bio->bi_iter.bi_size >> 9; +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  		__entry->writeback = writeback;  		__entry->bypass = bypass;  	), @@ -249,7 +247,7 @@ TRACE_EVENT(bcache_btree_write,  	TP_fast_assign(  		__entry->bucket	= PTR_BUCKET_NR(b->c, &b->key, 0);  		__entry->block	= b->written; -		__entry->keys	= b->sets[b->nsets].data->keys; +		__entry->keys	= b->keys.set[b->keys.nsets].data->keys;  	),  	TP_printk("bucket %zu", __entry->bucket) @@ -370,50 +368,97 @@ DEFINE_EVENT(btree_node, bcache_btree_set_root,  	TP_ARGS(b)  ); +TRACE_EVENT(bcache_keyscan, +	TP_PROTO(unsigned nr_found, +		 unsigned start_inode, uint64_t start_offset, +		 unsigned end_inode, uint64_t end_offset), +	TP_ARGS(nr_found, +		start_inode, start_offset, +		end_inode, end_offset), + +	TP_STRUCT__entry( +		__field(__u32,	nr_found			) +		__field(__u32,	start_inode			) +		__field(__u64,	start_offset			) +		__field(__u32,	end_inode			) +		__field(__u64,	end_offset			) +	), + +	TP_fast_assign( +		__entry->nr_found	= nr_found; +		__entry->start_inode	= start_inode; +		__entry->start_offset	= start_offset; +		__entry->end_inode	= end_inode; +		__entry->end_offset	= end_offset; +	), + +	TP_printk("found %u keys from %u:%llu to %u:%llu", __entry->nr_found, +		  __entry->start_inode, __entry->start_offset, +		  __entry->end_inode, __entry->end_offset) +); +  /* Allocator */ -TRACE_EVENT(bcache_alloc_invalidate, -	TP_PROTO(struct cache *ca), -	TP_ARGS(ca), +TRACE_EVENT(bcache_invalidate, +	TP_PROTO(struct cache *ca, size_t bucket), +	TP_ARGS(ca, bucket),  	TP_STRUCT__entry( -		__field(unsigned,	free			) -		__field(unsigned,	free_inc		) -		__field(unsigned,	free_inc_size		) -		__field(unsigned,	unused			) +		__field(unsigned,	sectors			) +		__field(dev_t,		dev			) +		__field(__u64,		offset			)  	),  	TP_fast_assign( -		__entry->free		= fifo_used(&ca->free); -		__entry->free_inc	= fifo_used(&ca->free_inc); -		__entry->free_inc_size	= ca->free_inc.size; -		__entry->unused		= fifo_used(&ca->unused); +		__entry->dev		= ca->bdev->bd_dev; +		__entry->offset		= bucket << ca->set->bucket_bits; +		__entry->sectors	= GC_SECTORS_USED(&ca->buckets[bucket]); +	), + +	TP_printk("invalidated %u sectors at %d,%d sector=%llu", +		  __entry->sectors, MAJOR(__entry->dev), +		  MINOR(__entry->dev), __entry->offset) +); + +TRACE_EVENT(bcache_alloc, +	TP_PROTO(struct cache *ca, size_t bucket), +	TP_ARGS(ca, bucket), + +	TP_STRUCT__entry( +		__field(dev_t,		dev			) +		__field(__u64,		offset			) +	), + +	TP_fast_assign( +		__entry->dev		= ca->bdev->bd_dev; +		__entry->offset		= bucket << ca->set->bucket_bits;  	), -	TP_printk("free %u free_inc %u/%u unused %u", __entry->free, -		  __entry->free_inc, __entry->free_inc_size, __entry->unused) +	TP_printk("allocated %d,%d sector=%llu", MAJOR(__entry->dev), +		  MINOR(__entry->dev), __entry->offset)  );  TRACE_EVENT(bcache_alloc_fail, -	TP_PROTO(struct cache *ca), -	TP_ARGS(ca), +	TP_PROTO(struct cache *ca, unsigned reserve), +	TP_ARGS(ca, reserve),  	TP_STRUCT__entry( +		__field(dev_t,		dev			)  		__field(unsigned,	free			)  		__field(unsigned,	free_inc		) -		__field(unsigned,	unused			)  		__field(unsigned,	blocked			)  	),  	TP_fast_assign( -		__entry->free		= fifo_used(&ca->free); +		__entry->dev		= ca->bdev->bd_dev; +		__entry->free		= fifo_used(&ca->free[reserve]);  		__entry->free_inc	= fifo_used(&ca->free_inc); -		__entry->unused		= fifo_used(&ca->unused);  		__entry->blocked	= atomic_read(&ca->set->prio_blocked);  	), -	TP_printk("free %u free_inc %u unused %u blocked %u", __entry->free, -		  __entry->free_inc, __entry->unused, __entry->blocked) +	TP_printk("alloc fail %d,%d free %u free_inc %u blocked %u", +		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->free, +		  __entry->free_inc, __entry->blocked)  );  /* Background writeback */ diff --git a/include/trace/events/block.h b/include/trace/events/block.h index 4c2301d2ef1..e8a5eca1dbe 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -132,6 +132,7 @@ DEFINE_EVENT(block_rq_with_error, block_rq_requeue,   * block_rq_complete - block IO operation completed by device driver   * @q: queue containing the block operation request   * @rq: block operations request + * @nr_bytes: number of completed bytes   *   * The block_rq_complete tracepoint event indicates that some portion   * of operation request has been completed by the device driver.  If @@ -139,11 +140,37 @@ DEFINE_EVENT(block_rq_with_error, block_rq_requeue,   * do for the request. If @rq->bio is non-NULL then there is   * additional work required to complete the request.   */ -DEFINE_EVENT(block_rq_with_error, block_rq_complete, +TRACE_EVENT(block_rq_complete, -	TP_PROTO(struct request_queue *q, struct request *rq), +	TP_PROTO(struct request_queue *q, struct request *rq, +		 unsigned int nr_bytes), -	TP_ARGS(q, rq) +	TP_ARGS(q, rq, nr_bytes), + +	TP_STRUCT__entry( +		__field(  dev_t,	dev			) +		__field(  sector_t,	sector			) +		__field(  unsigned int,	nr_sector		) +		__field(  int,		errors			) +		__array(  char,		rwbs,	RWBS_LEN	) +		__dynamic_array( char,	cmd,	blk_cmd_buf_len(rq)	) +	), + +	TP_fast_assign( +		__entry->dev	   = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; +		__entry->sector    = blk_rq_pos(rq); +		__entry->nr_sector = nr_bytes >> 9; +		__entry->errors    = rq->errors; + +		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); +		blk_dump_cmd(__get_str(cmd), rq); +	), + +	TP_printk("%d,%d %s (%s) %llu + %u [%d]", +		  MAJOR(__entry->dev), MINOR(__entry->dev), +		  __entry->rwbs, __get_str(cmd), +		  (unsigned long long)__entry->sector, +		  __entry->nr_sector, __entry->errors)  );  DECLARE_EVENT_CLASS(block_rq, @@ -243,9 +270,9 @@ TRACE_EVENT(block_bio_bounce,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev ?  					  bio->bi_bdev->bd_dev : 0; -		__entry->sector		= bio->bi_sector; +		__entry->sector		= bio->bi_iter.bi_sector;  		__entry->nr_sector	= bio_sectors(bio); -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);  	), @@ -280,10 +307,10 @@ TRACE_EVENT(block_bio_complete,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; +		__entry->sector		= bio->bi_iter.bi_sector;  		__entry->nr_sector	= bio_sectors(bio);  		__entry->error		= error; -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  	),  	TP_printk("%d,%d %s %llu + %u [%d]", @@ -308,9 +335,9 @@ DECLARE_EVENT_CLASS(block_bio_merge,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; +		__entry->sector		= bio->bi_iter.bi_sector;  		__entry->nr_sector	= bio_sectors(bio); -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);  	), @@ -375,9 +402,9 @@ TRACE_EVENT(block_bio_queue,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; +		__entry->sector		= bio->bi_iter.bi_sector;  		__entry->nr_sector	= bio_sectors(bio); -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);  	), @@ -403,7 +430,7 @@ DECLARE_EVENT_CLASS(block_get_rq,  	TP_fast_assign(  		__entry->dev		= bio ? bio->bi_bdev->bd_dev : 0; -		__entry->sector		= bio ? bio->bi_sector : 0; +		__entry->sector		= bio ? bio->bi_iter.bi_sector : 0;  		__entry->nr_sector	= bio ? bio_sectors(bio) : 0;  		blk_fill_rwbs(__entry->rwbs,  			      bio ? bio->bi_rw : 0, __entry->nr_sector); @@ -538,9 +565,9 @@ TRACE_EVENT(block_split,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; +		__entry->sector		= bio->bi_iter.bi_sector;  		__entry->new_sector	= new_sector; -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);  	), @@ -579,11 +606,11 @@ TRACE_EVENT(block_bio_remap,  	TP_fast_assign(  		__entry->dev		= bio->bi_bdev->bd_dev; -		__entry->sector		= bio->bi_sector; +		__entry->sector		= bio->bi_iter.bi_sector;  		__entry->nr_sector	= bio_sectors(bio);  		__entry->old_dev	= dev;  		__entry->old_sector	= from; -		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_size); +		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);  	),  	TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index f18b3b76e01..4ee4e30d26d 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h @@ -21,6 +21,8 @@ struct btrfs_block_group_cache;  struct btrfs_free_cluster;  struct map_lookup;  struct extent_buffer; +struct btrfs_work; +struct __btrfs_workqueue;  #define show_ref_type(type)						\  	__print_symbolic(type,						\ @@ -162,12 +164,14 @@ DEFINE_EVENT(btrfs__inode, btrfs_inode_evict,  		{ EXTENT_FLAG_LOGGING,	 	"LOGGING" 	},	\  		{ EXTENT_FLAG_FILLING,	 	"FILLING" 	}) -TRACE_EVENT(btrfs_get_extent, +TRACE_EVENT_CONDITION(btrfs_get_extent,  	TP_PROTO(struct btrfs_root *root, struct extent_map *map),  	TP_ARGS(root, map), +	TP_CONDITION(map), +  	TP_STRUCT__entry(  		__field(	u64,  root_objectid	)  		__field(	u64,  start		) @@ -206,17 +210,18 @@ TRACE_EVENT(btrfs_get_extent,  		  __entry->refs, __entry->compress_type)  ); -#define show_ordered_flags(flags)					\ -	__print_symbolic(flags,						\ -		{ BTRFS_ORDERED_IO_DONE, 	"IO_DONE" 	},	\ -		{ BTRFS_ORDERED_COMPLETE, 	"COMPLETE" 	},	\ -		{ BTRFS_ORDERED_NOCOW, 		"NOCOW" 	},	\ -		{ BTRFS_ORDERED_COMPRESSED, 	"COMPRESSED" 	},	\ -		{ BTRFS_ORDERED_PREALLOC, 	"PREALLOC" 	},	\ -		{ BTRFS_ORDERED_DIRECT, 	"DIRECT" 	},	\ -		{ BTRFS_ORDERED_IOERR, 		"IOERR" 	},	\ -		{ BTRFS_ORDERED_UPDATED_ISIZE, 	"UPDATED_ISIZE"	},	\ -		{ BTRFS_ORDERED_LOGGED_CSUM, 	"LOGGED_CSUM"	}) +#define show_ordered_flags(flags)					   \ +	__print_flags(flags, "|",					   \ +		{ (1 << BTRFS_ORDERED_IO_DONE), 	"IO_DONE" 	}, \ +		{ (1 << BTRFS_ORDERED_COMPLETE), 	"COMPLETE" 	}, \ +		{ (1 << BTRFS_ORDERED_NOCOW), 		"NOCOW" 	}, \ +		{ (1 << BTRFS_ORDERED_COMPRESSED), 	"COMPRESSED" 	}, \ +		{ (1 << BTRFS_ORDERED_PREALLOC), 	"PREALLOC" 	}, \ +		{ (1 << BTRFS_ORDERED_DIRECT),	 	"DIRECT" 	}, \ +		{ (1 << BTRFS_ORDERED_IOERR), 		"IOERR" 	}, \ +		{ (1 << BTRFS_ORDERED_UPDATED_ISIZE), 	"UPDATED_ISIZE"	}, \ +		{ (1 << BTRFS_ORDERED_LOGGED_CSUM), 	"LOGGED_CSUM"	}, \ +		{ (1 << BTRFS_ORDERED_TRUNCATED), 	"TRUNCATED"	})  DECLARE_EVENT_CLASS(btrfs__ordered_extent, @@ -979,6 +984,141 @@ TRACE_EVENT(free_extent_state,  		  (void *)__entry->ip)  ); +DECLARE_EVENT_CLASS(btrfs__work, + +	TP_PROTO(struct btrfs_work *work), + +	TP_ARGS(work), + +	TP_STRUCT__entry( +		__field(	void *,	work			) +		__field(	void *, wq			) +		__field(	void *,	func			) +		__field(	void *,	ordered_func		) +		__field(	void *,	ordered_free		) +	), + +	TP_fast_assign( +		__entry->work		= work; +		__entry->wq		= work->wq; +		__entry->func		= work->func; +		__entry->ordered_func	= work->ordered_func; +		__entry->ordered_free	= work->ordered_free; +	), + +	TP_printk("work=%p, wq=%p, func=%p, ordered_func=%p, ordered_free=%p", +		  __entry->work, __entry->wq, __entry->func, +		  __entry->ordered_func, __entry->ordered_free) +); + +/* For situiations that the work is freed */ +DECLARE_EVENT_CLASS(btrfs__work__done, + +	TP_PROTO(struct btrfs_work *work), + +	TP_ARGS(work), + +	TP_STRUCT__entry( +		__field(	void *,	work			) +	), + +	TP_fast_assign( +		__entry->work		= work; +	), + +	TP_printk("work->%p", __entry->work) +); + +DEFINE_EVENT(btrfs__work, btrfs_work_queued, + +	TP_PROTO(struct btrfs_work *work), + +	TP_ARGS(work) +); + +DEFINE_EVENT(btrfs__work, btrfs_work_sched, + +	TP_PROTO(struct btrfs_work *work), + +	TP_ARGS(work) +); + +DEFINE_EVENT(btrfs__work, btrfs_normal_work_done, + +	TP_PROTO(struct btrfs_work *work), + +	TP_ARGS(work) +); + +DEFINE_EVENT(btrfs__work__done, btrfs_all_work_done, + +	TP_PROTO(struct btrfs_work *work), + +	TP_ARGS(work) +); + +DEFINE_EVENT(btrfs__work, btrfs_ordered_sched, + +	TP_PROTO(struct btrfs_work *work), + +	TP_ARGS(work) +); + +DECLARE_EVENT_CLASS(btrfs__workqueue, + +	TP_PROTO(struct __btrfs_workqueue *wq, const char *name, int high), + +	TP_ARGS(wq, name, high), + +	TP_STRUCT__entry( +		__field(	void *,	wq			) +		__string(	name,	name			) +		__field(	int ,	high			) +	), + +	TP_fast_assign( +		__entry->wq		= wq; +		__assign_str(name, name); +		__entry->high		= high; +	), + +	TP_printk("name=%s%s, wq=%p", __get_str(name), +		  __print_flags(__entry->high, "", +				{(WQ_HIGHPRI),	"-high"}), +		  __entry->wq) +); + +DEFINE_EVENT(btrfs__workqueue, btrfs_workqueue_alloc, + +	TP_PROTO(struct __btrfs_workqueue *wq, const char *name, int high), + +	TP_ARGS(wq, name, high) +); + +DECLARE_EVENT_CLASS(btrfs__workqueue_done, + +	TP_PROTO(struct __btrfs_workqueue *wq), + +	TP_ARGS(wq), + +	TP_STRUCT__entry( +		__field(	void *,	wq			) +	), + +	TP_fast_assign( +		__entry->wq		= wq; +	), + +	TP_printk("wq=%p", __entry->wq) +); + +DEFINE_EVENT(btrfs__workqueue_done, btrfs_workqueue_destroy, + +	TP_PROTO(struct __btrfs_workqueue *wq), + +	TP_ARGS(wq) +); +  #endif /* _TRACE_BTRFS_H */  /* This part must be outside protection */ diff --git a/include/trace/events/compaction.h b/include/trace/events/compaction.h index fde1b3e94c7..c6814b917bd 100644 --- a/include/trace/events/compaction.h +++ b/include/trace/events/compaction.h @@ -5,6 +5,7 @@  #define _TRACE_COMPACTION_H  #include <linux/types.h> +#include <linux/list.h>  #include <linux/tracepoint.h>  #include <trace/events/gfpflags.h> @@ -47,10 +48,11 @@ DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_freepages,  TRACE_EVENT(mm_compaction_migratepages, -	TP_PROTO(unsigned long nr_migrated, -		unsigned long nr_failed), +	TP_PROTO(unsigned long nr_all, +		int migrate_rc, +		struct list_head *migratepages), -	TP_ARGS(nr_migrated, nr_failed), +	TP_ARGS(nr_all, migrate_rc, migratepages),  	TP_STRUCT__entry(  		__field(unsigned long, nr_migrated) @@ -58,7 +60,22 @@ TRACE_EVENT(mm_compaction_migratepages,  	),  	TP_fast_assign( -		__entry->nr_migrated = nr_migrated; +		unsigned long nr_failed = 0; +		struct list_head *page_lru; + +		/* +		 * migrate_pages() returns either a non-negative number +		 * with the number of pages that failed migration, or an +		 * error code, in which case we need to count the remaining +		 * pages manually +		 */ +		if (migrate_rc >= 0) +			nr_failed = migrate_rc; +		else +			list_for_each(page_lru, migratepages) +				nr_failed++; + +		__entry->nr_migrated = nr_all - nr_failed;  		__entry->nr_failed = nr_failed;  	), @@ -67,6 +84,48 @@ TRACE_EVENT(mm_compaction_migratepages,  		__entry->nr_failed)  ); +TRACE_EVENT(mm_compaction_begin, +	TP_PROTO(unsigned long zone_start, unsigned long migrate_start, +		unsigned long free_start, unsigned long zone_end), + +	TP_ARGS(zone_start, migrate_start, free_start, zone_end), + +	TP_STRUCT__entry( +		__field(unsigned long, zone_start) +		__field(unsigned long, migrate_start) +		__field(unsigned long, free_start) +		__field(unsigned long, zone_end) +	), + +	TP_fast_assign( +		__entry->zone_start = zone_start; +		__entry->migrate_start = migrate_start; +		__entry->free_start = free_start; +		__entry->zone_end = zone_end; +	), + +	TP_printk("zone_start=%lu migrate_start=%lu free_start=%lu zone_end=%lu", +		__entry->zone_start, +		__entry->migrate_start, +		__entry->free_start, +		__entry->zone_end) +); + +TRACE_EVENT(mm_compaction_end, +	TP_PROTO(int status), + +	TP_ARGS(status), + +	TP_STRUCT__entry( +		__field(int, status) +	), + +	TP_fast_assign( +		__entry->status = status; +	), + +	TP_printk("status=%d", __entry->status) +);  #endif /* _TRACE_COMPACTION_H */ diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 197d3125df2..d4f70a7fe87 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -36,7 +36,7 @@ struct extent_status;  #define show_map_flags(flags) __print_flags(flags, "|",			\  	{ EXT4_GET_BLOCKS_CREATE,		"CREATE" },		\ -	{ EXT4_GET_BLOCKS_UNINIT_EXT,		"UNINIT" },		\ +	{ EXT4_GET_BLOCKS_UNWRIT_EXT,		"UNWRIT" },		\  	{ EXT4_GET_BLOCKS_DELALLOC_RESERVE,	"DELALLOC" },		\  	{ EXT4_GET_BLOCKS_PRE_IO,		"PRE_IO" },		\  	{ EXT4_GET_BLOCKS_CONVERT,		"CONVERT" },		\ @@ -51,7 +51,6 @@ struct extent_status;  	{ EXT4_MAP_MAPPED,	"M" },			\  	{ EXT4_MAP_UNWRITTEN,	"U" },			\  	{ EXT4_MAP_BOUNDARY,	"B" },			\ -	{ EXT4_MAP_UNINIT,	"u" },			\  	{ EXT4_MAP_FROM_CLUSTER, "C" })  #define show_free_flags(flags) __print_flags(flags, "|",	\ @@ -68,6 +67,13 @@ struct extent_status;  	{ EXTENT_STATUS_DELAYED,	"D" },			\  	{ EXTENT_STATUS_HOLE,		"H" }) +#define show_falloc_mode(mode) __print_flags(mode, "|",		\ +	{ FALLOC_FL_KEEP_SIZE,		"KEEP_SIZE"},		\ +	{ FALLOC_FL_PUNCH_HOLE,		"PUNCH_HOLE"},		\ +	{ FALLOC_FL_NO_HIDE_STALE,	"NO_HIDE_STALE"},	\ +	{ FALLOC_FL_COLLAPSE_RANGE,	"COLLAPSE_RANGE"},	\ +	{ FALLOC_FL_ZERO_RANGE,		"ZERO_RANGE"}) +  TRACE_EVENT(ext4_free_inode,  	TP_PROTO(struct inode *inode), @@ -1328,7 +1334,7 @@ TRACE_EVENT(ext4_direct_IO_exit,  		  __entry->rw, __entry->ret)  ); -TRACE_EVENT(ext4_fallocate_enter, +DECLARE_EVENT_CLASS(ext4__fallocate_mode,  	TP_PROTO(struct inode *inode, loff_t offset, loff_t len, int mode),  	TP_ARGS(inode, offset, len, mode), @@ -1336,23 +1342,45 @@ TRACE_EVENT(ext4_fallocate_enter,  	TP_STRUCT__entry(  		__field(	dev_t,	dev			)  		__field(	ino_t,	ino			) -		__field(	loff_t,	pos			) -		__field(	loff_t,	len			) +		__field(	loff_t,	offset			) +		__field(	loff_t, len			)  		__field(	int,	mode			)  	),  	TP_fast_assign(  		__entry->dev	= inode->i_sb->s_dev;  		__entry->ino	= inode->i_ino; -		__entry->pos	= offset; +		__entry->offset	= offset;  		__entry->len	= len;  		__entry->mode	= mode;  	), -	TP_printk("dev %d,%d ino %lu pos %lld len %lld mode %d", +	TP_printk("dev %d,%d ino %lu offset %lld len %lld mode %s",  		  MAJOR(__entry->dev), MINOR(__entry->dev), -		  (unsigned long) __entry->ino, __entry->pos, -		  __entry->len, __entry->mode) +		  (unsigned long) __entry->ino, +		  __entry->offset, __entry->len, +		  show_falloc_mode(__entry->mode)) +); + +DEFINE_EVENT(ext4__fallocate_mode, ext4_fallocate_enter, + +	TP_PROTO(struct inode *inode, loff_t offset, loff_t len, int mode), + +	TP_ARGS(inode, offset, len, mode) +); + +DEFINE_EVENT(ext4__fallocate_mode, ext4_punch_hole, + +	TP_PROTO(struct inode *inode, loff_t offset, loff_t len, int mode), + +	TP_ARGS(inode, offset, len, mode) +); + +DEFINE_EVENT(ext4__fallocate_mode, ext4_zero_range, + +	TP_PROTO(struct inode *inode, loff_t offset, loff_t len, int mode), + +	TP_ARGS(inode, offset, len, mode)  );  TRACE_EVENT(ext4_fallocate_exit, @@ -1384,31 +1412,6 @@ TRACE_EVENT(ext4_fallocate_exit,  		  __entry->ret)  ); -TRACE_EVENT(ext4_punch_hole, -	TP_PROTO(struct inode *inode, loff_t offset, loff_t len), - -	TP_ARGS(inode, offset, len), - -	TP_STRUCT__entry( -		__field(	dev_t,	dev			) -		__field(	ino_t,	ino			) -		__field(	loff_t,	offset			) -		__field(	loff_t, len			) -	), - -	TP_fast_assign( -		__entry->dev	= inode->i_sb->s_dev; -		__entry->ino	= inode->i_ino; -		__entry->offset	= offset; -		__entry->len	= len; -	), - -	TP_printk("dev %d,%d ino %lu offset %lld len %lld", -		  MAJOR(__entry->dev), MINOR(__entry->dev), -		  (unsigned long) __entry->ino, -		  __entry->offset, __entry->len) -); -  TRACE_EVENT(ext4_unlink_enter,  	TP_PROTO(struct inode *parent, struct dentry *dentry), @@ -1493,7 +1496,7 @@ DEFINE_EVENT(ext4__truncate, ext4_truncate_exit,  	TP_ARGS(inode)  ); -/* 'ux' is the uninitialized extent. */ +/* 'ux' is the unwritten extent. */  TRACE_EVENT(ext4_ext_convert_to_initialized_enter,  	TP_PROTO(struct inode *inode, struct ext4_map_blocks *map,  		 struct ext4_extent *ux), @@ -1529,7 +1532,7 @@ TRACE_EVENT(ext4_ext_convert_to_initialized_enter,  );  /* - * 'ux' is the uninitialized extent. + * 'ux' is the unwritten extent.   * 'ix' is the initialized extent to which blocks are transferred.   */  TRACE_EVENT(ext4_ext_convert_to_initialized_fastpath, @@ -1807,7 +1810,7 @@ DEFINE_EVENT(ext4__trim, ext4_trim_all_free,  	TP_ARGS(sb, group, start, len)  ); -TRACE_EVENT(ext4_ext_handle_uninitialized_extents, +TRACE_EVENT(ext4_ext_handle_unwritten_extents,  	TP_PROTO(struct inode *inode, struct ext4_map_blocks *map, int flags,  		 unsigned int allocated, ext4_fsblk_t newblock), @@ -2410,6 +2413,31 @@ TRACE_EVENT(ext4_es_shrink_exit,  		  __entry->shrunk_nr, __entry->cache_cnt)  ); +TRACE_EVENT(ext4_collapse_range, +	TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + +	TP_ARGS(inode, offset, len), + +	TP_STRUCT__entry( +		__field(dev_t,	dev) +		__field(ino_t,	ino) +		__field(loff_t,	offset) +		__field(loff_t, len) +	), + +	TP_fast_assign( +		__entry->dev	= inode->i_sb->s_dev; +		__entry->ino	= inode->i_ino; +		__entry->offset	= offset; +		__entry->len	= len; +	), + +	TP_printk("dev %d,%d ino %lu offset %lld len %lld", +		  MAJOR(__entry->dev), MINOR(__entry->dev), +		  (unsigned long) __entry->ino, +		  __entry->offset, __entry->len) +); +  #endif /* _TRACE_EXT4_H */  /* This part must be outside protection */ diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 52ae54828ed..b983990b4a9 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h @@ -16,15 +16,28 @@  		{ META,		"META" },				\  		{ META_FLUSH,	"META_FLUSH" }) -#define show_bio_type(type)						\ -	__print_symbolic(type,						\ -		{ READ, 	"READ" },				\ -		{ READA, 	"READAHEAD" },				\ -		{ READ_SYNC, 	"READ_SYNC" },				\ -		{ WRITE, 	"WRITE" },				\ -		{ WRITE_SYNC, 	"WRITE_SYNC" },				\ -		{ WRITE_FLUSH,	"WRITE_FLUSH" },			\ -		{ WRITE_FUA, 	"WRITE_FUA" }) +#define F2FS_BIO_MASK(t)	(t & (READA | WRITE_FLUSH_FUA)) +#define F2FS_BIO_EXTRA_MASK(t)	(t & (REQ_META | REQ_PRIO)) + +#define show_bio_type(type)	show_bio_base(type), show_bio_extra(type) + +#define show_bio_base(type)						\ +	__print_symbolic(F2FS_BIO_MASK(type),				\ +		{ READ, 		"READ" },			\ +		{ READA, 		"READAHEAD" },			\ +		{ READ_SYNC, 		"READ_SYNC" },			\ +		{ WRITE, 		"WRITE" },			\ +		{ WRITE_SYNC, 		"WRITE_SYNC" },			\ +		{ WRITE_FLUSH,		"WRITE_FLUSH" },		\ +		{ WRITE_FUA, 		"WRITE_FUA" },			\ +		{ WRITE_FLUSH_FUA,	"WRITE_FLUSH_FUA" }) + +#define show_bio_extra(type)						\ +	__print_symbolic(F2FS_BIO_EXTRA_MASK(type),			\ +		{ REQ_META, 		"(M)" },			\ +		{ REQ_PRIO, 		"(P)" },			\ +		{ REQ_META | REQ_PRIO,	"(MP)" },			\ +		{ 0, " \b" })  #define show_data_type(type)						\  	__print_symbolic(type,						\ @@ -36,6 +49,11 @@  		{ CURSEG_COLD_NODE, 	"Cold NODE" },			\  		{ NO_CHECK_TYPE, 	"No TYPE" }) +#define show_file_type(type)						\ +	__print_symbolic(type,						\ +		{ 0,		"FILE" },				\ +		{ 1,		"DIR" }) +  #define show_gc_type(type)						\  	__print_symbolic(type,						\  		{ FG_GC,	"Foreground GC" },			\ @@ -416,7 +434,7 @@ TRACE_EVENT(f2fs_truncate_partial_nodes,  		__entry->err)  ); -TRACE_EVENT_CONDITION(f2fs_readpage, +TRACE_EVENT_CONDITION(f2fs_submit_page_bio,  	TP_PROTO(struct page *page, sector_t blkaddr, int type), @@ -441,7 +459,7 @@ TRACE_EVENT_CONDITION(f2fs_readpage,  	),  	TP_printk("dev = (%d,%d), ino = %lu, page_index = 0x%lx, " -		"blkaddr = 0x%llx, bio_type = %s", +		"blkaddr = 0x%llx, bio_type = %s%s",  		show_dev_ino(__entry),  		(unsigned long)__entry->index,  		(unsigned long long)__entry->blkaddr, @@ -593,45 +611,252 @@ TRACE_EVENT(f2fs_reserve_new_block,  		__entry->ofs_in_node)  ); -TRACE_EVENT(f2fs_do_submit_bio, +DECLARE_EVENT_CLASS(f2fs__submit_bio, -	TP_PROTO(struct super_block *sb, int btype, bool sync, struct bio *bio), +	TP_PROTO(struct super_block *sb, int rw, int type, struct bio *bio), -	TP_ARGS(sb, btype, sync, bio), +	TP_ARGS(sb, rw, type, bio),  	TP_STRUCT__entry(  		__field(dev_t,	dev) -		__field(int,	btype) -		__field(bool,	sync) +		__field(int,	rw) +		__field(int,	type)  		__field(sector_t,	sector)  		__field(unsigned int,	size)  	),  	TP_fast_assign(  		__entry->dev		= sb->s_dev; -		__entry->btype		= btype; -		__entry->sync		= sync; -		__entry->sector		= bio->bi_sector; -		__entry->size		= bio->bi_size; +		__entry->rw		= rw; +		__entry->type		= type; +		__entry->sector		= bio->bi_iter.bi_sector; +		__entry->size		= bio->bi_iter.bi_size;  	), -	TP_printk("dev = (%d,%d), type = %s, io = %s, sector = %lld, size = %u", +	TP_printk("dev = (%d,%d), %s%s, %s, sector = %lld, size = %u",  		show_dev(__entry), -		show_block_type(__entry->btype), -		__entry->sync ? "sync" : "no sync", +		show_bio_type(__entry->rw), +		show_block_type(__entry->type),  		(unsigned long long)__entry->sector,  		__entry->size)  ); -TRACE_EVENT(f2fs_submit_write_page, +DEFINE_EVENT_CONDITION(f2fs__submit_bio, f2fs_submit_write_bio, + +	TP_PROTO(struct super_block *sb, int rw, int type, struct bio *bio), + +	TP_ARGS(sb, rw, type, bio), + +	TP_CONDITION(bio) +); + +DEFINE_EVENT_CONDITION(f2fs__submit_bio, f2fs_submit_read_bio, + +	TP_PROTO(struct super_block *sb, int rw, int type, struct bio *bio), + +	TP_ARGS(sb, rw, type, bio), + +	TP_CONDITION(bio) +); + +TRACE_EVENT(f2fs_write_begin, + +	TP_PROTO(struct inode *inode, loff_t pos, unsigned int len, +				unsigned int flags), + +	TP_ARGS(inode, pos, len, flags), + +	TP_STRUCT__entry( +		__field(dev_t,	dev) +		__field(ino_t,	ino) +		__field(loff_t,	pos) +		__field(unsigned int, len) +		__field(unsigned int, flags) +	), + +	TP_fast_assign( +		__entry->dev	= inode->i_sb->s_dev; +		__entry->ino	= inode->i_ino; +		__entry->pos	= pos; +		__entry->len	= len; +		__entry->flags	= flags; +	), + +	TP_printk("dev = (%d,%d), ino = %lu, pos = %llu, len = %u, flags = %u", +		show_dev_ino(__entry), +		(unsigned long long)__entry->pos, +		__entry->len, +		__entry->flags) +); + +TRACE_EVENT(f2fs_write_end, + +	TP_PROTO(struct inode *inode, loff_t pos, unsigned int len, +				unsigned int copied), + +	TP_ARGS(inode, pos, len, copied), + +	TP_STRUCT__entry( +		__field(dev_t,	dev) +		__field(ino_t,	ino) +		__field(loff_t,	pos) +		__field(unsigned int, len) +		__field(unsigned int, copied) +	), + +	TP_fast_assign( +		__entry->dev	= inode->i_sb->s_dev; +		__entry->ino	= inode->i_ino; +		__entry->pos	= pos; +		__entry->len	= len; +		__entry->copied	= copied; +	), + +	TP_printk("dev = (%d,%d), ino = %lu, pos = %llu, len = %u, copied = %u", +		show_dev_ino(__entry), +		(unsigned long long)__entry->pos, +		__entry->len, +		__entry->copied) +); + +DECLARE_EVENT_CLASS(f2fs__page, + +	TP_PROTO(struct page *page, int type), + +	TP_ARGS(page, type), + +	TP_STRUCT__entry( +		__field(dev_t,	dev) +		__field(ino_t,	ino) +		__field(int, type) +		__field(int, dir) +		__field(pgoff_t, index) +		__field(int, dirty) +		__field(int, uptodate) +	), + +	TP_fast_assign( +		__entry->dev	= page->mapping->host->i_sb->s_dev; +		__entry->ino	= page->mapping->host->i_ino; +		__entry->type	= type; +		__entry->dir	= S_ISDIR(page->mapping->host->i_mode); +		__entry->index	= page->index; +		__entry->dirty	= PageDirty(page); +		__entry->uptodate = PageUptodate(page); +	), + +	TP_printk("dev = (%d,%d), ino = %lu, %s, %s, index = %lu, " +		"dirty = %d, uptodate = %d", +		show_dev_ino(__entry), +		show_block_type(__entry->type), +		show_file_type(__entry->dir), +		(unsigned long)__entry->index, +		__entry->dirty, +		__entry->uptodate) +); + +DEFINE_EVENT(f2fs__page, f2fs_writepage, + +	TP_PROTO(struct page *page, int type), + +	TP_ARGS(page, type) +); + +DEFINE_EVENT(f2fs__page, f2fs_readpage, + +	TP_PROTO(struct page *page, int type), + +	TP_ARGS(page, type) +); + +DEFINE_EVENT(f2fs__page, f2fs_set_page_dirty, -	TP_PROTO(struct page *page, block_t blk_addr, int type), +	TP_PROTO(struct page *page, int type), + +	TP_ARGS(page, type) +); -	TP_ARGS(page, blk_addr, type), +DEFINE_EVENT(f2fs__page, f2fs_vm_page_mkwrite, + +	TP_PROTO(struct page *page, int type), + +	TP_ARGS(page, type) +); + +TRACE_EVENT(f2fs_writepages, + +	TP_PROTO(struct inode *inode, struct writeback_control *wbc, int type), + +	TP_ARGS(inode, wbc, type),  	TP_STRUCT__entry(  		__field(dev_t,	dev)  		__field(ino_t,	ino) +		__field(int,	type) +		__field(int,	dir) +		__field(long,	nr_to_write) +		__field(long,	pages_skipped) +		__field(loff_t,	range_start) +		__field(loff_t,	range_end) +		__field(pgoff_t, writeback_index) +		__field(int,	sync_mode) +		__field(char,	for_kupdate) +		__field(char,	for_background) +		__field(char,	tagged_writepages) +		__field(char,	for_reclaim) +		__field(char,	range_cyclic) +		__field(char,	for_sync) +	), + +	TP_fast_assign( +		__entry->dev		= inode->i_sb->s_dev; +		__entry->ino		= inode->i_ino; +		__entry->type		= type; +		__entry->dir		= S_ISDIR(inode->i_mode); +		__entry->nr_to_write	= wbc->nr_to_write; +		__entry->pages_skipped	= wbc->pages_skipped; +		__entry->range_start	= wbc->range_start; +		__entry->range_end	= wbc->range_end; +		__entry->writeback_index = inode->i_mapping->writeback_index; +		__entry->sync_mode	= wbc->sync_mode; +		__entry->for_kupdate	= wbc->for_kupdate; +		__entry->for_background	= wbc->for_background; +		__entry->tagged_writepages	= wbc->tagged_writepages; +		__entry->for_reclaim	= wbc->for_reclaim; +		__entry->range_cyclic	= wbc->range_cyclic; +		__entry->for_sync	= wbc->for_sync; +	), + +	TP_printk("dev = (%d,%d), ino = %lu, %s, %s, nr_to_write %ld, " +		"skipped %ld, start %lld, end %lld, wb_idx %lu, sync_mode %d, " +		"kupdate %u background %u tagged %u reclaim %u cyclic %u sync %u", +		show_dev_ino(__entry), +		show_block_type(__entry->type), +		show_file_type(__entry->dir), +		__entry->nr_to_write, +		__entry->pages_skipped, +		__entry->range_start, +		__entry->range_end, +		(unsigned long)__entry->writeback_index, +		__entry->sync_mode, +		__entry->for_kupdate, +		__entry->for_background, +		__entry->tagged_writepages, +		__entry->for_reclaim, +		__entry->range_cyclic, +		__entry->for_sync) +); + +TRACE_EVENT(f2fs_submit_page_mbio, + +	TP_PROTO(struct page *page, int rw, int type, block_t blk_addr), + +	TP_ARGS(page, rw, type, blk_addr), + +	TP_STRUCT__entry( +		__field(dev_t,	dev) +		__field(ino_t,	ino) +		__field(int, rw)  		__field(int, type)  		__field(pgoff_t, index)  		__field(block_t, block) @@ -640,13 +865,15 @@ TRACE_EVENT(f2fs_submit_write_page,  	TP_fast_assign(  		__entry->dev	= page->mapping->host->i_sb->s_dev;  		__entry->ino	= page->mapping->host->i_ino; +		__entry->rw	= rw;  		__entry->type	= type;  		__entry->index	= page->index;  		__entry->block	= blk_addr;  	), -	TP_printk("dev = (%d,%d), ino = %lu, %s, index = %lu, blkaddr = 0x%llx", +	TP_printk("dev = (%d,%d), ino = %lu, %s%s, %s, index = %lu, blkaddr = 0x%llx",  		show_dev_ino(__entry), +		show_bio_type(__entry->rw),  		show_block_type(__entry->type),  		(unsigned long)__entry->index,  		(unsigned long long)__entry->block) @@ -676,6 +903,29 @@ TRACE_EVENT(f2fs_write_checkpoint,  		__entry->msg)  ); +TRACE_EVENT(f2fs_issue_discard, + +	TP_PROTO(struct super_block *sb, block_t blkstart, block_t blklen), + +	TP_ARGS(sb, blkstart, blklen), + +	TP_STRUCT__entry( +		__field(dev_t,	dev) +		__field(block_t, blkstart) +		__field(block_t, blklen) +	), + +	TP_fast_assign( +		__entry->dev	= sb->s_dev; +		__entry->blkstart = blkstart; +		__entry->blklen = blklen; +	), + +	TP_printk("dev = (%d,%d), blkstart = 0x%llx, blklen = 0x%llx", +		show_dev(__entry), +		(unsigned long long)__entry->blkstart, +		(unsigned long long)__entry->blklen) +);  #endif /* _TRACE_F2FS_H */   /* This part must be outside protection */ diff --git a/include/trace/events/filelock.h b/include/trace/events/filelock.h new file mode 100644 index 00000000000..59d11c22f07 --- /dev/null +++ b/include/trace/events/filelock.h @@ -0,0 +1,96 @@ +/* + * Events for filesystem locks + * + * Copyright 2013 Jeff Layton <jlayton@poochiereds.net> + */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM filelock + +#if !defined(_TRACE_FILELOCK_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_FILELOCK_H + +#include <linux/tracepoint.h> +#include <linux/fs.h> +#include <linux/device.h> +#include <linux/kdev_t.h> + +#define show_fl_flags(val)						\ +	__print_flags(val, "|", 					\ +		{ FL_POSIX,		"FL_POSIX" },			\ +		{ FL_FLOCK,		"FL_FLOCK" },			\ +		{ FL_DELEG,		"FL_DELEG" },			\ +		{ FL_ACCESS,		"FL_ACCESS" },			\ +		{ FL_EXISTS,		"FL_EXISTS" },			\ +		{ FL_LEASE,		"FL_LEASE" },			\ +		{ FL_CLOSE,		"FL_CLOSE" },			\ +		{ FL_SLEEP,		"FL_SLEEP" },			\ +		{ FL_DOWNGRADE_PENDING,	"FL_DOWNGRADE_PENDING" },	\ +		{ FL_UNLOCK_PENDING,	"FL_UNLOCK_PENDING" },		\ +		{ FL_OFDLCK,		"FL_OFDLCK" }) + +#define show_fl_type(val)				\ +	__print_symbolic(val,				\ +			{ F_RDLCK, "F_RDLCK" },		\ +			{ F_WRLCK, "F_WRLCK" },		\ +			{ F_UNLCK, "F_UNLCK" }) + +DECLARE_EVENT_CLASS(filelock_lease, + +	TP_PROTO(struct inode *inode, struct file_lock *fl), + +	TP_ARGS(inode, fl), + +	TP_STRUCT__entry( +		__field(struct file_lock *, fl) +		__field(unsigned long, i_ino) +		__field(dev_t, s_dev) +		__field(struct file_lock *, fl_next) +		__field(fl_owner_t, fl_owner) +		__field(unsigned int, fl_flags) +		__field(unsigned char, fl_type) +		__field(unsigned long, fl_break_time) +		__field(unsigned long, fl_downgrade_time) +	), + +	TP_fast_assign( +		__entry->fl = fl; +		__entry->s_dev = inode->i_sb->s_dev; +		__entry->i_ino = inode->i_ino; +		__entry->fl_next = fl->fl_next; +		__entry->fl_owner = fl->fl_owner; +		__entry->fl_flags = fl->fl_flags; +		__entry->fl_type = fl->fl_type; +		__entry->fl_break_time = fl->fl_break_time; +		__entry->fl_downgrade_time = fl->fl_downgrade_time; +	), + +	TP_printk("fl=0x%p dev=0x%x:0x%x ino=0x%lx fl_next=0x%p fl_owner=0x%p fl_flags=%s fl_type=%s fl_break_time=%lu fl_downgrade_time=%lu", +		__entry->fl, MAJOR(__entry->s_dev), MINOR(__entry->s_dev), +		__entry->i_ino, __entry->fl_next, __entry->fl_owner, +		show_fl_flags(__entry->fl_flags), +		show_fl_type(__entry->fl_type), +		__entry->fl_break_time, __entry->fl_downgrade_time) +); + +DEFINE_EVENT(filelock_lease, break_lease_noblock, TP_PROTO(struct inode *inode, struct file_lock *fl), +		TP_ARGS(inode, fl)); + +DEFINE_EVENT(filelock_lease, break_lease_block, TP_PROTO(struct inode *inode, struct file_lock *fl), +		TP_ARGS(inode, fl)); + +DEFINE_EVENT(filelock_lease, break_lease_unblock, TP_PROTO(struct inode *inode, struct file_lock *fl), +		TP_ARGS(inode, fl)); + +DEFINE_EVENT(filelock_lease, generic_add_lease, TP_PROTO(struct inode *inode, struct file_lock *fl), +		TP_ARGS(inode, fl)); + +DEFINE_EVENT(filelock_lease, generic_delete_lease, TP_PROTO(struct inode *inode, struct file_lock *fl), +		TP_ARGS(inode, fl)); + +DEFINE_EVENT(filelock_lease, time_out_leases, TP_PROTO(struct inode *inode, struct file_lock *fl), +		TP_ARGS(inode, fl)); + +#endif /* _TRACE_FILELOCK_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/gfpflags.h b/include/trace/events/gfpflags.h index 1eddbf1557f..d6fd8e5b14b 100644 --- a/include/trace/events/gfpflags.h +++ b/include/trace/events/gfpflags.h @@ -34,7 +34,6 @@  	{(unsigned long)__GFP_HARDWALL,		"GFP_HARDWALL"},	\  	{(unsigned long)__GFP_THISNODE,		"GFP_THISNODE"},	\  	{(unsigned long)__GFP_RECLAIMABLE,	"GFP_RECLAIMABLE"},	\ -	{(unsigned long)__GFP_KMEMCG,		"GFP_KMEMCG"},		\  	{(unsigned long)__GFP_MOVABLE,		"GFP_MOVABLE"},		\  	{(unsigned long)__GFP_NOTRACK,		"GFP_NOTRACK"},		\  	{(unsigned long)__GFP_NO_KSWAPD,	"GFP_NO_KSWAPD"},	\ diff --git a/include/trace/events/hswadsp.h b/include/trace/events/hswadsp.h new file mode 100644 index 00000000000..0f78bbb0200 --- /dev/null +++ b/include/trace/events/hswadsp.h @@ -0,0 +1,384 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM hswadsp + +#if !defined(_TRACE_HSWADSP_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HSWADSP_H + +#include <linux/types.h> +#include <linux/ktime.h> +#include <linux/tracepoint.h> + +struct sst_hsw; +struct sst_hsw_stream; +struct sst_hsw_ipc_stream_free_req; +struct sst_hsw_ipc_volume_req; +struct sst_hsw_ipc_stream_alloc_req; +struct sst_hsw_audio_data_format_ipc; +struct sst_hsw_ipc_stream_info_reply; +struct sst_hsw_ipc_device_config_req; + +DECLARE_EVENT_CLASS(sst_irq, + +	TP_PROTO(uint32_t status, uint32_t mask), + +	TP_ARGS(status, mask), + +	TP_STRUCT__entry( +		__field(	unsigned int,	status		) +		__field(	unsigned int,	mask		) +	), + +	TP_fast_assign( +		__entry->status = status; +		__entry->mask = mask; +	), + +	TP_printk("status 0x%8.8x mask 0x%8.8x", +		(unsigned int)__entry->status, (unsigned int)__entry->mask) +); + +DEFINE_EVENT(sst_irq, sst_irq_busy, + +	TP_PROTO(unsigned int status, unsigned int mask), + +	TP_ARGS(status, mask) + +); + +DEFINE_EVENT(sst_irq, sst_irq_done, + +	TP_PROTO(unsigned int status, unsigned int mask), + +	TP_ARGS(status, mask) + +); + +DECLARE_EVENT_CLASS(ipc, + +	TP_PROTO(const char *name, int val), + +	TP_ARGS(name, val), + +	TP_STRUCT__entry( +		__string(	name,	name		) +		__field(	unsigned int,	val	) +	), + +	TP_fast_assign( +		__assign_str(name, name); +		__entry->val = val; +	), + +	TP_printk("%s 0x%8.8x", __get_str(name), (unsigned int)__entry->val) + +); + +DEFINE_EVENT(ipc, ipc_request, + +	TP_PROTO(const char *name, int val), + +	TP_ARGS(name, val) + +); + +DEFINE_EVENT(ipc, ipc_reply, + +	TP_PROTO(const char *name, int val), + +	TP_ARGS(name, val) + +); + +DEFINE_EVENT(ipc, ipc_pending_reply, + +	TP_PROTO(const char *name, int val), + +	TP_ARGS(name, val) + +); + +DEFINE_EVENT(ipc, ipc_notification, + +	TP_PROTO(const char *name, int val), + +	TP_ARGS(name, val) + +); + +DEFINE_EVENT(ipc, ipc_error, + +	TP_PROTO(const char *name, int val), + +	TP_ARGS(name, val) + +); + +DECLARE_EVENT_CLASS(stream_position, + +	TP_PROTO(unsigned int id, unsigned int pos), + +	TP_ARGS(id, pos), + +	TP_STRUCT__entry( +		__field(	unsigned int,	id		) +		__field(	unsigned int,	pos		) +	), + +	TP_fast_assign( +		__entry->id = id; +		__entry->pos = pos; +	), + +	TP_printk("id %d position 0x%x", +		(unsigned int)__entry->id, (unsigned int)__entry->pos) +); + +DEFINE_EVENT(stream_position, stream_read_position, + +	TP_PROTO(unsigned int id, unsigned int pos), + +	TP_ARGS(id, pos) + +); + +DEFINE_EVENT(stream_position, stream_write_position, + +	TP_PROTO(unsigned int id, unsigned int pos), + +	TP_ARGS(id, pos) + +); + +TRACE_EVENT(hsw_stream_buffer, + +	TP_PROTO(struct sst_hsw_stream *stream), + +	TP_ARGS(stream), + +	TP_STRUCT__entry( +		__field(	int,	id	) +		__field(	int,	pt_addr	) +		__field(	int,	num_pages	) +		__field(	int,	ring_size	) +		__field(	int,	ring_offset	) +		__field(	int,	first_pfn	) +	), + +	TP_fast_assign( +		__entry->id = stream->host_id; +		__entry->pt_addr = stream->request.ringinfo.ring_pt_address; +		__entry->num_pages = stream->request.ringinfo.num_pages; +		__entry->ring_size = stream->request.ringinfo.ring_size; +		__entry->ring_offset = stream->request.ringinfo.ring_offset; +		__entry->first_pfn = stream->request.ringinfo.ring_first_pfn; +	), + +	TP_printk("stream %d ring addr 0x%x pages %d size 0x%x offset 0x%x PFN 0x%x", +		(int) __entry->id,  (int)__entry->pt_addr, +		(int)__entry->num_pages, (int)__entry->ring_size, +		(int)__entry->ring_offset, (int)__entry->first_pfn) +); + +TRACE_EVENT(hsw_stream_alloc_reply, + +	TP_PROTO(struct sst_hsw_stream *stream), + +	TP_ARGS(stream), + +	TP_STRUCT__entry( +		__field(	int,	id	) +		__field(	int,	stream_id	) +		__field(	int,	mixer_id	) +		__field(	int,	peak0	) +		__field(	int,	peak1	) +		__field(	int,	vol0	) +		__field(	int,	vol1	) +	), + +	TP_fast_assign( +		__entry->id = stream->host_id; +		__entry->stream_id = stream->reply.stream_hw_id; +		__entry->mixer_id = stream->reply.mixer_hw_id; +		__entry->peak0 = stream->reply.peak_meter_register_address[0]; +		__entry->peak1 = stream->reply.peak_meter_register_address[1]; +		__entry->vol0 = stream->reply.volume_register_address[0]; +		__entry->vol1 = stream->reply.volume_register_address[1]; +	), + +	TP_printk("stream %d hw id %d mixer %d peak 0x%x:0x%x vol 0x%x,0x%x", +		(int) __entry->id, (int) __entry->stream_id, (int)__entry->mixer_id, +		(int)__entry->peak0, (int)__entry->peak1, +		(int)__entry->vol0, (int)__entry->vol1) +); + +TRACE_EVENT(hsw_mixer_info_reply, + +	TP_PROTO(struct sst_hsw_ipc_stream_info_reply *reply), + +	TP_ARGS(reply), + +	TP_STRUCT__entry( +		__field(	int,	mixer_id	) +		__field(	int,	peak0	) +		__field(	int,	peak1	) +		__field(	int,	vol0	) +		__field(	int,	vol1	) +	), + +	TP_fast_assign( +		__entry->mixer_id = reply->mixer_hw_id; +		__entry->peak0 = reply->peak_meter_register_address[0]; +		__entry->peak1 = reply->peak_meter_register_address[1]; +		__entry->vol0 = reply->volume_register_address[0]; +		__entry->vol1 = reply->volume_register_address[1]; +	), + +	TP_printk("mixer id %d peak 0x%x:0x%x vol 0x%x,0x%x", +		(int)__entry->mixer_id, +		(int)__entry->peak0, (int)__entry->peak1, +		(int)__entry->vol0, (int)__entry->vol1) +); + +TRACE_EVENT(hsw_stream_data_format, + +	TP_PROTO(struct sst_hsw_stream *stream, +		struct sst_hsw_audio_data_format_ipc *req), + +	TP_ARGS(stream, req), + +	TP_STRUCT__entry( +		__field(	uint32_t,	id	) +		__field(	uint32_t,	frequency	) +		__field(	uint32_t,	bitdepth	) +		__field(	uint32_t,	map	) +		__field(	uint32_t,	config	) +		__field(	uint32_t,	style	) +		__field(	uint8_t,	ch_num	) +		__field(	uint8_t,	valid_bit	) +	), + +	TP_fast_assign( +		__entry->id = stream->host_id; +		__entry->frequency = req->frequency; +		__entry->bitdepth = req->bitdepth; +		__entry->map = req->map; +		__entry->config = req->config; +		__entry->style = req->style; +		__entry->ch_num = req->ch_num; +		__entry->valid_bit = req->valid_bit; +	), + +	TP_printk("stream %d freq %d depth %d map 0x%x config 0x%x style 0x%x ch %d bits %d", +		(int) __entry->id, (uint32_t)__entry->frequency, +		(uint32_t)__entry->bitdepth, (uint32_t)__entry->map, +		(uint32_t)__entry->config, (uint32_t)__entry->style, +		(uint8_t)__entry->ch_num, (uint8_t)__entry->valid_bit) +); + +TRACE_EVENT(hsw_stream_alloc_request, + +	TP_PROTO(struct sst_hsw_stream *stream, +		struct sst_hsw_ipc_stream_alloc_req *req), + +	TP_ARGS(stream, req), + +	TP_STRUCT__entry( +		__field(	uint32_t,	id	) +		__field(	uint8_t,	path_id	) +		__field(	uint8_t,	stream_type	) +		__field(	uint8_t,	format_id	) +	), + +	TP_fast_assign( +		__entry->id = stream->host_id; +		__entry->path_id = req->path_id; +		__entry->stream_type = req->stream_type; +		__entry->format_id = req->format_id; +	), + +	TP_printk("stream %d path %d type %d format %d", +		(int) __entry->id, (uint8_t)__entry->path_id, +		(uint8_t)__entry->stream_type, (uint8_t)__entry->format_id) +); + +TRACE_EVENT(hsw_stream_free_req, + +	TP_PROTO(struct sst_hsw_stream *stream, +		struct sst_hsw_ipc_stream_free_req *req), + +	TP_ARGS(stream, req), + +	TP_STRUCT__entry( +		__field(	int,	id	) +		__field(	int,	stream_id	) +	), + +	TP_fast_assign( +		__entry->id = stream->host_id; +		__entry->stream_id = req->stream_id; +	), + +	TP_printk("stream %d hw id %d", +		(int) __entry->id, (int) __entry->stream_id) +); + +TRACE_EVENT(hsw_volume_req, + +	TP_PROTO(struct sst_hsw_stream *stream, +		struct sst_hsw_ipc_volume_req *req), + +	TP_ARGS(stream, req), + +	TP_STRUCT__entry( +		__field(	int,	id	) +		__field(	uint32_t,	channel	) +		__field(	uint32_t,	target_volume	) +		__field(	uint64_t,	curve_duration	) +		__field(	uint32_t,	curve_type	) +	), + +	TP_fast_assign( +		__entry->id = stream->host_id; +		__entry->channel = req->channel; +		__entry->target_volume = req->target_volume; +		__entry->curve_duration = req->curve_duration; +		__entry->curve_type = req->curve_type; +	), + +	TP_printk("stream %d chan 0x%x vol %d duration %llu type %d", +		(int) __entry->id, (uint32_t) __entry->channel, +		(uint32_t)__entry->target_volume, +		(uint64_t)__entry->curve_duration, +		(uint32_t)__entry->curve_type) +); + +TRACE_EVENT(hsw_device_config_req, + +	TP_PROTO(struct sst_hsw_ipc_device_config_req *req), + +	TP_ARGS(req), + +	TP_STRUCT__entry( +		__field(	uint32_t,	ssp	) +		__field(	uint32_t,	clock_freq	) +		__field(	uint32_t,	mode	) +		__field(	uint16_t,	clock_divider	) +	), + +	TP_fast_assign( +		__entry->ssp = req->ssp_interface; +		__entry->clock_freq = req->clock_frequency; +		__entry->mode = req->mode; +		__entry->clock_divider = req->clock_divider; +	), + +	TP_printk("SSP %d Freq %d mode %d div %d", +		(uint32_t)__entry->ssp, +		(uint32_t)__entry->clock_freq, (uint32_t)__entry->mode, +		(uint32_t)__entry->clock_divider) +); + +#endif /* _TRACE_HSWADSP_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/i2c.h b/include/trace/events/i2c.h new file mode 100644 index 00000000000..fe17187df65 --- /dev/null +++ b/include/trace/events/i2c.h @@ -0,0 +1,372 @@ +/* I2C and SMBUS message transfer tracepoints + * + * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public Licence + * as published by the Free Software Foundation; either version + * 2 of the Licence, or (at your option) any later version. + */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM i2c + +#if !defined(_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_I2C_H + +#include <linux/i2c.h> +#include <linux/tracepoint.h> + +/* + * drivers/i2c/i2c-core.c + */ +extern void i2c_transfer_trace_reg(void); +extern void i2c_transfer_trace_unreg(void); + +/* + * __i2c_transfer() write request + */ +TRACE_EVENT_FN(i2c_write, +	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, +			int num), +	       TP_ARGS(adap, msg, num), +	       TP_STRUCT__entry( +		       __field(int,	adapter_nr		) +		       __field(__u16,	msg_nr			) +		       __field(__u16,	addr			) +		       __field(__u16,	flags			) +		       __field(__u16,	len			) +		       __dynamic_array(__u8, buf, msg->len)	), +	       TP_fast_assign( +		       __entry->adapter_nr = adap->nr; +		       __entry->msg_nr = num; +		       __entry->addr = msg->addr; +		       __entry->flags = msg->flags; +		       __entry->len = msg->len; +		       memcpy(__get_dynamic_array(buf), msg->buf, msg->len); +			      ), +	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]", +			 __entry->adapter_nr, +			 __entry->msg_nr, +			 __entry->addr, +			 __entry->flags, +			 __entry->len, +			 __entry->len, __get_dynamic_array(buf) +			 ), +	       i2c_transfer_trace_reg, +	       i2c_transfer_trace_unreg); + +/* + * __i2c_transfer() read request + */ +TRACE_EVENT_FN(i2c_read, +	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, +			int num), +	       TP_ARGS(adap, msg, num), +	       TP_STRUCT__entry( +		       __field(int,	adapter_nr		) +		       __field(__u16,	msg_nr			) +		       __field(__u16,	addr			) +		       __field(__u16,	flags			) +		       __field(__u16,	len			) +				), +	       TP_fast_assign( +		       __entry->adapter_nr = adap->nr; +		       __entry->msg_nr = num; +		       __entry->addr = msg->addr; +		       __entry->flags = msg->flags; +		       __entry->len = msg->len; +			      ), +	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u", +			 __entry->adapter_nr, +			 __entry->msg_nr, +			 __entry->addr, +			 __entry->flags, +			 __entry->len +			 ), +	       i2c_transfer_trace_reg, +		       i2c_transfer_trace_unreg); + +/* + * __i2c_transfer() read reply + */ +TRACE_EVENT_FN(i2c_reply, +	       TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, +			int num), +	       TP_ARGS(adap, msg, num), +	       TP_STRUCT__entry( +		       __field(int,	adapter_nr		) +		       __field(__u16,	msg_nr			) +		       __field(__u16,	addr			) +		       __field(__u16,	flags			) +		       __field(__u16,	len			) +		       __dynamic_array(__u8, buf, msg->len)	), +	       TP_fast_assign( +		       __entry->adapter_nr = adap->nr; +		       __entry->msg_nr = num; +		       __entry->addr = msg->addr; +		       __entry->flags = msg->flags; +		       __entry->len = msg->len; +		       memcpy(__get_dynamic_array(buf), msg->buf, msg->len); +			      ), +	       TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]", +			 __entry->adapter_nr, +			 __entry->msg_nr, +			 __entry->addr, +			 __entry->flags, +			 __entry->len, +			 __entry->len, __get_dynamic_array(buf) +			 ), +	       i2c_transfer_trace_reg, +	       i2c_transfer_trace_unreg); + +/* + * __i2c_transfer() result + */ +TRACE_EVENT_FN(i2c_result, +	       TP_PROTO(const struct i2c_adapter *adap, int num, int ret), +	       TP_ARGS(adap, num, ret), +	       TP_STRUCT__entry( +		       __field(int,	adapter_nr		) +		       __field(__u16,	nr_msgs			) +		       __field(__s16,	ret			) +				), +	       TP_fast_assign( +		       __entry->adapter_nr = adap->nr; +		       __entry->nr_msgs = num; +		       __entry->ret = ret; +			      ), +	       TP_printk("i2c-%d n=%u ret=%d", +			 __entry->adapter_nr, +			 __entry->nr_msgs, +			 __entry->ret +			 ), +	       i2c_transfer_trace_reg, +	       i2c_transfer_trace_unreg); + +/* + * i2c_smbus_xfer() write data or procedure call request + */ +TRACE_EVENT_CONDITION(smbus_write, +	TP_PROTO(const struct i2c_adapter *adap, +		 u16 addr, unsigned short flags, +		 char read_write, u8 command, int protocol, +		 const union i2c_smbus_data *data), +	TP_ARGS(adap, addr, flags, read_write, command, protocol, data), +	TP_CONDITION(read_write == I2C_SMBUS_WRITE || +		     protocol == I2C_SMBUS_PROC_CALL || +		     protocol == I2C_SMBUS_BLOCK_PROC_CALL), +	TP_STRUCT__entry( +		__field(int,	adapter_nr		) +		__field(__u16,	addr			) +		__field(__u16,	flags			) +		__field(__u8,	command			) +		__field(__u8,	len			) +		__field(__u32,	protocol		) +		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	), +	TP_fast_assign( +		__entry->adapter_nr = adap->nr; +		__entry->addr = addr; +		__entry->flags = flags; +		__entry->command = command; +		__entry->protocol = protocol; + +		switch (protocol) { +		case I2C_SMBUS_BYTE_DATA: +			__entry->len = 1; +			goto copy; +		case I2C_SMBUS_WORD_DATA: +		case I2C_SMBUS_PROC_CALL: +			__entry->len = 2; +			goto copy; +		case I2C_SMBUS_BLOCK_DATA: +		case I2C_SMBUS_BLOCK_PROC_CALL: +		case I2C_SMBUS_I2C_BLOCK_DATA: +			__entry->len = data->block[0] + 1; +		copy: +			memcpy(__entry->buf, data->block, __entry->len); +			break; +		case I2C_SMBUS_QUICK: +		case I2C_SMBUS_BYTE: +		case I2C_SMBUS_I2C_BLOCK_BROKEN: +		default: +			__entry->len = 0; +		} +		       ), +	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]", +		  __entry->adapter_nr, +		  __entry->addr, +		  __entry->flags, +		  __entry->command, +		  __print_symbolic(__entry->protocol, +				   { I2C_SMBUS_QUICK,		"QUICK"	}, +				   { I2C_SMBUS_BYTE,		"BYTE"	}, +				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" }, +				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" }, +				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" }, +				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" }, +				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" }, +				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" }, +				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }), +		  __entry->len, +		  __entry->len, __entry->buf +		  )); + +/* + * i2c_smbus_xfer() read data request + */ +TRACE_EVENT_CONDITION(smbus_read, +	TP_PROTO(const struct i2c_adapter *adap, +		 u16 addr, unsigned short flags, +		 char read_write, u8 command, int protocol), +	TP_ARGS(adap, addr, flags, read_write, command, protocol), +	TP_CONDITION(!(read_write == I2C_SMBUS_WRITE || +		       protocol == I2C_SMBUS_PROC_CALL || +		       protocol == I2C_SMBUS_BLOCK_PROC_CALL)), +	TP_STRUCT__entry( +		__field(int,	adapter_nr		) +		__field(__u16,	flags			) +		__field(__u16,	addr			) +		__field(__u8,	command			) +		__field(__u32,	protocol		) +		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	), +	TP_fast_assign( +		__entry->adapter_nr = adap->nr; +		__entry->addr = addr; +		__entry->flags = flags; +		__entry->command = command; +		__entry->protocol = protocol; +		       ), +	TP_printk("i2c-%d a=%03x f=%04x c=%x %s", +		  __entry->adapter_nr, +		  __entry->addr, +		  __entry->flags, +		  __entry->command, +		  __print_symbolic(__entry->protocol, +				   { I2C_SMBUS_QUICK,		"QUICK"	}, +				   { I2C_SMBUS_BYTE,		"BYTE"	}, +				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" }, +				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" }, +				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" }, +				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" }, +				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" }, +				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" }, +				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }) +		  )); + +/* + * i2c_smbus_xfer() read data or procedure call reply + */ +TRACE_EVENT_CONDITION(smbus_reply, +	TP_PROTO(const struct i2c_adapter *adap, +		 u16 addr, unsigned short flags, +		 char read_write, u8 command, int protocol, +		 const union i2c_smbus_data *data), +	TP_ARGS(adap, addr, flags, read_write, command, protocol, data), +	TP_CONDITION(read_write == I2C_SMBUS_READ), +	TP_STRUCT__entry( +		__field(int,	adapter_nr		) +		__field(__u16,	addr			) +		__field(__u16,	flags			) +		__field(__u8,	command			) +		__field(__u8,	len			) +		__field(__u32,	protocol		) +		__array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2)	), +	TP_fast_assign( +		__entry->adapter_nr = adap->nr; +		__entry->addr = addr; +		__entry->flags = flags; +		__entry->command = command; +		__entry->protocol = protocol; + +		switch (protocol) { +		case I2C_SMBUS_BYTE: +		case I2C_SMBUS_BYTE_DATA: +			__entry->len = 1; +			goto copy; +		case I2C_SMBUS_WORD_DATA: +		case I2C_SMBUS_PROC_CALL: +			__entry->len = 2; +			goto copy; +		case I2C_SMBUS_BLOCK_DATA: +		case I2C_SMBUS_BLOCK_PROC_CALL: +		case I2C_SMBUS_I2C_BLOCK_DATA: +			__entry->len = data->block[0] + 1; +		copy: +			memcpy(__entry->buf, data->block, __entry->len); +			break; +		case I2C_SMBUS_QUICK: +		case I2C_SMBUS_I2C_BLOCK_BROKEN: +		default: +			__entry->len = 0; +		} +		       ), +	TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]", +		  __entry->adapter_nr, +		  __entry->addr, +		  __entry->flags, +		  __entry->command, +		  __print_symbolic(__entry->protocol, +				   { I2C_SMBUS_QUICK,		"QUICK"	}, +				   { I2C_SMBUS_BYTE,		"BYTE"	}, +				   { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" }, +				   { I2C_SMBUS_WORD_DATA,		"WORD_DATA" }, +				   { I2C_SMBUS_PROC_CALL,		"PROC_CALL" }, +				   { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" }, +				   { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" }, +				   { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" }, +				   { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }), +		  __entry->len, +		  __entry->len, __entry->buf +		  )); + +/* + * i2c_smbus_xfer() result + */ +TRACE_EVENT(smbus_result, +	    TP_PROTO(const struct i2c_adapter *adap, +		     u16 addr, unsigned short flags, +		     char read_write, u8 command, int protocol, +		     int res), +	    TP_ARGS(adap, addr, flags, read_write, command, protocol, res), +	    TP_STRUCT__entry( +		    __field(int,	adapter_nr		) +		    __field(__u16,	addr			) +		    __field(__u16,	flags			) +		    __field(__u8,	read_write		) +		    __field(__u8,	command			) +		    __field(__s16,	res			) +		    __field(__u32,	protocol		) +			     ), +	    TP_fast_assign( +		    __entry->adapter_nr = adap->nr; +		    __entry->addr = addr; +		    __entry->flags = flags; +		    __entry->read_write = read_write; +		    __entry->command = command; +		    __entry->protocol = protocol; +		    __entry->res = res; +			   ), +	    TP_printk("i2c-%d a=%03x f=%04x c=%x %s %s res=%d", +		      __entry->adapter_nr, +		      __entry->addr, +		      __entry->flags, +		      __entry->command, +		      __print_symbolic(__entry->protocol, +				       { I2C_SMBUS_QUICK,		"QUICK"	}, +				       { I2C_SMBUS_BYTE,		"BYTE"	}, +				       { I2C_SMBUS_BYTE_DATA,		"BYTE_DATA" }, +				       { I2C_SMBUS_WORD_DATA,		"WORD_DATA" }, +				       { I2C_SMBUS_PROC_CALL,		"PROC_CALL" }, +				       { I2C_SMBUS_BLOCK_DATA,		"BLOCK_DATA" }, +				       { I2C_SMBUS_I2C_BLOCK_BROKEN,	"I2C_BLOCK_BROKEN" }, +				       { I2C_SMBUS_BLOCK_PROC_CALL,	"BLOCK_PROC_CALL" }, +				       { I2C_SMBUS_I2C_BLOCK_DATA,	"I2C_BLOCK_DATA" }), +		      __entry->read_write == I2C_SMBUS_WRITE ? "wr" : "rd", +		      __entry->res +		      )); + +#endif /* _TRACE_I2C_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/intel-sst.h b/include/trace/events/intel-sst.h new file mode 100644 index 00000000000..76c72d3f190 --- /dev/null +++ b/include/trace/events/intel-sst.h @@ -0,0 +1,148 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM intel-sst + +#if !defined(_TRACE_INTEL_SST_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_INTEL_SST_H + +#include <linux/types.h> +#include <linux/ktime.h> +#include <linux/tracepoint.h> + +DECLARE_EVENT_CLASS(sst_ipc_msg, + +	TP_PROTO(unsigned int val), + +	TP_ARGS(val), + +	TP_STRUCT__entry( +		__field(	unsigned int,	val		) +	), + +	TP_fast_assign( +		__entry->val = val; +	), + +	TP_printk("0x%8.8x", (unsigned int)__entry->val) +); + +DEFINE_EVENT(sst_ipc_msg, sst_ipc_msg_tx, + +	TP_PROTO(unsigned int val), + +	TP_ARGS(val) + +); + +DEFINE_EVENT(sst_ipc_msg, sst_ipc_msg_rx, + +	TP_PROTO(unsigned int val), + +	TP_ARGS(val) + +); + +DECLARE_EVENT_CLASS(sst_ipc_mailbox, + +	TP_PROTO(unsigned int offset, unsigned int val), + +	TP_ARGS(offset, val), + +	TP_STRUCT__entry( +		__field(	unsigned int,	offset		) +		__field(	unsigned int,	val		) +	), + +	TP_fast_assign( +		__entry->offset = offset; +		__entry->val = val; +	), + +	TP_printk(" 0x%4.4x = 0x%8.8x", +		(unsigned int)__entry->offset, (unsigned int)__entry->val) +); + +DEFINE_EVENT(sst_ipc_mailbox, sst_ipc_inbox_rdata, + +	TP_PROTO(unsigned int offset, unsigned int val), + +	TP_ARGS(offset, val) + +); + +DEFINE_EVENT(sst_ipc_mailbox, sst_ipc_inbox_wdata, + +	TP_PROTO(unsigned int offset, unsigned int val), + +	TP_ARGS(offset, val) + +); + +DEFINE_EVENT(sst_ipc_mailbox, sst_ipc_outbox_rdata, + +	TP_PROTO(unsigned int offset, unsigned int val), + +	TP_ARGS(offset, val) + +); + +DEFINE_EVENT(sst_ipc_mailbox, sst_ipc_outbox_wdata, + +	TP_PROTO(unsigned int offset, unsigned int val), + +	TP_ARGS(offset, val) + +); + +DECLARE_EVENT_CLASS(sst_ipc_mailbox_info, + +	TP_PROTO(unsigned int size), + +	TP_ARGS(size), + +	TP_STRUCT__entry( +		__field(	unsigned int,	size		) +	), + +	TP_fast_assign( +		__entry->size = size; +	), + +	TP_printk("Mailbox bytes 0x%8.8x", (unsigned int)__entry->size) +); + +DEFINE_EVENT(sst_ipc_mailbox_info, sst_ipc_inbox_read, + +	TP_PROTO(unsigned int size), + +	TP_ARGS(size) + +); + +DEFINE_EVENT(sst_ipc_mailbox_info, sst_ipc_inbox_write, + +	TP_PROTO(unsigned int size), + +	TP_ARGS(size) + +); + +DEFINE_EVENT(sst_ipc_mailbox_info, sst_ipc_outbox_read, + +	TP_PROTO(unsigned int size), + +	TP_ARGS(size) + +); + +DEFINE_EVENT(sst_ipc_mailbox_info, sst_ipc_outbox_write, + +	TP_PROTO(unsigned int size), + +	TP_ARGS(size) + +); + +#endif /* _TRACE_SST_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/iommu.h b/include/trace/events/iommu.h new file mode 100644 index 00000000000..a8f5c32d174 --- /dev/null +++ b/include/trace/events/iommu.h @@ -0,0 +1,162 @@ +/* + * iommu trace points + * + * Copyright (C) 2013 Shuah Khan <shuah.kh@samsung.com> + * + */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM iommu + +#if !defined(_TRACE_IOMMU_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_IOMMU_H + +#include <linux/tracepoint.h> +#include <linux/pci.h> + +struct device; + +DECLARE_EVENT_CLASS(iommu_group_event, + +	TP_PROTO(int group_id, struct device *dev), + +	TP_ARGS(group_id, dev), + +	TP_STRUCT__entry( +		__field(int, gid) +		__string(device, dev_name(dev)) +	), + +	TP_fast_assign( +		__entry->gid = group_id; +		__assign_str(device, dev_name(dev)); +	), + +	TP_printk("IOMMU: groupID=%d device=%s", +			__entry->gid, __get_str(device) +	) +); + +DEFINE_EVENT(iommu_group_event, add_device_to_group, + +	TP_PROTO(int group_id, struct device *dev), + +	TP_ARGS(group_id, dev) + +); + +DEFINE_EVENT(iommu_group_event, remove_device_from_group, + +	TP_PROTO(int group_id, struct device *dev), + +	TP_ARGS(group_id, dev) +); + +DECLARE_EVENT_CLASS(iommu_device_event, + +	TP_PROTO(struct device *dev), + +	TP_ARGS(dev), + +	TP_STRUCT__entry( +		__string(device, dev_name(dev)) +	), + +	TP_fast_assign( +		__assign_str(device, dev_name(dev)); +	), + +	TP_printk("IOMMU: device=%s", __get_str(device) +	) +); + +DEFINE_EVENT(iommu_device_event, attach_device_to_domain, + +	TP_PROTO(struct device *dev), + +	TP_ARGS(dev) +); + +DEFINE_EVENT(iommu_device_event, detach_device_from_domain, + +	TP_PROTO(struct device *dev), + +	TP_ARGS(dev) +); + +DECLARE_EVENT_CLASS(iommu_map_unmap, + +	TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), + +	TP_ARGS(iova, paddr, size), + +	TP_STRUCT__entry( +		__field(u64, iova) +		__field(u64, paddr) +		__field(int, size) +	), + +	TP_fast_assign( +		__entry->iova = iova; +		__entry->paddr = paddr; +		__entry->size = size; +	), + +	TP_printk("IOMMU: iova=0x%016llx paddr=0x%016llx size=0x%x", +			__entry->iova, __entry->paddr, __entry->size +	) +); + +DEFINE_EVENT(iommu_map_unmap, map, + +	TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), + +	TP_ARGS(iova, paddr, size) +); + +DEFINE_EVENT_PRINT(iommu_map_unmap, unmap, + +	TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size), + +	TP_ARGS(iova, paddr, size), + +	TP_printk("IOMMU: iova=0x%016llx size=0x%x", +			__entry->iova, __entry->size +	) +); + +DECLARE_EVENT_CLASS(iommu_error, + +	TP_PROTO(struct device *dev, unsigned long iova, int flags), + +	TP_ARGS(dev, iova, flags), + +	TP_STRUCT__entry( +		__string(device, dev_name(dev)) +		__string(driver, dev_driver_string(dev)) +		__field(u64, iova) +		__field(int, flags) +	), + +	TP_fast_assign( +		__assign_str(device, dev_name(dev)); +		__assign_str(driver, dev_driver_string(dev)); +		__entry->iova = iova; +		__entry->flags = flags; +	), + +	TP_printk("IOMMU:%s %s iova=0x%016llx flags=0x%04x", +			__get_str(driver), __get_str(device), +			__entry->iova, __entry->flags +	) +); + +DEFINE_EVENT(iommu_error, io_page_fault, + +	TP_PROTO(struct device *dev, unsigned long iova, int flags), + +	TP_ARGS(dev, iova, flags) +); +#endif /* _TRACE_IOMMU_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h index d0c61347662..aece1346ceb 100644 --- a/include/trace/events/kmem.h +++ b/include/trace/events/kmem.h @@ -267,14 +267,12 @@ DEFINE_EVENT_PRINT(mm_page, mm_page_pcpu_drain,  TRACE_EVENT(mm_page_alloc_extfrag,  	TP_PROTO(struct page *page, -			int alloc_order, int fallback_order, -			int alloc_migratetype, int fallback_migratetype, -			int change_ownership), +		int alloc_order, int fallback_order, +		int alloc_migratetype, int fallback_migratetype, int new_migratetype),  	TP_ARGS(page,  		alloc_order, fallback_order, -		alloc_migratetype, fallback_migratetype, -		change_ownership), +		alloc_migratetype, fallback_migratetype, new_migratetype),  	TP_STRUCT__entry(  		__field(	struct page *,	page			) @@ -291,7 +289,7 @@ TRACE_EVENT(mm_page_alloc_extfrag,  		__entry->fallback_order		= fallback_order;  		__entry->alloc_migratetype	= alloc_migratetype;  		__entry->fallback_migratetype	= fallback_migratetype; -		__entry->change_ownership	= change_ownership; +		__entry->change_ownership	= (new_migratetype == alloc_migratetype);  	),  	TP_printk("page=%p pfn=%lu alloc_order=%d fallback_order=%d pageblock_order=%d alloc_migratetype=%d fallback_migratetype=%d fragmenting=%d change_ownership=%d", diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 7005d1109ec..131a0bda7ae 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -296,23 +296,21 @@ DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_ready,  TRACE_EVENT(  	kvm_async_pf_completed, -	TP_PROTO(unsigned long address, struct page *page, u64 gva), -	TP_ARGS(address, page, gva), +	TP_PROTO(unsigned long address, u64 gva), +	TP_ARGS(address, gva),  	TP_STRUCT__entry(  		__field(unsigned long, address) -		__field(pfn_t, pfn)  		__field(u64, gva)  		),  	TP_fast_assign(  		__entry->address = address; -		__entry->pfn = page ? page_to_pfn(page) : 0;  		__entry->gva = gva;  		), -	TP_printk("gva %#llx address %#lx pfn %#llx",  __entry->gva, -		  __entry->address, __entry->pfn) +	TP_printk("gva %#llx address %#lx",  __entry->gva, +		  __entry->address)  );  #endif diff --git a/include/trace/events/migrate.h b/include/trace/events/migrate.h index ec2a6ccfd7e..4e4f2f8b1ac 100644 --- a/include/trace/events/migrate.h +++ b/include/trace/events/migrate.h @@ -4,6 +4,8 @@  #if !defined(_TRACE_MIGRATE_H) || defined(TRACE_HEADER_MULTI_READ)  #define _TRACE_MIGRATE_H +#include <linux/tracepoint.h> +  #define MIGRATE_MODE						\  	{MIGRATE_ASYNC,		"MIGRATE_ASYNC"},		\  	{MIGRATE_SYNC_LIGHT,	"MIGRATE_SYNC_LIGHT"},		\ @@ -45,6 +47,32 @@ TRACE_EVENT(mm_migrate_pages,  		__print_symbolic(__entry->reason, MIGRATE_REASON))  ); +TRACE_EVENT(mm_numa_migrate_ratelimit, + +	TP_PROTO(struct task_struct *p, int dst_nid, unsigned long nr_pages), + +	TP_ARGS(p, dst_nid, nr_pages), + +	TP_STRUCT__entry( +		__array(	char,		comm,	TASK_COMM_LEN) +		__field(	pid_t,		pid) +		__field(	int,		dst_nid) +		__field(	unsigned long,	nr_pages) +	), + +	TP_fast_assign( +		memcpy(__entry->comm, p->comm, TASK_COMM_LEN); +		__entry->pid		= p->pid; +		__entry->dst_nid	= dst_nid; +		__entry->nr_pages	= nr_pages; +	), + +	TP_printk("comm=%s pid=%d dst_nid=%d nr_pages=%lu", +		__entry->comm, +		__entry->pid, +		__entry->dst_nid, +		__entry->nr_pages) +);  #endif /* _TRACE_MIGRATE_H */  /* This part must be outside protection */ diff --git a/include/trace/events/module.h b/include/trace/events/module.h index 16193273741..7c5cbfe3fc4 100644 --- a/include/trace/events/module.h +++ b/include/trace/events/module.h @@ -22,8 +22,10 @@ struct module;  #define show_module_flags(flags) __print_flags(flags, "",	\  	{ (1UL << TAINT_PROPRIETARY_MODULE),	"P" },		\ +	{ (1UL << TAINT_OOT_MODULE),		"O" },		\  	{ (1UL << TAINT_FORCED_MODULE),		"F" },		\ -	{ (1UL << TAINT_CRAP),			"C" }) +	{ (1UL << TAINT_CRAP),			"C" },		\ +	{ (1UL << TAINT_UNSIGNED_MODULE),	"E" })  TRACE_EVENT(module_load, @@ -78,7 +80,7 @@ DECLARE_EVENT_CLASS(module_refcnt,  	TP_fast_assign(  		__entry->ip	= ip; -		__entry->refcnt	= __this_cpu_read(mod->refptr->incs) + __this_cpu_read(mod->refptr->decs); +		__entry->refcnt	= __this_cpu_read(mod->refptr->incs) - __this_cpu_read(mod->refptr->decs);  		__assign_str(name, mod->name);  	), diff --git a/include/trace/events/net.h b/include/trace/events/net.h index f99645d05a8..1de256b3580 100644 --- a/include/trace/events/net.h +++ b/include/trace/events/net.h @@ -6,9 +6,67 @@  #include <linux/skbuff.h>  #include <linux/netdevice.h> +#include <linux/if_vlan.h>  #include <linux/ip.h>  #include <linux/tracepoint.h> +TRACE_EVENT(net_dev_start_xmit, + +	TP_PROTO(const struct sk_buff *skb, const struct net_device *dev), + +	TP_ARGS(skb, dev), + +	TP_STRUCT__entry( +		__string(	name,			dev->name	) +		__field(	u16,			queue_mapping	) +		__field(	const void *,		skbaddr		) +		__field(	bool,			vlan_tagged	) +		__field(	u16,			vlan_proto	) +		__field(	u16,			vlan_tci	) +		__field(	u16,			protocol	) +		__field(	u8,			ip_summed	) +		__field(	unsigned int,		len		) +		__field(	unsigned int,		data_len	) +		__field(	int,			network_offset	) +		__field(	bool,			transport_offset_valid) +		__field(	int,			transport_offset) +		__field(	u8,			tx_flags	) +		__field(	u16,			gso_size	) +		__field(	u16,			gso_segs	) +		__field(	u16,			gso_type	) +	), + +	TP_fast_assign( +		__assign_str(name, dev->name); +		__entry->queue_mapping = skb->queue_mapping; +		__entry->skbaddr = skb; +		__entry->vlan_tagged = vlan_tx_tag_present(skb); +		__entry->vlan_proto = ntohs(skb->vlan_proto); +		__entry->vlan_tci = vlan_tx_tag_get(skb); +		__entry->protocol = ntohs(skb->protocol); +		__entry->ip_summed = skb->ip_summed; +		__entry->len = skb->len; +		__entry->data_len = skb->data_len; +		__entry->network_offset = skb_network_offset(skb); +		__entry->transport_offset_valid = +			skb_transport_header_was_set(skb); +		__entry->transport_offset = skb_transport_offset(skb); +		__entry->tx_flags = skb_shinfo(skb)->tx_flags; +		__entry->gso_size = skb_shinfo(skb)->gso_size; +		__entry->gso_segs = skb_shinfo(skb)->gso_segs; +		__entry->gso_type = skb_shinfo(skb)->gso_type; +	), + +	TP_printk("dev=%s queue_mapping=%u skbaddr=%p vlan_tagged=%d vlan_proto=0x%04x vlan_tci=0x%04x protocol=0x%04x ip_summed=%d len=%u data_len=%u network_offset=%d transport_offset_valid=%d transport_offset=%d tx_flags=%d gso_size=%d gso_segs=%d gso_type=%#x", +		  __get_str(name), __entry->queue_mapping, __entry->skbaddr, +		  __entry->vlan_tagged, __entry->vlan_proto, __entry->vlan_tci, +		  __entry->protocol, __entry->ip_summed, __entry->len, +		  __entry->data_len, +		  __entry->network_offset, __entry->transport_offset_valid, +		  __entry->transport_offset, __entry->tx_flags, +		  __entry->gso_size, __entry->gso_segs, __entry->gso_type) +); +  TRACE_EVENT(net_dev_xmit,  	TP_PROTO(struct sk_buff *skb, @@ -78,6 +136,106 @@ DEFINE_EVENT(net_dev_template, netif_rx,  	TP_ARGS(skb)  ); + +DECLARE_EVENT_CLASS(net_dev_rx_verbose_template, + +	TP_PROTO(const struct sk_buff *skb), + +	TP_ARGS(skb), + +	TP_STRUCT__entry( +		__string(	name,			skb->dev->name	) +		__field(	unsigned int,		napi_id		) +		__field(	u16,			queue_mapping	) +		__field(	const void *,		skbaddr		) +		__field(	bool,			vlan_tagged	) +		__field(	u16,			vlan_proto	) +		__field(	u16,			vlan_tci	) +		__field(	u16,			protocol	) +		__field(	u8,			ip_summed	) +		__field(	u32,			hash		) +		__field(	bool,			l4_hash		) +		__field(	unsigned int,		len		) +		__field(	unsigned int,		data_len	) +		__field(	unsigned int,		truesize	) +		__field(	bool,			mac_header_valid) +		__field(	int,			mac_header	) +		__field(	unsigned char,		nr_frags	) +		__field(	u16,			gso_size	) +		__field(	u16,			gso_type	) +	), + +	TP_fast_assign( +		__assign_str(name, skb->dev->name); +#ifdef CONFIG_NET_RX_BUSY_POLL +		__entry->napi_id = skb->napi_id; +#else +		__entry->napi_id = 0; +#endif +		__entry->queue_mapping = skb->queue_mapping; +		__entry->skbaddr = skb; +		__entry->vlan_tagged = vlan_tx_tag_present(skb); +		__entry->vlan_proto = ntohs(skb->vlan_proto); +		__entry->vlan_tci = vlan_tx_tag_get(skb); +		__entry->protocol = ntohs(skb->protocol); +		__entry->ip_summed = skb->ip_summed; +		__entry->hash = skb->hash; +		__entry->l4_hash = skb->l4_hash; +		__entry->len = skb->len; +		__entry->data_len = skb->data_len; +		__entry->truesize = skb->truesize; +		__entry->mac_header_valid = skb_mac_header_was_set(skb); +		__entry->mac_header = skb_mac_header(skb) - skb->data; +		__entry->nr_frags = skb_shinfo(skb)->nr_frags; +		__entry->gso_size = skb_shinfo(skb)->gso_size; +		__entry->gso_type = skb_shinfo(skb)->gso_type; +	), + +	TP_printk("dev=%s napi_id=%#x queue_mapping=%u skbaddr=%p vlan_tagged=%d vlan_proto=0x%04x vlan_tci=0x%04x protocol=0x%04x ip_summed=%d hash=0x%08x l4_hash=%d len=%u data_len=%u truesize=%u mac_header_valid=%d mac_header=%d nr_frags=%d gso_size=%d gso_type=%#x", +		  __get_str(name), __entry->napi_id, __entry->queue_mapping, +		  __entry->skbaddr, __entry->vlan_tagged, __entry->vlan_proto, +		  __entry->vlan_tci, __entry->protocol, __entry->ip_summed, +		  __entry->hash, __entry->l4_hash, __entry->len, +		  __entry->data_len, __entry->truesize, +		  __entry->mac_header_valid, __entry->mac_header, +		  __entry->nr_frags, __entry->gso_size, __entry->gso_type) +); + +DEFINE_EVENT(net_dev_rx_verbose_template, napi_gro_frags_entry, + +	TP_PROTO(const struct sk_buff *skb), + +	TP_ARGS(skb) +); + +DEFINE_EVENT(net_dev_rx_verbose_template, napi_gro_receive_entry, + +	TP_PROTO(const struct sk_buff *skb), + +	TP_ARGS(skb) +); + +DEFINE_EVENT(net_dev_rx_verbose_template, netif_receive_skb_entry, + +	TP_PROTO(const struct sk_buff *skb), + +	TP_ARGS(skb) +); + +DEFINE_EVENT(net_dev_rx_verbose_template, netif_rx_entry, + +	TP_PROTO(const struct sk_buff *skb), + +	TP_ARGS(skb) +); + +DEFINE_EVENT(net_dev_rx_verbose_template, netif_rx_ni_entry, + +	TP_PROTO(const struct sk_buff *skb), + +	TP_ARGS(skb) +); +  #endif /* _TRACE_NET_H */  /* This part must be outside protection */ diff --git a/include/trace/events/power.h b/include/trace/events/power.h index cda100d6762..d19840b0cac 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h @@ -7,6 +7,9 @@  #include <linux/ktime.h>  #include <linux/pm_qos.h>  #include <linux/tracepoint.h> +#include <linux/ftrace_event.h> + +#define TPS(x)  tracepoint_string(x)  DECLARE_EVENT_CLASS(cpu, @@ -35,6 +38,54 @@ DEFINE_EVENT(cpu, cpu_idle,  	TP_ARGS(state, cpu_id)  ); +TRACE_EVENT(pstate_sample, + +	TP_PROTO(u32 core_busy, +		u32 scaled_busy, +		u32 state, +		u64 mperf, +		u64 aperf, +		u32 freq +		), + +	TP_ARGS(core_busy, +		scaled_busy, +		state, +		mperf, +		aperf, +		freq +		), + +	TP_STRUCT__entry( +		__field(u32, core_busy) +		__field(u32, scaled_busy) +		__field(u32, state) +		__field(u64, mperf) +		__field(u64, aperf) +		__field(u32, freq) + +	), + +	TP_fast_assign( +		__entry->core_busy = core_busy; +		__entry->scaled_busy = scaled_busy; +		__entry->state = state; +		__entry->mperf = mperf; +		__entry->aperf = aperf; +		__entry->freq = freq; +		), + +	TP_printk("core_busy=%lu scaled=%lu state=%lu mperf=%llu aperf=%llu freq=%lu ", +		(unsigned long)__entry->core_busy, +		(unsigned long)__entry->scaled_busy, +		(unsigned long)__entry->state, +		(unsigned long long)__entry->mperf, +		(unsigned long long)__entry->aperf, +		(unsigned long)__entry->freq +		) + +); +  /* This file can get included multiple times, TRACE_HEADER_MULTI_READ at top */  #ifndef _PWR_EVENT_AVOID_DOUBLE_DEFINING  #define _PWR_EVENT_AVOID_DOUBLE_DEFINING @@ -42,6 +93,17 @@ DEFINE_EVENT(cpu, cpu_idle,  #define PWR_EVENT_EXIT -1  #endif +#define pm_verb_symbolic(event) \ +	__print_symbolic(event, \ +		{ PM_EVENT_SUSPEND, "suspend" }, \ +		{ PM_EVENT_RESUME, "resume" }, \ +		{ PM_EVENT_FREEZE, "freeze" }, \ +		{ PM_EVENT_QUIESCE, "quiesce" }, \ +		{ PM_EVENT_HIBERNATE, "hibernate" }, \ +		{ PM_EVENT_THAW, "thaw" }, \ +		{ PM_EVENT_RESTORE, "restore" }, \ +		{ PM_EVENT_RECOVER, "recover" }) +  DEFINE_EVENT(cpu, cpu_frequency,  	TP_PROTO(unsigned int frequency, unsigned int cpu_id), @@ -49,58 +111,76 @@ DEFINE_EVENT(cpu, cpu_frequency,  	TP_ARGS(frequency, cpu_id)  ); -TRACE_EVENT(machine_suspend, +TRACE_EVENT(device_pm_callback_start, -	TP_PROTO(unsigned int state), +	TP_PROTO(struct device *dev, const char *pm_ops, int event), -	TP_ARGS(state), +	TP_ARGS(dev, pm_ops, event),  	TP_STRUCT__entry( -		__field(	u32,		state		) +		__string(device, dev_name(dev)) +		__string(driver, dev_driver_string(dev)) +		__string(parent, dev->parent ? dev_name(dev->parent) : "none") +		__string(pm_ops, pm_ops ? pm_ops : "none ") +		__field(int, event)  	),  	TP_fast_assign( -		__entry->state = state; +		__assign_str(device, dev_name(dev)); +		__assign_str(driver, dev_driver_string(dev)); +		__assign_str(parent, +			dev->parent ? dev_name(dev->parent) : "none"); +		__assign_str(pm_ops, pm_ops ? pm_ops : "none "); +		__entry->event = event;  	), -	TP_printk("state=%lu", (unsigned long)__entry->state) +	TP_printk("%s %s, parent: %s, %s[%s]", __get_str(driver), +		__get_str(device), __get_str(parent), __get_str(pm_ops), +		pm_verb_symbolic(__entry->event))  ); -TRACE_EVENT(device_pm_report_time, +TRACE_EVENT(device_pm_callback_end, -	TP_PROTO(struct device *dev, const char *pm_ops, s64 ops_time, -		 char *pm_event_str, int error), +	TP_PROTO(struct device *dev, int error), -	TP_ARGS(dev, pm_ops, ops_time, pm_event_str, error), +	TP_ARGS(dev, error),  	TP_STRUCT__entry(  		__string(device, dev_name(dev))  		__string(driver, dev_driver_string(dev)) -		__string(parent, dev->parent ? dev_name(dev->parent) : "none") -		__string(pm_ops, pm_ops ? pm_ops : "none ") -		__string(pm_event_str, pm_event_str) -		__field(s64, ops_time)  		__field(int, error)  	),  	TP_fast_assign( -		const char *tmp = dev->parent ? dev_name(dev->parent) : "none"; -		const char *tmp_i = pm_ops ? pm_ops : "none "; -  		__assign_str(device, dev_name(dev));  		__assign_str(driver, dev_driver_string(dev)); -		__assign_str(parent, tmp); -		__assign_str(pm_ops, tmp_i); -		__assign_str(pm_event_str, pm_event_str); -		__entry->ops_time = ops_time;  		__entry->error = error;  	), -	/* ops_str has an extra space at the end */ -	TP_printk("%s %s parent=%s state=%s ops=%snsecs=%lld err=%d", -		__get_str(driver), __get_str(device), __get_str(parent), -		__get_str(pm_event_str), __get_str(pm_ops), -		__entry->ops_time, __entry->error) +	TP_printk("%s %s, err=%d", +		__get_str(driver), __get_str(device), __entry->error) +); + +TRACE_EVENT(suspend_resume, + +	TP_PROTO(const char *action, int val, bool start), + +	TP_ARGS(action, val, start), + +	TP_STRUCT__entry( +		__field(const char *, action) +		__field(int, val) +		__field(bool, start) +	), + +	TP_fast_assign( +		__entry->action = action; +		__entry->val = val; +		__entry->start = start; +	), + +	TP_printk("%s[%u] %s", __entry->action, (unsigned int)__entry->val, +		(__entry->start)?"begin":"end")  );  DECLARE_EVENT_CLASS(wakeup_source, @@ -359,8 +439,8 @@ DECLARE_EVENT_CLASS(dev_pm_qos_request,  	TP_printk("device=%s type=%s new_value=%d",  		  __get_str(name),  		  __print_symbolic(__entry->type, -			{ DEV_PM_QOS_LATENCY,	"DEV_PM_QOS_LATENCY" }, -			{ DEV_PM_QOS_FLAGS,	"DEV_PM_QOS_FLAGS" }), +			{ DEV_PM_QOS_RESUME_LATENCY, "DEV_PM_QOS_RESUME_LATENCY" }, +			{ DEV_PM_QOS_FLAGS, "DEV_PM_QOS_FLAGS" }),  		  __entry->new_value)  ); diff --git a/include/trace/events/power_cpu_migrate.h b/include/trace/events/power_cpu_migrate.h new file mode 100644 index 00000000000..f76dd4de625 --- /dev/null +++ b/include/trace/events/power_cpu_migrate.h @@ -0,0 +1,67 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM power + +#if !defined(_TRACE_POWER_CPU_MIGRATE_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_POWER_CPU_MIGRATE_H + +#include <linux/tracepoint.h> + +#define __cpu_migrate_proto			\ +	TP_PROTO(u64 timestamp,			\ +		 u32 cpu_hwid) +#define __cpu_migrate_args			\ +	TP_ARGS(timestamp,			\ +		cpu_hwid) + +DECLARE_EVENT_CLASS(cpu_migrate, + +	__cpu_migrate_proto, +	__cpu_migrate_args, + +	TP_STRUCT__entry( +		__field(u64,	timestamp		) +		__field(u32,	cpu_hwid		) +	), + +	TP_fast_assign( +		__entry->timestamp = timestamp; +		__entry->cpu_hwid = cpu_hwid; +	), + +	TP_printk("timestamp=%llu cpu_hwid=0x%08lX", +		(unsigned long long)__entry->timestamp, +		(unsigned long)__entry->cpu_hwid +	) +); + +#define __define_cpu_migrate_event(name)		\ +	DEFINE_EVENT(cpu_migrate, cpu_migrate_##name,	\ +		__cpu_migrate_proto,			\ +		__cpu_migrate_args			\ +	) + +__define_cpu_migrate_event(begin); +__define_cpu_migrate_event(finish); +__define_cpu_migrate_event(current); + +#undef __define_cpu_migrate +#undef __cpu_migrate_proto +#undef __cpu_migrate_args + +/* This file can get included multiple times, TRACE_HEADER_MULTI_READ at top */ +#ifndef _PWR_CPU_MIGRATE_EVENT_AVOID_DOUBLE_DEFINING +#define _PWR_CPU_MIGRATE_EVENT_AVOID_DOUBLE_DEFINING + +/* + * Set from_phys_cpu and to_phys_cpu to CPU_MIGRATE_ALL_CPUS to indicate + * a whole-cluster migration: + */ +#define CPU_MIGRATE_ALL_CPUS 0x80000000U +#endif + +#endif /* _TRACE_POWER_CPU_MIGRATE_H */ + +/* This part must be outside protection */ +#undef TRACE_INCLUDE_FILE +#define TRACE_INCLUDE_FILE power_cpu_migrate +#include <trace/define_trace.h> diff --git a/include/trace/events/random.h b/include/trace/events/random.h index 422df19de73..805af6db41c 100644 --- a/include/trace/events/random.h +++ b/include/trace/events/random.h @@ -7,6 +7,25 @@  #include <linux/writeback.h>  #include <linux/tracepoint.h> +TRACE_EVENT(add_device_randomness, +	TP_PROTO(int bytes, unsigned long IP), + +	TP_ARGS(bytes, IP), + +	TP_STRUCT__entry( +		__field(	  int,	bytes			) +		__field(unsigned long,	IP			) +	), + +	TP_fast_assign( +		__entry->bytes		= bytes; +		__entry->IP		= IP; +	), + +	TP_printk("bytes %d caller %pF", +		__entry->bytes, (void *)__entry->IP) +); +  DECLARE_EVENT_CLASS(random__mix_pool_bytes,  	TP_PROTO(const char *pool_name, int bytes, unsigned long IP), @@ -68,7 +87,112 @@ TRACE_EVENT(credit_entropy_bits,  		  (void *)__entry->IP)  ); -TRACE_EVENT(get_random_bytes, +TRACE_EVENT(push_to_pool, +	TP_PROTO(const char *pool_name, int pool_bits, int input_bits), + +	TP_ARGS(pool_name, pool_bits, input_bits), + +	TP_STRUCT__entry( +		__field( const char *,	pool_name		) +		__field(	  int,	pool_bits		) +		__field(	  int,	input_bits		) +	), + +	TP_fast_assign( +		__entry->pool_name	= pool_name; +		__entry->pool_bits	= pool_bits; +		__entry->input_bits	= input_bits; +	), + +	TP_printk("%s: pool_bits %d input_pool_bits %d", +		  __entry->pool_name, __entry->pool_bits, +		  __entry->input_bits) +); + +TRACE_EVENT(debit_entropy, +	TP_PROTO(const char *pool_name, int debit_bits), + +	TP_ARGS(pool_name, debit_bits), + +	TP_STRUCT__entry( +		__field( const char *,	pool_name		) +		__field(	  int,	debit_bits		) +	), + +	TP_fast_assign( +		__entry->pool_name	= pool_name; +		__entry->debit_bits	= debit_bits; +	), + +	TP_printk("%s: debit_bits %d", __entry->pool_name, +		  __entry->debit_bits) +); + +TRACE_EVENT(add_input_randomness, +	TP_PROTO(int input_bits), + +	TP_ARGS(input_bits), + +	TP_STRUCT__entry( +		__field(	  int,	input_bits		) +	), + +	TP_fast_assign( +		__entry->input_bits	= input_bits; +	), + +	TP_printk("input_pool_bits %d", __entry->input_bits) +); + +TRACE_EVENT(add_disk_randomness, +	TP_PROTO(dev_t dev, int input_bits), + +	TP_ARGS(dev, input_bits), + +	TP_STRUCT__entry( +		__field(	dev_t,	dev			) +		__field(	  int,	input_bits		) +	), + +	TP_fast_assign( +		__entry->dev		= dev; +		__entry->input_bits	= input_bits; +	), + +	TP_printk("dev %d,%d input_pool_bits %d", MAJOR(__entry->dev), +		  MINOR(__entry->dev), __entry->input_bits) +); + +TRACE_EVENT(xfer_secondary_pool, +	TP_PROTO(const char *pool_name, int xfer_bits, int request_bits, +		 int pool_entropy, int input_entropy), + +	TP_ARGS(pool_name, xfer_bits, request_bits, pool_entropy, +		input_entropy), + +	TP_STRUCT__entry( +		__field( const char *,	pool_name		) +		__field(	  int,	xfer_bits		) +		__field(	  int,	request_bits		) +		__field(	  int,	pool_entropy		) +		__field(	  int,	input_entropy		) +	), + +	TP_fast_assign( +		__entry->pool_name	= pool_name; +		__entry->xfer_bits	= xfer_bits; +		__entry->request_bits	= request_bits; +		__entry->pool_entropy	= pool_entropy; +		__entry->input_entropy	= input_entropy; +	), + +	TP_printk("pool %s xfer_bits %d request_bits %d pool_entropy %d " +		  "input_entropy %d", __entry->pool_name, __entry->xfer_bits, +		  __entry->request_bits, __entry->pool_entropy, +		  __entry->input_entropy) +); + +DECLARE_EVENT_CLASS(random__get_random_bytes,  	TP_PROTO(int nbytes, unsigned long IP),  	TP_ARGS(nbytes, IP), @@ -86,6 +210,18 @@ TRACE_EVENT(get_random_bytes,  	TP_printk("nbytes %d caller %pF", __entry->nbytes, (void *)__entry->IP)  ); +DEFINE_EVENT(random__get_random_bytes, get_random_bytes, +	TP_PROTO(int nbytes, unsigned long IP), + +	TP_ARGS(nbytes, IP) +); + +DEFINE_EVENT(random__get_random_bytes, get_random_bytes_arch, +	TP_PROTO(int nbytes, unsigned long IP), + +	TP_ARGS(nbytes, IP) +); +  DECLARE_EVENT_CLASS(random__extract_entropy,  	TP_PROTO(const char *pool_name, int nbytes, int entropy_count,  		 unsigned long IP), @@ -126,7 +262,52 @@ DEFINE_EVENT(random__extract_entropy, extract_entropy_user,  	TP_ARGS(pool_name, nbytes, entropy_count, IP)  ); +TRACE_EVENT(random_read, +	TP_PROTO(int got_bits, int need_bits, int pool_left, int input_left), + +	TP_ARGS(got_bits, need_bits, pool_left, input_left), + +	TP_STRUCT__entry( +		__field(	  int,	got_bits		) +		__field(	  int,	need_bits		) +		__field(	  int,	pool_left		) +		__field(	  int,	input_left		) +	), + +	TP_fast_assign( +		__entry->got_bits	= got_bits; +		__entry->need_bits	= need_bits; +		__entry->pool_left	= pool_left; +		__entry->input_left	= input_left; +	), + +	TP_printk("got_bits %d still_needed_bits %d " +		  "blocking_pool_entropy_left %d input_entropy_left %d", +		  __entry->got_bits, __entry->got_bits, __entry->pool_left, +		  __entry->input_left) +); + +TRACE_EVENT(urandom_read, +	TP_PROTO(int got_bits, int pool_left, int input_left), + +	TP_ARGS(got_bits, pool_left, input_left), + +	TP_STRUCT__entry( +		__field(	  int,	got_bits		) +		__field(	  int,	pool_left		) +		__field(	  int,	input_left		) +	), + +	TP_fast_assign( +		__entry->got_bits	= got_bits; +		__entry->pool_left	= pool_left; +		__entry->input_left	= input_left; +	), +	TP_printk("got_bits %d nonblocking_pool_entropy_left %d " +		  "input_entropy_left %d", __entry->got_bits, +		  __entry->pool_left, __entry->input_left) +);  #endif /* _TRACE_RANDOM_H */ diff --git a/include/trace/events/ras.h b/include/trace/events/ras.h index 88b87838379..1c875ad1ee5 100644 --- a/include/trace/events/ras.h +++ b/include/trace/events/ras.h @@ -5,7 +5,7 @@  #define _TRACE_AER_H  #include <linux/tracepoint.h> -#include <linux/edac.h> +#include <linux/aer.h>  /* @@ -63,10 +63,10 @@ TRACE_EVENT(aer_event,  	TP_printk("%s PCIe Bus Error: severity=%s, %s\n",  		__get_str(dev_name), -		__entry->severity == HW_EVENT_ERR_CORRECTED ? "Corrected" : -			__entry->severity == HW_EVENT_ERR_FATAL ? -			"Fatal" : "Uncorrected", -		__entry->severity == HW_EVENT_ERR_CORRECTED ? +		__entry->severity == AER_CORRECTABLE ? "Corrected" : +			__entry->severity == AER_FATAL ? +			"Fatal" : "Uncorrected, non-fatal", +		__entry->severity == AER_CORRECTABLE ?  		__print_flags(__entry->status, "|", aer_correctable_errors) :  		__print_flags(__entry->status, "|", aer_uncorrectable_errors))  ); diff --git a/include/trace/events/rcu.h b/include/trace/events/rcu.h index ee2376cfaab..aca38226641 100644 --- a/include/trace/events/rcu.h +++ b/include/trace/events/rcu.h @@ -39,15 +39,26 @@ TRACE_EVENT(rcu_utilization,  #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)  /* - * Tracepoint for grace-period events: starting and ending a grace - * period ("start" and "end", respectively), a CPU noting the start - * of a new grace period or the end of an old grace period ("cpustart" - * and "cpuend", respectively), a CPU passing through a quiescent - * state ("cpuqs"), a CPU coming online or going offline ("cpuonl" - * and "cpuofl", respectively), a CPU being kicked for being too - * long in dyntick-idle mode ("kick"), a CPU accelerating its new - * callbacks to RCU_NEXT_READY_TAIL ("AccReadyCB"), and a CPU - * accelerating its new callbacks to RCU_WAIT_TAIL ("AccWaitCB"). + * Tracepoint for grace-period events.  Takes a string identifying the + * RCU flavor, the grace-period number, and a string identifying the + * grace-period-related event as follows: + * + *	"AccReadyCB": CPU acclerates new callbacks to RCU_NEXT_READY_TAIL. + *	"AccWaitCB": CPU accelerates new callbacks to RCU_WAIT_TAIL. + *	"newreq": Request a new grace period. + *	"start": Start a grace period. + *	"cpustart": CPU first notices a grace-period start. + *	"cpuqs": CPU passes through a quiescent state. + *	"cpuonl": CPU comes online. + *	"cpuofl": CPU goes offline. + *	"reqwait": GP kthread sleeps waiting for grace-period request. + *	"reqwaitsig": GP kthread awakened by signal from reqwait state. + *	"fqswait": GP kthread waiting until time to force quiescent states. + *	"fqsstart": GP kthread starts forcing quiescent states. + *	"fqsend": GP kthread done forcing quiescent states. + *	"fqswaitsig": GP kthread awakened by signal from fqswait state. + *	"end": End a grace period. + *	"cpuend": CPU first notices a grace-period end.   */  TRACE_EVENT(rcu_grace_period, @@ -161,6 +172,46 @@ TRACE_EVENT(rcu_grace_period_init,  );  /* + * Tracepoint for RCU no-CBs CPU callback handoffs.  This event is intended + * to assist debugging of these handoffs. + * + * The first argument is the name of the RCU flavor, and the second is + * the number of the offloaded CPU are extracted.  The third and final + * argument is a string as follows: + * + *	"WakeEmpty": Wake rcuo kthread, first CB to empty list. + *	"WakeOvf": Wake rcuo kthread, CB list is huge. + *	"WakeNot": Don't wake rcuo kthread. + *	"WakeNotPoll": Don't wake rcuo kthread because it is polling. + *	"Poll": Start of new polling cycle for rcu_nocb_poll. + *	"Sleep": Sleep waiting for CBs for !rcu_nocb_poll. + *	"WokeEmpty": rcuo kthread woke to find empty list. + *	"WokeNonEmpty": rcuo kthread woke to find non-empty list. + *	"WaitQueue": Enqueue partially done, timed wait for it to complete. + *	"WokeQueue": Partial enqueue now complete. + */ +TRACE_EVENT(rcu_nocb_wake, + +	TP_PROTO(const char *rcuname, int cpu, const char *reason), + +	TP_ARGS(rcuname, cpu, reason), + +	TP_STRUCT__entry( +		__field(const char *, rcuname) +		__field(int, cpu) +		__field(const char *, reason) +	), + +	TP_fast_assign( +		__entry->rcuname = rcuname; +		__entry->cpu = cpu; +		__entry->reason = reason; +	), + +	TP_printk("%s %d %s", __entry->rcuname, __entry->cpu, __entry->reason) +); + +/*   * Tracepoint for tasks blocking within preemptible-RCU read-side   * critical sections.  Track the type of RCU (which one day might   * include SRCU), the grace-period number that the task is blocking @@ -540,17 +591,17 @@ TRACE_EVENT(rcu_invoke_kfree_callback,  TRACE_EVENT(rcu_batch_end,  	TP_PROTO(const char *rcuname, int callbacks_invoked, -		 bool cb, bool nr, bool iit, bool risk), +		 char cb, char nr, char iit, char risk),  	TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk),  	TP_STRUCT__entry(  		__field(const char *, rcuname)  		__field(int, callbacks_invoked) -		__field(bool, cb) -		__field(bool, nr) -		__field(bool, iit) -		__field(bool, risk) +		__field(char, cb) +		__field(char, nr) +		__field(char, iit) +		__field(char, risk)  	),  	TP_fast_assign( @@ -656,6 +707,7 @@ TRACE_EVENT(rcu_barrier,  #define trace_rcu_future_grace_period(rcuname, gpnum, completed, c, \  				      level, grplo, grphi, event) \  				      do { } while (0) +#define trace_rcu_nocb_wake(rcuname, cpu, reason) do { } while (0)  #define trace_rcu_preempt_task(rcuname, pid, gpnum) do { } while (0)  #define trace_rcu_unlock_preempted_task(rcuname, gpnum, pid) do { } while (0)  #define trace_rcu_quiescent_state_report(rcuname, gpnum, mask, qsmask, level, \ diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 2e7d9947a10..0a68d5ae584 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -100,7 +100,7 @@ static inline long __trace_sched_switch_state(struct task_struct *p)  	/*  	 * For all intents and purposes a preempted task is a running task.  	 */ -	if (task_thread_info(p)->preempt_count & PREEMPT_ACTIVE) +	if (task_preempt_count(p) & PREEMPT_ACTIVE)  		state = TASK_RUNNING | TASK_STATE_MAX;  #endif @@ -424,6 +424,132 @@ TRACE_EVENT(sched_pi_setprio,  			__entry->oldprio, __entry->newprio)  ); +#ifdef CONFIG_DETECT_HUNG_TASK +TRACE_EVENT(sched_process_hang, +	TP_PROTO(struct task_struct *tsk), +	TP_ARGS(tsk), + +	TP_STRUCT__entry( +		__array( char,	comm,	TASK_COMM_LEN	) +		__field( pid_t,	pid			) +	), + +	TP_fast_assign( +		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); +		__entry->pid = tsk->pid; +	), + +	TP_printk("comm=%s pid=%d", __entry->comm, __entry->pid) +); +#endif /* CONFIG_DETECT_HUNG_TASK */ + +DECLARE_EVENT_CLASS(sched_move_task_template, + +	TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), + +	TP_ARGS(tsk, src_cpu, dst_cpu), + +	TP_STRUCT__entry( +		__field( pid_t,	pid			) +		__field( pid_t,	tgid			) +		__field( pid_t,	ngid			) +		__field( int,	src_cpu			) +		__field( int,	src_nid			) +		__field( int,	dst_cpu			) +		__field( int,	dst_nid			) +	), + +	TP_fast_assign( +		__entry->pid		= task_pid_nr(tsk); +		__entry->tgid		= task_tgid_nr(tsk); +		__entry->ngid		= task_numa_group_id(tsk); +		__entry->src_cpu	= src_cpu; +		__entry->src_nid	= cpu_to_node(src_cpu); +		__entry->dst_cpu	= dst_cpu; +		__entry->dst_nid	= cpu_to_node(dst_cpu); +	), + +	TP_printk("pid=%d tgid=%d ngid=%d src_cpu=%d src_nid=%d dst_cpu=%d dst_nid=%d", +			__entry->pid, __entry->tgid, __entry->ngid, +			__entry->src_cpu, __entry->src_nid, +			__entry->dst_cpu, __entry->dst_nid) +); + +/* + * Tracks migration of tasks from one runqueue to another. Can be used to + * detect if automatic NUMA balancing is bouncing between nodes + */ +DEFINE_EVENT(sched_move_task_template, sched_move_numa, +	TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), + +	TP_ARGS(tsk, src_cpu, dst_cpu) +); + +DEFINE_EVENT(sched_move_task_template, sched_stick_numa, +	TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu), + +	TP_ARGS(tsk, src_cpu, dst_cpu) +); + +TRACE_EVENT(sched_swap_numa, + +	TP_PROTO(struct task_struct *src_tsk, int src_cpu, +		 struct task_struct *dst_tsk, int dst_cpu), + +	TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu), + +	TP_STRUCT__entry( +		__field( pid_t,	src_pid			) +		__field( pid_t,	src_tgid		) +		__field( pid_t,	src_ngid		) +		__field( int,	src_cpu			) +		__field( int,	src_nid			) +		__field( pid_t,	dst_pid			) +		__field( pid_t,	dst_tgid		) +		__field( pid_t,	dst_ngid		) +		__field( int,	dst_cpu			) +		__field( int,	dst_nid			) +	), + +	TP_fast_assign( +		__entry->src_pid	= task_pid_nr(src_tsk); +		__entry->src_tgid	= task_tgid_nr(src_tsk); +		__entry->src_ngid	= task_numa_group_id(src_tsk); +		__entry->src_cpu	= src_cpu; +		__entry->src_nid	= cpu_to_node(src_cpu); +		__entry->dst_pid	= task_pid_nr(dst_tsk); +		__entry->dst_tgid	= task_tgid_nr(dst_tsk); +		__entry->dst_ngid	= task_numa_group_id(dst_tsk); +		__entry->dst_cpu	= dst_cpu; +		__entry->dst_nid	= cpu_to_node(dst_cpu); +	), + +	TP_printk("src_pid=%d src_tgid=%d src_ngid=%d src_cpu=%d src_nid=%d dst_pid=%d dst_tgid=%d dst_ngid=%d dst_cpu=%d dst_nid=%d", +			__entry->src_pid, __entry->src_tgid, __entry->src_ngid, +			__entry->src_cpu, __entry->src_nid, +			__entry->dst_pid, __entry->dst_tgid, __entry->dst_ngid, +			__entry->dst_cpu, __entry->dst_nid) +); + +/* + * Tracepoint for waking a polling cpu without an IPI. + */ +TRACE_EVENT(sched_wake_idle_without_ipi, + +	TP_PROTO(int cpu), + +	TP_ARGS(cpu), + +	TP_STRUCT__entry( +		__field(	int,	cpu	) +	), + +	TP_fast_assign( +		__entry->cpu	= cpu; +	), + +	TP_printk("cpu=%d", __entry->cpu) +);  #endif /* _TRACE_SCHED_H */  /* This part must be outside protection */ diff --git a/include/trace/events/spi.h b/include/trace/events/spi.h new file mode 100644 index 00000000000..7e02c983bbe --- /dev/null +++ b/include/trace/events/spi.h @@ -0,0 +1,156 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM spi + +#if !defined(_TRACE_SPI_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_SPI_H + +#include <linux/ktime.h> +#include <linux/tracepoint.h> + +DECLARE_EVENT_CLASS(spi_master, + +	TP_PROTO(struct spi_master *master), + +	TP_ARGS(master), + +	TP_STRUCT__entry( +		__field(        int,           bus_num             ) +	), + +	TP_fast_assign( +		__entry->bus_num = master->bus_num; +	), + +	TP_printk("spi%d", (int)__entry->bus_num) + +); + +DEFINE_EVENT(spi_master, spi_master_idle, + +	TP_PROTO(struct spi_master *master), + +	TP_ARGS(master) + +); + +DEFINE_EVENT(spi_master, spi_master_busy, + +	TP_PROTO(struct spi_master *master), + +	TP_ARGS(master) + +); + +DECLARE_EVENT_CLASS(spi_message, + +	TP_PROTO(struct spi_message *msg), + +	TP_ARGS(msg), + +	TP_STRUCT__entry( +		__field(        int,            bus_num         ) +		__field(        int,            chip_select     ) +		__field(        struct spi_message *,   msg     ) +	), + +	TP_fast_assign( +		__entry->bus_num = msg->spi->master->bus_num; +		__entry->chip_select = msg->spi->chip_select; +		__entry->msg = msg; +	), + +        TP_printk("spi%d.%d %p", (int)__entry->bus_num, +		  (int)__entry->chip_select, +		  (struct spi_message *)__entry->msg) +); + +DEFINE_EVENT(spi_message, spi_message_submit, + +	TP_PROTO(struct spi_message *msg), + +	TP_ARGS(msg) + +); + +DEFINE_EVENT(spi_message, spi_message_start, + +	TP_PROTO(struct spi_message *msg), + +	TP_ARGS(msg) + +); + +TRACE_EVENT(spi_message_done, + +	TP_PROTO(struct spi_message *msg), + +	TP_ARGS(msg), + +	TP_STRUCT__entry( +		__field(        int,            bus_num         ) +		__field(        int,            chip_select     ) +		__field(        struct spi_message *,   msg     ) +		__field(        unsigned,       frame           ) +		__field(        unsigned,       actual          ) +	), + +	TP_fast_assign( +		__entry->bus_num = msg->spi->master->bus_num; +		__entry->chip_select = msg->spi->chip_select; +		__entry->msg = msg; +		__entry->frame = msg->frame_length; +		__entry->actual = msg->actual_length; +	), + +        TP_printk("spi%d.%d %p len=%u/%u", (int)__entry->bus_num, +		  (int)__entry->chip_select, +		  (struct spi_message *)__entry->msg, +                  (unsigned)__entry->actual, (unsigned)__entry->frame) +); + +DECLARE_EVENT_CLASS(spi_transfer, + +	TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), + +	TP_ARGS(msg, xfer), + +	TP_STRUCT__entry( +		__field(        int,            bus_num         ) +		__field(        int,            chip_select     ) +		__field(        struct spi_transfer *,   xfer   ) +		__field(        int,            len             ) +	), + +	TP_fast_assign( +		__entry->bus_num = msg->spi->master->bus_num; +		__entry->chip_select = msg->spi->chip_select; +		__entry->xfer = xfer; +		__entry->len = xfer->len; +	), + +        TP_printk("spi%d.%d %p len=%d", (int)__entry->bus_num, +		  (int)__entry->chip_select, +		  (struct spi_message *)__entry->xfer, +		  (int)__entry->len) +); + +DEFINE_EVENT(spi_transfer, spi_transfer_start, + +	TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), + +	TP_ARGS(msg, xfer) + +); + +DEFINE_EVENT(spi_transfer, spi_transfer_stop, + +	TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), + +	TP_ARGS(msg, xfer) + +); + +#endif /* _TRACE_POWER_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h index d51d16c7afd..1fef3e6e943 100644 --- a/include/trace/events/sunrpc.h +++ b/include/trace/events/sunrpc.h @@ -83,7 +83,7 @@ DECLARE_EVENT_CLASS(rpc_task_running,  		),  	TP_fast_assign( -		__entry->client_id = clnt->cl_clid; +		__entry->client_id = clnt ? clnt->cl_clid : -1;  		__entry->task_id = task->tk_pid;  		__entry->action = action;  		__entry->runstate = task->tk_runstate; @@ -91,7 +91,7 @@ DECLARE_EVENT_CLASS(rpc_task_running,  		__entry->flags = task->tk_flags;  		), -	TP_printk("task:%u@%u flags=%4.4x state=%4.4lx status=%d action=%pf", +	TP_printk("task:%u@%d flags=%4.4x state=%4.4lx status=%d action=%pf",  		__entry->task_id, __entry->client_id,  		__entry->flags,  		__entry->runstate, @@ -301,6 +301,7 @@ DECLARE_EVENT_CLASS(xs_socket_event_done,  DEFINE_RPC_SOCKET_EVENT(rpc_socket_state_change);  DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_connect); +DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_error);  DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_reset_connection);  DEFINE_RPC_SOCKET_EVENT(rpc_socket_close);  DEFINE_RPC_SOCKET_EVENT(rpc_socket_shutdown); diff --git a/include/trace/events/swiotlb.h b/include/trace/events/swiotlb.h new file mode 100644 index 00000000000..7ea4c5e7c44 --- /dev/null +++ b/include/trace/events/swiotlb.h @@ -0,0 +1,46 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM swiotlb + +#if !defined(_TRACE_SWIOTLB_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_SWIOTLB_H + +#include <linux/tracepoint.h> + +TRACE_EVENT(swiotlb_bounced, + +	TP_PROTO(struct device *dev, +		 dma_addr_t dev_addr, +		 size_t size, +		 int swiotlb_force), + +	TP_ARGS(dev, dev_addr, size, swiotlb_force), + +	TP_STRUCT__entry( +		__string(	dev_name,	dev_name(dev)	) +		__field(	u64,	dma_mask		) +		__field(	dma_addr_t,	dev_addr	) +		__field(	size_t,	size			) +		__field(	int,	swiotlb_force		) +	), + +	TP_fast_assign( +		__assign_str(dev_name, dev_name(dev)); +		__entry->dma_mask = (dev->dma_mask ? *dev->dma_mask : 0); +		__entry->dev_addr = dev_addr; +		__entry->size = size; +		__entry->swiotlb_force = swiotlb_force; +	), + +	TP_printk("dev_name: %s dma_mask=%llx dev_addr=%llx " +		"size=%zu %s", +		__get_str(dev_name), +		__entry->dma_mask, +		(unsigned long long)__entry->dev_addr, +		__entry->size, +		__entry->swiotlb_force ? "swiotlb_force" : "" ) +); + +#endif /*  _TRACE_SWIOTLB_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/syscalls.h b/include/trace/events/syscalls.h index 5a4c04a75b3..14e49c79813 100644 --- a/include/trace/events/syscalls.h +++ b/include/trace/events/syscalls.h @@ -13,9 +13,6 @@  #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS -extern void syscall_regfunc(void); -extern void syscall_unregfunc(void); -  TRACE_EVENT_FN(sys_enter,  	TP_PROTO(struct pt_regs *regs, long id), diff --git a/include/trace/events/target.h b/include/trace/events/target.h index aef8fc35402..da9cc0f05c9 100644 --- a/include/trace/events/target.h +++ b/include/trace/events/target.h @@ -144,7 +144,7 @@ TRACE_EVENT(target_sequencer_start,  	),  	TP_fast_assign( -		__entry->unpacked_lun	= cmd->se_lun->unpacked_lun; +		__entry->unpacked_lun	= cmd->orig_fe_lun;  		__entry->opcode		= cmd->t_task_cdb[0];  		__entry->data_length	= cmd->data_length;  		__entry->task_attribute	= cmd->sam_task_attr; @@ -182,7 +182,7 @@ TRACE_EVENT(target_cmd_complete,  	),  	TP_fast_assign( -		__entry->unpacked_lun	= cmd->se_lun->unpacked_lun; +		__entry->unpacked_lun	= cmd->orig_fe_lun;  		__entry->opcode		= cmd->t_task_cdb[0];  		__entry->data_length	= cmd->data_length;  		__entry->task_attribute	= cmd->sam_task_attr; diff --git a/include/trace/events/task.h b/include/trace/events/task.h index 102a646e199..dee3bb1d5a6 100644 --- a/include/trace/events/task.h +++ b/include/trace/events/task.h @@ -32,7 +32,7 @@ TRACE_EVENT(task_newtask,  TRACE_EVENT(task_rename, -	TP_PROTO(struct task_struct *task, char *comm), +	TP_PROTO(struct task_struct *task, const char *comm),  	TP_ARGS(task, comm), diff --git a/include/trace/events/v4l2.h b/include/trace/events/v4l2.h new file mode 100644 index 00000000000..b9bb1f20469 --- /dev/null +++ b/include/trace/events/v4l2.h @@ -0,0 +1,158 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM v4l2 + +#if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_V4L2_H + +#include <linux/tracepoint.h> + +#define show_type(type)							       \ +	__print_symbolic(type,						       \ +		{ V4L2_BUF_TYPE_VIDEO_CAPTURE,	      "VIDEO_CAPTURE" },       \ +		{ V4L2_BUF_TYPE_VIDEO_OUTPUT,	      "VIDEO_OUTPUT" },	       \ +		{ V4L2_BUF_TYPE_VIDEO_OVERLAY,	      "VIDEO_OVERLAY" },       \ +		{ V4L2_BUF_TYPE_VBI_CAPTURE,	      "VBI_CAPTURE" },	       \ +		{ V4L2_BUF_TYPE_VBI_OUTPUT,	      "VBI_OUTPUT" },	       \ +		{ V4L2_BUF_TYPE_SLICED_VBI_CAPTURE,   "SLICED_VBI_CAPTURE" },  \ +		{ V4L2_BUF_TYPE_SLICED_VBI_OUTPUT,    "SLICED_VBI_OUTPUT" },   \ +		{ V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, "VIDEO_OUTPUT_OVERLAY" },\ +		{ V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, "VIDEO_CAPTURE_MPLANE" },\ +		{ V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,  "VIDEO_OUTPUT_MPLANE" }, \ +		{ V4L2_BUF_TYPE_SDR_CAPTURE,          "SDR_CAPTURE" },         \ +		{ V4L2_BUF_TYPE_PRIVATE,	      "PRIVATE" }) + +#define show_field(field)						\ +	__print_symbolic(field,						\ +		{ V4L2_FIELD_ANY,		"ANY" },		\ +		{ V4L2_FIELD_NONE,		"NONE" },		\ +		{ V4L2_FIELD_TOP,		"TOP" },		\ +		{ V4L2_FIELD_BOTTOM,		"BOTTOM" },		\ +		{ V4L2_FIELD_INTERLACED,	"INTERLACED" },		\ +		{ V4L2_FIELD_SEQ_TB,		"SEQ_TB" },		\ +		{ V4L2_FIELD_SEQ_BT,		"SEQ_BT" },		\ +		{ V4L2_FIELD_ALTERNATE,		"ALTERNATE" },		\ +		{ V4L2_FIELD_INTERLACED_TB,	"INTERLACED_TB" },      \ +		{ V4L2_FIELD_INTERLACED_BT,	"INTERLACED_BT" }) + +#define show_timecode_type(type)					\ +	__print_symbolic(type,						\ +		{ V4L2_TC_TYPE_24FPS,		"24FPS" },		\ +		{ V4L2_TC_TYPE_25FPS,		"25FPS" },		\ +		{ V4L2_TC_TYPE_30FPS,		"30FPS" },		\ +		{ V4L2_TC_TYPE_50FPS,		"50FPS" },		\ +		{ V4L2_TC_TYPE_60FPS,		"60FPS" }) + +#define show_flags(flags)						      \ +	__print_flags(flags, "|",					      \ +		{ V4L2_BUF_FLAG_MAPPED,		     "MAPPED" },	      \ +		{ V4L2_BUF_FLAG_QUEUED,		     "QUEUED" },	      \ +		{ V4L2_BUF_FLAG_DONE,		     "DONE" },		      \ +		{ V4L2_BUF_FLAG_KEYFRAME,	     "KEYFRAME" },	      \ +		{ V4L2_BUF_FLAG_PFRAME,		     "PFRAME" },	      \ +		{ V4L2_BUF_FLAG_BFRAME,		     "BFRAME" },	      \ +		{ V4L2_BUF_FLAG_ERROR,		     "ERROR" },		      \ +		{ V4L2_BUF_FLAG_TIMECODE,	     "TIMECODE" },	      \ +		{ V4L2_BUF_FLAG_PREPARED,	     "PREPARED" },	      \ +		{ V4L2_BUF_FLAG_NO_CACHE_INVALIDATE, "NO_CACHE_INVALIDATE" }, \ +		{ V4L2_BUF_FLAG_NO_CACHE_CLEAN,	     "NO_CACHE_CLEAN" },      \ +		{ V4L2_BUF_FLAG_TIMESTAMP_MASK,	     "TIMESTAMP_MASK" },      \ +		{ V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN,   "TIMESTAMP_UNKNOWN" },   \ +		{ V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC, "TIMESTAMP_MONOTONIC" }, \ +		{ V4L2_BUF_FLAG_TIMESTAMP_COPY,	     "TIMESTAMP_COPY" }) + +#define show_timecode_flags(flags)					  \ +	__print_flags(flags, "|",					  \ +		{ V4L2_TC_FLAG_DROPFRAME,       "DROPFRAME" },		  \ +		{ V4L2_TC_FLAG_COLORFRAME,      "COLORFRAME" },		  \ +		{ V4L2_TC_USERBITS_USERDEFINED,	"USERBITS_USERDEFINED" }, \ +		{ V4L2_TC_USERBITS_8BITCHARS,	"USERBITS_8BITCHARS" }) + +#define V4L2_TRACE_EVENT(event_name)					\ +	TRACE_EVENT(event_name,						\ +		TP_PROTO(int minor, struct v4l2_buffer *buf),		\ +									\ +		TP_ARGS(minor, buf),					\ +									\ +		TP_STRUCT__entry(					\ +			__field(int, minor)				\ +			__field(u32, index)				\ +			__field(u32, type)				\ +			__field(u32, bytesused)				\ +			__field(u32, flags)				\ +			__field(u32, field)				\ +			__field(s64, timestamp)				\ +			__field(u32, timecode_type)			\ +			__field(u32, timecode_flags)			\ +			__field(u8, timecode_frames)			\ +			__field(u8, timecode_seconds)			\ +			__field(u8, timecode_minutes)			\ +			__field(u8, timecode_hours)			\ +			__field(u8, timecode_userbits0)			\ +			__field(u8, timecode_userbits1)			\ +			__field(u8, timecode_userbits2)			\ +			__field(u8, timecode_userbits3)			\ +			__field(u32, sequence)				\ +		),							\ +									\ +		TP_fast_assign(						\ +			__entry->minor = minor;				\ +			__entry->index = buf->index;			\ +			__entry->type = buf->type;			\ +			__entry->bytesused = buf->bytesused;		\ +			__entry->flags = buf->flags;			\ +			__entry->field = buf->field;			\ +			__entry->timestamp =				\ +				timeval_to_ns(&buf->timestamp);		\ +			__entry->timecode_type = buf->timecode.type;	\ +			__entry->timecode_flags = buf->timecode.flags;	\ +			__entry->timecode_frames =			\ +				buf->timecode.frames;			\ +			__entry->timecode_seconds =			\ +				buf->timecode.seconds;			\ +			__entry->timecode_minutes =			\ +				buf->timecode.minutes;			\ +			__entry->timecode_hours = buf->timecode.hours;	\ +			__entry->timecode_userbits0 =			\ +				buf->timecode.userbits[0];		\ +			__entry->timecode_userbits1 =			\ +				buf->timecode.userbits[1];		\ +			__entry->timecode_userbits2 =			\ +				buf->timecode.userbits[2];		\ +			__entry->timecode_userbits3 =			\ +				buf->timecode.userbits[3];		\ +			__entry->sequence = buf->sequence;		\ +		),							\ +									\ +		TP_printk("minor = %d, index = %u, type = %s, "		\ +			  "bytesused = %u, flags = %s, "		\ +			  "field = %s, timestamp = %llu, timecode = { "	\ +			  "type = %s, flags = %s, frames = %u, "	\ +			  "seconds = %u, minutes = %u, hours = %u, "	\ +			  "userbits = { %u %u %u %u } }, "		\ +			  "sequence = %u", __entry->minor,		\ +			  __entry->index, show_type(__entry->type),	\ +			  __entry->bytesused,				\ +			  show_flags(__entry->flags),			\ +			  show_field(__entry->field),			\ +			  __entry->timestamp,				\ +			  show_timecode_type(__entry->timecode_type),	\ +			  show_timecode_flags(__entry->timecode_flags),	\ +			  __entry->timecode_frames,			\ +			  __entry->timecode_seconds,			\ +			  __entry->timecode_minutes,			\ +			  __entry->timecode_hours,			\ +			  __entry->timecode_userbits0,			\ +			  __entry->timecode_userbits1,			\ +			  __entry->timecode_userbits2,			\ +			  __entry->timecode_userbits3,			\ +			  __entry->sequence				\ +		)							\ +	) + +V4L2_TRACE_EVENT(v4l2_dqbuf); +V4L2_TRACE_EVENT(v4l2_qbuf); + +#endif /* if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h index 132a985aba8..69590b6ffc0 100644 --- a/include/trace/events/vmscan.h +++ b/include/trace/events/vmscan.h @@ -191,6 +191,7 @@ TRACE_EVENT(mm_shrink_slab_start,  	TP_STRUCT__entry(  		__field(struct shrinker *, shr)  		__field(void *, shrink) +		__field(int, nid)  		__field(long, nr_objects_to_shrink)  		__field(gfp_t, gfp_flags)  		__field(unsigned long, pgs_scanned) @@ -203,6 +204,7 @@ TRACE_EVENT(mm_shrink_slab_start,  	TP_fast_assign(  		__entry->shr = shr;  		__entry->shrink = shr->scan_objects; +		__entry->nid = sc->nid;  		__entry->nr_objects_to_shrink = nr_objects_to_shrink;  		__entry->gfp_flags = sc->gfp_mask;  		__entry->pgs_scanned = pgs_scanned; @@ -212,9 +214,10 @@ TRACE_EVENT(mm_shrink_slab_start,  		__entry->total_scan = total_scan;  	), -	TP_printk("%pF %p: objects to shrink %ld gfp_flags %s pgs_scanned %ld lru_pgs %ld cache items %ld delta %lld total_scan %ld", +	TP_printk("%pF %p: nid: %d objects to shrink %ld gfp_flags %s pgs_scanned %ld lru_pgs %ld cache items %ld delta %lld total_scan %ld",  		__entry->shrink,  		__entry->shr, +		__entry->nid,  		__entry->nr_objects_to_shrink,  		show_gfp_flags(__entry->gfp_flags),  		__entry->pgs_scanned, @@ -225,13 +228,15 @@ TRACE_EVENT(mm_shrink_slab_start,  );  TRACE_EVENT(mm_shrink_slab_end, -	TP_PROTO(struct shrinker *shr, int shrinker_retval, -		long unused_scan_cnt, long new_scan_cnt), +	TP_PROTO(struct shrinker *shr, int nid, int shrinker_retval, +		long unused_scan_cnt, long new_scan_cnt, long total_scan), -	TP_ARGS(shr, shrinker_retval, unused_scan_cnt, new_scan_cnt), +	TP_ARGS(shr, nid, shrinker_retval, unused_scan_cnt, new_scan_cnt, +		total_scan),  	TP_STRUCT__entry(  		__field(struct shrinker *, shr) +		__field(int, nid)  		__field(void *, shrink)  		__field(long, unused_scan)  		__field(long, new_scan) @@ -241,16 +246,18 @@ TRACE_EVENT(mm_shrink_slab_end,  	TP_fast_assign(  		__entry->shr = shr; +		__entry->nid = nid;  		__entry->shrink = shr->scan_objects;  		__entry->unused_scan = unused_scan_cnt;  		__entry->new_scan = new_scan_cnt;  		__entry->retval = shrinker_retval; -		__entry->total_scan = new_scan_cnt - unused_scan_cnt; +		__entry->total_scan = total_scan;  	), -	TP_printk("%pF %p: unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d", +	TP_printk("%pF %p: nid: %d unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d",  		__entry->shrink,  		__entry->shr, +		__entry->nid,  		__entry->unused_scan,  		__entry->new_scan,  		__entry->total_scan, diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index 464ea82e10d..cee02d65ab3 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -4,6 +4,7 @@  #if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ)  #define _TRACE_WRITEBACK_H +#include <linux/tracepoint.h>  #include <linux/backing-dev.h>  #include <linux/writeback.h> diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 5c7ab17cbb0..26b4f2e1327 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h @@ -44,6 +44,12 @@  #undef __field_ext  #define __field_ext(type, item, filter_type)	type	item; +#undef __field_struct +#define __field_struct(type, item)	type	item; + +#undef __field_struct_ext +#define __field_struct_ext(type, item, filter_type)	type	item; +  #undef __array  #define __array(type, item, len)	type	item[len]; @@ -53,6 +59,9 @@  #undef __string  #define __string(item, src) __dynamic_array(char, item, -1) +#undef __bitmask +#define __bitmask(item, nr_bits) __dynamic_array(char, item, -1) +  #undef TP_STRUCT__entry  #define TP_STRUCT__entry(args...) args @@ -90,6 +99,10 @@  #define TRACE_EVENT_FLAGS(name, value)					\  	__TRACE_EVENT_FLAGS(name, value) +#undef TRACE_EVENT_PERF_PERM +#define TRACE_EVENT_PERF_PERM(name, expr...)				\ +	__TRACE_EVENT_PERF_PERM(name, expr) +  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) @@ -115,6 +128,12 @@  #undef __field_ext  #define __field_ext(type, item, filter_type) +#undef __field_struct +#define __field_struct(type, item) + +#undef __field_struct_ext +#define __field_struct_ext(type, item, filter_type) +  #undef __array  #define __array(type, item, len) @@ -124,6 +143,9 @@  #undef __string  #define __string(item, src) __dynamic_array(char, item, -1) +#undef __bitmask +#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) +  #undef DECLARE_EVENT_CLASS  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\  	struct ftrace_data_offsets_##call {				\ @@ -140,6 +162,9 @@  #undef TRACE_EVENT_FLAGS  #define TRACE_EVENT_FLAGS(event, flag) +#undef TRACE_EVENT_PERF_PERM +#define TRACE_EVENT_PERF_PERM(event, expr...) +  #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)  /* @@ -190,9 +215,22 @@  #define __get_dynamic_array(field)	\  		((void *)__entry + (__entry->__data_loc_##field & 0xffff)) +#undef __get_dynamic_array_len +#define __get_dynamic_array_len(field)	\ +		((__entry->__data_loc_##field >> 16) & 0xffff) +  #undef __get_str  #define __get_str(field) (char *)__get_dynamic_array(field) +#undef __get_bitmask +#define __get_bitmask(field)						\ +	({								\ +		void *__bitmask = __get_dynamic_array(field);		\ +		unsigned int __bitmask_size;				\ +		__bitmask_size = __get_dynamic_array_len(field);	\ +		ftrace_print_bitmask_seq(p, __bitmask, __bitmask_size);	\ +	}) +  #undef __print_flags  #define __print_flags(flag, delim, flag_array...)			\  	({								\ @@ -258,11 +296,9 @@ static notrace enum print_line_t					\  ftrace_raw_output_##call(struct trace_iterator *iter, int flags,	\  			 struct trace_event *event)			\  {									\ -	struct trace_seq *s = &iter->seq;				\  	struct ftrace_raw_##template *field;				\  	struct trace_entry *entry;					\  	struct trace_seq *p = &iter->tmp_seq;				\ -	int ret;							\  									\  	entry = iter->ent;						\  									\ @@ -274,13 +310,7 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags,	\  	field = (typeof(field))entry;					\  									\  	trace_seq_init(p);						\ -	ret = trace_seq_printf(s, "%s: ", #call);			\ -	if (ret)							\ -		ret = trace_seq_printf(s, print);			\ -	if (!ret)							\ -		return TRACE_TYPE_PARTIAL_LINE;				\ -									\ -	return TRACE_TYPE_HANDLED;					\ +	return ftrace_output_call(iter, #call, print);			\  }									\  static struct trace_event_functions ftrace_event_type_funcs_##call = {	\  	.trace			= ftrace_raw_output_##call,		\ @@ -297,21 +327,30 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = {	\  	if (ret)							\  		return ret; +#undef __field_struct_ext +#define __field_struct_ext(type, item, filter_type)			\ +	ret = trace_define_field(event_call, #type, #item,		\ +				 offsetof(typeof(field), item),		\ +				 sizeof(field.item),			\ +				 0, filter_type);			\ +	if (ret)							\ +		return ret; +  #undef __field  #define __field(type, item)	__field_ext(type, item, FILTER_OTHER) +#undef __field_struct +#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER) +  #undef __array  #define __array(type, item, len)					\  	do {								\ -		mutex_lock(&event_storage_mutex);			\ +		char *type_str = #type"["__stringify(len)"]";		\  		BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);			\ -		snprintf(event_storage, sizeof(event_storage),		\ -			 "%s[%d]", #type, len);				\ -		ret = trace_define_field(event_call, event_storage, #item, \ +		ret = trace_define_field(event_call, type_str, #item,	\  				 offsetof(typeof(field), item),		\  				 sizeof(field.item),			\  				 is_signed_type(type), FILTER_OTHER);	\ -		mutex_unlock(&event_storage_mutex);			\  		if (ret)						\  			return ret;					\  	} while (0); @@ -326,6 +365,9 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = {	\  #undef __string  #define __string(item, src) __dynamic_array(char, item, -1) +#undef __bitmask +#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) +  #undef DECLARE_EVENT_CLASS  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print)	\  static int notrace __init						\ @@ -361,18 +403,49 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call)	\  #undef __field_ext  #define __field_ext(type, item, filter_type) +#undef __field_struct +#define __field_struct(type, item) + +#undef __field_struct_ext +#define __field_struct_ext(type, item, filter_type) +  #undef __array  #define __array(type, item, len)  #undef __dynamic_array  #define __dynamic_array(type, item, len)				\ +	__item_length = (len) * sizeof(type);				\  	__data_offsets->item = __data_size +				\  			       offsetof(typeof(*entry), __data);	\ -	__data_offsets->item |= (len * sizeof(type)) << 16;		\ -	__data_size += (len) * sizeof(type); +	__data_offsets->item |= __item_length << 16;			\ +	__data_size += __item_length;  #undef __string -#define __string(item, src) __dynamic_array(char, item, strlen(src) + 1) +#define __string(item, src) __dynamic_array(char, item,			\ +		    strlen((src) ? (const char *)(src) : "(null)") + 1) + +/* + * __bitmask_size_in_bytes_raw is the number of bytes needed to hold + * num_possible_cpus(). + */ +#define __bitmask_size_in_bytes_raw(nr_bits)	\ +	(((nr_bits) + 7) / 8) + +#define __bitmask_size_in_longs(nr_bits)			\ +	((__bitmask_size_in_bytes_raw(nr_bits) +		\ +	  ((BITS_PER_LONG / 8) - 1)) / (BITS_PER_LONG / 8)) + +/* + * __bitmask_size_in_bytes is the number of bytes needed to hold + * num_possible_cpus() padded out to the nearest long. This is what + * is saved in the buffer, just to be consistent. + */ +#define __bitmask_size_in_bytes(nr_bits)				\ +	(__bitmask_size_in_longs(nr_bits) * (BITS_PER_LONG / 8)) + +#undef __bitmask +#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item,	\ +					 __bitmask_size_in_longs(nr_bits))  #undef DECLARE_EVENT_CLASS  #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\ @@ -380,6 +453,7 @@ static inline notrace int ftrace_get_offsets_##call(			\  	struct ftrace_data_offsets_##call *__data_offsets, proto)       \  {									\  	int __data_size = 0;						\ +	int __maybe_unused __item_length;				\  	struct ftrace_raw_##call __maybe_unused *entry;			\  									\  	tstruct;							\ @@ -410,6 +484,8 @@ static inline notrace int ftrace_get_offsets_##call(			\   *	struct ftrace_event_file *ftrace_file = __data;   *	struct ftrace_event_call *event_call = ftrace_file->event_call;   *	struct ftrace_data_offsets_<call> __maybe_unused __data_offsets; + *	unsigned long eflags = ftrace_file->flags; + *	enum event_trigger_type __tt = ETT_NONE;   *	struct ring_buffer_event *event;   *	struct ftrace_raw_<call> *entry; <-- defined in stage 1   *	struct ring_buffer *buffer; @@ -417,9 +493,12 @@ static inline notrace int ftrace_get_offsets_##call(			\   *	int __data_size;   *	int pc;   * - *	if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, - *		     &ftrace_file->flags)) - *		return; + *	if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) { + *		if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE) + *			event_triggers_call(ftrace_file, NULL); + *		if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED) + *			return; + *	}   *   *	local_save_flags(irq_flags);   *	pc = preempt_count(); @@ -437,9 +516,17 @@ static inline notrace int ftrace_get_offsets_##call(			\   *	{ <assign>; }  <-- Here we assign the entries by the __field and   *			   __array macros.   * - *	if (!filter_current_check_discard(buffer, event_call, entry, event)) - *		trace_nowake_buffer_unlock_commit(buffer, - *						   event, irq_flags, pc); + *	if (eflags & FTRACE_EVENT_FL_TRIGGER_COND) + *		__tt = event_triggers_call(ftrace_file, entry); + * + *	if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, + *		     &ftrace_file->flags)) + *		ring_buffer_discard_commit(buffer, event); + *	else if (!filter_check_discard(ftrace_file, entry, buffer, event)) + *		trace_buffer_unlock_commit(buffer, event, irq_flags, pc); + * + *	if (__tt) + *		event_triggers_post_call(ftrace_file, __tt);   * }   *   * static struct trace_event ftrace_event_type_<call> = { @@ -458,10 +545,13 @@ static inline notrace int ftrace_get_offsets_##call(			\   * };   *   * static struct ftrace_event_call event_<call> = { - *	.name			= "<call>",   *	.class			= event_class_<template>, + *	{ + *		.tp			= &__tracepoint_<call>, + *	},   *	.event			= &ftrace_event_type_<call>,   *	.print_fmt		= print_fmt_<call>, + *	.flags			= TRACE_EVENT_FL_TRACEPOINT,   * };   * // its only safe to use pointers when doing linker tricks to   * // create an array. @@ -490,6 +580,9 @@ static inline notrace int ftrace_get_offsets_##call(			\  #undef __field  #define __field(type, item) +#undef __field_struct +#define __field_struct(type, item) +  #undef __array  #define __array(type, item, len) @@ -498,11 +591,21 @@ static inline notrace int ftrace_get_offsets_##call(			\  	__entry->__data_loc_##item = __data_offsets.item;  #undef __string -#define __string(item, src) __dynamic_array(char, item, -1)       	\ +#define __string(item, src) __dynamic_array(char, item, -1)  #undef __assign_str  #define __assign_str(dst, src)						\ -	strcpy(__get_str(dst), src); +	strcpy(__get_str(dst), (src) ? (const char *)(src) : "(null)"); + +#undef __bitmask +#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) + +#undef __get_bitmask +#define __get_bitmask(field) (char *)__get_dynamic_array(field) + +#undef __assign_bitmask +#define __assign_bitmask(dst, src, nr_bits)					\ +	memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))  #undef TP_fast_assign  #define TP_fast_assign(args...) args @@ -523,38 +626,27 @@ static notrace void							\  ftrace_raw_event_##call(void *__data, proto)				\  {									\  	struct ftrace_event_file *ftrace_file = __data;			\ -	struct ftrace_event_call *event_call = ftrace_file->event_call;	\  	struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ -	struct ring_buffer_event *event;				\ +	struct ftrace_event_buffer fbuffer;				\  	struct ftrace_raw_##call *entry;				\ -	struct ring_buffer *buffer;					\ -	unsigned long irq_flags;					\  	int __data_size;						\ -	int pc;								\  									\ -	if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT,			\ -		     &ftrace_file->flags))				\ +	if (ftrace_trigger_soft_disabled(ftrace_file))			\  		return;							\  									\ -	local_save_flags(irq_flags);					\ -	pc = preempt_count();						\ -									\  	__data_size = ftrace_get_offsets_##call(&__data_offsets, args); \  									\ -	event = trace_event_buffer_lock_reserve(&buffer, ftrace_file,	\ -				 event_call->event.type,		\ -				 sizeof(*entry) + __data_size,		\ -				 irq_flags, pc);			\ -	if (!event)							\ +	entry = ftrace_event_buffer_reserve(&fbuffer, ftrace_file,	\ +				 sizeof(*entry) + __data_size);		\ +									\ +	if (!entry)							\  		return;							\ -	entry	= ring_buffer_event_data(event);			\  									\  	tstruct								\  									\  	{ assign; }							\  									\ -	if (!filter_current_check_discard(buffer, event_call, entry, event)) \ -		trace_buffer_unlock_commit(buffer, event, irq_flags, pc); \ +	ftrace_event_buffer_commit(&fbuffer);				\  }  /*   * The ftrace_test_probe is compiled out, it is only here as a build time check @@ -581,7 +673,9 @@ static inline void ftrace_test_probe_##call(void)			\  #undef __print_symbolic  #undef __print_hex  #undef __get_dynamic_array +#undef __get_dynamic_array_len  #undef __get_str +#undef __get_bitmask  #undef TP_printk  #define TP_printk(fmt, args...) "\"" fmt "\", "  __stringify(args) @@ -604,10 +698,13 @@ static struct ftrace_event_class __used __refdata event_class_##call = { \  #define DEFINE_EVENT(template, call, proto, args)			\  									\  static struct ftrace_event_call __used event_##call = {			\ -	.name			= #call,				\  	.class			= &event_class_##template,		\ +	{								\ +		.tp			= &__tracepoint_##call,		\ +	},								\  	.event.funcs		= &ftrace_event_type_funcs_##template,	\  	.print_fmt		= print_fmt_##template,			\ +	.flags			= TRACE_EVENT_FL_TRACEPOINT,		\  };									\  static struct ftrace_event_call __used					\  __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call @@ -618,10 +715,13 @@ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call  static const char print_fmt_##call[] = print;				\  									\  static struct ftrace_event_call __used event_##call = {			\ -	.name			= #call,				\  	.class			= &event_class_##template,		\ +	{								\ +		.tp			= &__tracepoint_##call,		\ +	},								\  	.event.funcs		= &ftrace_event_type_funcs_##call,	\  	.print_fmt		= print_fmt_##call,			\ +	.flags			= TRACE_EVENT_FL_TRACEPOINT,		\  };									\  static struct ftrace_event_call __used					\  __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call @@ -638,9 +738,16 @@ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call  #define __get_dynamic_array(field)	\  		((void *)__entry + (__entry->__data_loc_##field & 0xffff)) +#undef __get_dynamic_array_len +#define __get_dynamic_array_len(field)	\ +		((__entry->__data_loc_##field >> 16) & 0xffff) +  #undef __get_str  #define __get_str(field) (char *)__get_dynamic_array(field) +#undef __get_bitmask +#define __get_bitmask(field) (char *)__get_dynamic_array(field) +  #undef __perf_addr  #define __perf_addr(a)	(__addr = (a)) diff --git a/include/trace/syscall.h b/include/trace/syscall.h index fed853f3d7a..9674145e2f6 100644 --- a/include/trace/syscall.h +++ b/include/trace/syscall.h @@ -4,6 +4,7 @@  #include <linux/tracepoint.h>  #include <linux/unistd.h>  #include <linux/ftrace_event.h> +#include <linux/thread_info.h>  #include <asm/ptrace.h> @@ -32,4 +33,18 @@ struct syscall_metadata {  	struct ftrace_event_call *exit_event;  }; +#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_HAVE_SYSCALL_TRACEPOINTS) +static inline void syscall_tracepoint_update(struct task_struct *p) +{ +	if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) +		set_tsk_thread_flag(p, TIF_SYSCALL_TRACEPOINT); +	else +		clear_tsk_thread_flag(p, TIF_SYSCALL_TRACEPOINT); +} +#else +static inline void syscall_tracepoint_update(struct task_struct *p) +{ +} +#endif +  #endif /* _TRACE_SYSCALL_H */  | 
