diff options
Diffstat (limited to 'block/blktrace.c')
| -rw-r--r-- | block/blktrace.c | 29 | 
1 files changed, 25 insertions, 4 deletions
| diff --git a/block/blktrace.c b/block/blktrace.c index b2cbb4e5d767..8d3a27780260 100644 --- a/block/blktrace.c +++ b/block/blktrace.c @@ -75,6 +75,24 @@ static void trace_note_time(struct blk_trace *bt)  	local_irq_restore(flags);  } +void __trace_note_message(struct blk_trace *bt, const char *fmt, ...) +{ +	int n; +	va_list args; +	unsigned long flags; +	char *buf; + +	local_irq_save(flags); +	buf = per_cpu_ptr(bt->msg_data, smp_processor_id()); +	va_start(args, fmt); +	n = vscnprintf(buf, BLK_TN_MAX_MSG, fmt, args); +	va_end(args); + +	trace_note(bt, 0, BLK_TN_MESSAGE, buf, n); +	local_irq_restore(flags); +} +EXPORT_SYMBOL_GPL(__trace_note_message); +  static int act_log_check(struct blk_trace *bt, u32 what, sector_t sector,  			 pid_t pid)  { @@ -141,10 +159,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,  	/*  	 * A word about the locking here - we disable interrupts to reserve  	 * some space in the relay per-cpu buffer, to prevent an irq -	 * from coming in and stepping on our toes. Once reserved, it's -	 * enough to get preemption disabled to prevent read of this data -	 * before we are through filling it. get_cpu()/put_cpu() does this -	 * for us +	 * from coming in and stepping on our toes.  	 */  	local_irq_save(flags); @@ -232,6 +247,7 @@ static void blk_trace_cleanup(struct blk_trace *bt)  	debugfs_remove(bt->dropped_file);  	blk_remove_tree(bt->dir);  	free_percpu(bt->sequence); +	free_percpu(bt->msg_data);  	kfree(bt);  } @@ -346,6 +362,10 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,  	if (!bt->sequence)  		goto err; +	bt->msg_data = __alloc_percpu(BLK_TN_MAX_MSG); +	if (!bt->msg_data) +		goto err; +  	ret = -ENOENT;  	dir = blk_create_tree(buts->name);  	if (!dir) @@ -392,6 +412,7 @@ err:  		if (bt->dropped_file)  			debugfs_remove(bt->dropped_file);  		free_percpu(bt->sequence); +		free_percpu(bt->msg_data);  		if (bt->rchan)  			relay_close(bt->rchan);  		kfree(bt); | 
