Added in user-injected messages into blk traces
This allows a user to annotate the blk trace stream: writing a suitable message to {/sys/kernel/debug}/block/<dsf>/msg will have it propagated into the trace stream. Signed-off-by: Alan D. Brunelle <alan.brunelle@hp.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
7b679138b3
commit
02c62304e6
2 changed files with 46 additions and 0 deletions
|
@ -244,6 +244,7 @@ static struct dentry *blk_create_tree(const char *blk_name)
|
|||
static void blk_trace_cleanup(struct blk_trace *bt)
|
||||
{
|
||||
relay_close(bt->rchan);
|
||||
debugfs_remove(bt->msg_file);
|
||||
debugfs_remove(bt->dropped_file);
|
||||
blk_remove_tree(bt->dir);
|
||||
free_percpu(bt->sequence);
|
||||
|
@ -291,6 +292,44 @@ static const struct file_operations blk_dropped_fops = {
|
|||
.read = blk_dropped_read,
|
||||
};
|
||||
|
||||
static int blk_msg_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
filp->private_data = inode->i_private;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t blk_msg_write(struct file *filp, const char __user *buffer,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
char *msg;
|
||||
struct blk_trace *bt;
|
||||
|
||||
if (count > BLK_TN_MAX_MSG)
|
||||
return -EINVAL;
|
||||
|
||||
msg = kmalloc(count, GFP_KERNEL);
|
||||
if (msg == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (copy_from_user(msg, buffer, count)) {
|
||||
kfree(msg);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
bt = filp->private_data;
|
||||
__trace_note_message(bt, "%s", msg);
|
||||
kfree(msg);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations blk_msg_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = blk_msg_open,
|
||||
.write = blk_msg_write,
|
||||
};
|
||||
|
||||
/*
|
||||
* Keep track of how many times we encountered a full subbuffer, to aid
|
||||
* the user space app in telling how many lost events there were.
|
||||
|
@ -380,6 +419,10 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
|||
if (!bt->dropped_file)
|
||||
goto err;
|
||||
|
||||
bt->msg_file = debugfs_create_file("msg", 0222, dir, bt, &blk_msg_fops);
|
||||
if (!bt->msg_file)
|
||||
goto err;
|
||||
|
||||
bt->rchan = relay_open("trace", dir, buts->buf_size,
|
||||
buts->buf_nr, &blk_relay_callbacks, bt);
|
||||
if (!bt->rchan)
|
||||
|
@ -409,6 +452,8 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
|||
if (dir)
|
||||
blk_remove_tree(dir);
|
||||
if (bt) {
|
||||
if (bt->msg_file)
|
||||
debugfs_remove(bt->msg_file);
|
||||
if (bt->dropped_file)
|
||||
debugfs_remove(bt->dropped_file);
|
||||
free_percpu(bt->sequence);
|
||||
|
|
|
@ -129,6 +129,7 @@ struct blk_trace {
|
|||
u32 dev;
|
||||
struct dentry *dir;
|
||||
struct dentry *dropped_file;
|
||||
struct dentry *msg_file;
|
||||
atomic_t dropped;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue