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)
|
static void blk_trace_cleanup(struct blk_trace *bt)
|
||||||
{
|
{
|
||||||
relay_close(bt->rchan);
|
relay_close(bt->rchan);
|
||||||
|
debugfs_remove(bt->msg_file);
|
||||||
debugfs_remove(bt->dropped_file);
|
debugfs_remove(bt->dropped_file);
|
||||||
blk_remove_tree(bt->dir);
|
blk_remove_tree(bt->dir);
|
||||||
free_percpu(bt->sequence);
|
free_percpu(bt->sequence);
|
||||||
|
@ -291,6 +292,44 @@ static const struct file_operations blk_dropped_fops = {
|
||||||
.read = blk_dropped_read,
|
.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
|
* 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.
|
* 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)
|
if (!bt->dropped_file)
|
||||||
goto err;
|
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,
|
bt->rchan = relay_open("trace", dir, buts->buf_size,
|
||||||
buts->buf_nr, &blk_relay_callbacks, bt);
|
buts->buf_nr, &blk_relay_callbacks, bt);
|
||||||
if (!bt->rchan)
|
if (!bt->rchan)
|
||||||
|
@ -409,6 +452,8 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
||||||
if (dir)
|
if (dir)
|
||||||
blk_remove_tree(dir);
|
blk_remove_tree(dir);
|
||||||
if (bt) {
|
if (bt) {
|
||||||
|
if (bt->msg_file)
|
||||||
|
debugfs_remove(bt->msg_file);
|
||||||
if (bt->dropped_file)
|
if (bt->dropped_file)
|
||||||
debugfs_remove(bt->dropped_file);
|
debugfs_remove(bt->dropped_file);
|
||||||
free_percpu(bt->sequence);
|
free_percpu(bt->sequence);
|
||||||
|
|
|
@ -129,6 +129,7 @@ struct blk_trace {
|
||||||
u32 dev;
|
u32 dev;
|
||||||
struct dentry *dir;
|
struct dentry *dir;
|
||||||
struct dentry *dropped_file;
|
struct dentry *dropped_file;
|
||||||
|
struct dentry *msg_file;
|
||||||
atomic_t dropped;
|
atomic_t dropped;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue