blktrace: add an option to allow displaying cgroup path
By default we output cgroup id in blktrace. This adds an option to display cgroup path. Since get cgroup path is a relativly heavy operation, we don't enable it by default. with the option enabled, blktrace will output something like this: dd-1353 [007] d..2 293.015252: 8,0 /test/level D R 24 + 8 [dd] Signed-off-by: Shaohua Li <shli@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
007cc56b7e
commit
69fd5c3917
|
@ -65,6 +65,25 @@ const struct super_operations kernfs_sops = {
|
||||||
.show_path = kernfs_sop_show_path,
|
.show_path = kernfs_sop_show_path,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Similar to kernfs_fh_get_inode, this one gets kernfs node from inode
|
||||||
|
* number and generation
|
||||||
|
*/
|
||||||
|
struct kernfs_node *kernfs_get_node_by_id(struct kernfs_root *root,
|
||||||
|
const union kernfs_node_id *id)
|
||||||
|
{
|
||||||
|
struct kernfs_node *kn;
|
||||||
|
|
||||||
|
kn = kernfs_find_and_get_node_by_ino(root, id->ino);
|
||||||
|
if (!kn)
|
||||||
|
return NULL;
|
||||||
|
if (kn->id.generation != id->generation) {
|
||||||
|
kernfs_put(kn);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return kn;
|
||||||
|
}
|
||||||
|
|
||||||
static struct inode *kernfs_fh_get_inode(struct super_block *sb,
|
static struct inode *kernfs_fh_get_inode(struct super_block *sb,
|
||||||
u64 ino, u32 generation)
|
u64 ino, u32 generation)
|
||||||
{
|
{
|
||||||
|
|
|
@ -613,6 +613,9 @@ static inline union kernfs_node_id *cgroup_get_kernfs_id(struct cgroup *cgrp)
|
||||||
{
|
{
|
||||||
return &cgrp->kn->id;
|
return &cgrp->kn->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cgroup_path_from_kernfs_id(const union kernfs_node_id *id,
|
||||||
|
char *buf, size_t buflen);
|
||||||
#else /* !CONFIG_CGROUPS */
|
#else /* !CONFIG_CGROUPS */
|
||||||
|
|
||||||
struct cgroup_subsys_state;
|
struct cgroup_subsys_state;
|
||||||
|
@ -645,6 +648,9 @@ static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void cgroup_path_from_kernfs_id(const union kernfs_node_id *id,
|
||||||
|
char *buf, size_t buflen) {}
|
||||||
#endif /* !CONFIG_CGROUPS */
|
#endif /* !CONFIG_CGROUPS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -358,6 +358,8 @@ struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns);
|
||||||
|
|
||||||
void kernfs_init(void);
|
void kernfs_init(void);
|
||||||
|
|
||||||
|
struct kernfs_node *kernfs_get_node_by_id(struct kernfs_root *root,
|
||||||
|
const union kernfs_node_id *id);
|
||||||
#else /* CONFIG_KERNFS */
|
#else /* CONFIG_KERNFS */
|
||||||
|
|
||||||
static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
|
static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
|
||||||
|
|
|
@ -4701,6 +4701,18 @@ static int __init cgroup_wq_init(void)
|
||||||
}
|
}
|
||||||
core_initcall(cgroup_wq_init);
|
core_initcall(cgroup_wq_init);
|
||||||
|
|
||||||
|
void cgroup_path_from_kernfs_id(const union kernfs_node_id *id,
|
||||||
|
char *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
struct kernfs_node *kn;
|
||||||
|
|
||||||
|
kn = kernfs_get_node_by_id(cgrp_dfl_root.kf_root, id);
|
||||||
|
if (!kn)
|
||||||
|
return;
|
||||||
|
kernfs_path(kn, buf, buflen);
|
||||||
|
kernfs_put(kn);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* proc_cgroup_show()
|
* proc_cgroup_show()
|
||||||
* - Print task's cgroup paths into seq_file, one line for each hierarchy
|
* - Print task's cgroup paths into seq_file, one line for each hierarchy
|
||||||
|
|
|
@ -48,12 +48,14 @@ static __cacheline_aligned_in_smp DEFINE_SPINLOCK(running_trace_lock);
|
||||||
/* Select an alternative, minimalistic output than the original one */
|
/* Select an alternative, minimalistic output than the original one */
|
||||||
#define TRACE_BLK_OPT_CLASSIC 0x1
|
#define TRACE_BLK_OPT_CLASSIC 0x1
|
||||||
#define TRACE_BLK_OPT_CGROUP 0x2
|
#define TRACE_BLK_OPT_CGROUP 0x2
|
||||||
|
#define TRACE_BLK_OPT_CGNAME 0x4
|
||||||
|
|
||||||
static struct tracer_opt blk_tracer_opts[] = {
|
static struct tracer_opt blk_tracer_opts[] = {
|
||||||
/* Default disable the minimalistic output */
|
/* Default disable the minimalistic output */
|
||||||
{ TRACER_OPT(blk_classic, TRACE_BLK_OPT_CLASSIC) },
|
{ TRACER_OPT(blk_classic, TRACE_BLK_OPT_CLASSIC) },
|
||||||
#ifdef CONFIG_BLK_CGROUP
|
#ifdef CONFIG_BLK_CGROUP
|
||||||
{ TRACER_OPT(blk_cgroup, TRACE_BLK_OPT_CGROUP) },
|
{ TRACER_OPT(blk_cgroup, TRACE_BLK_OPT_CGROUP) },
|
||||||
|
{ TRACER_OPT(blk_cgname, TRACE_BLK_OPT_CGNAME) },
|
||||||
#endif
|
#endif
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
@ -1213,7 +1215,17 @@ static void blk_log_action(struct trace_iterator *iter, const char *act,
|
||||||
if (has_cg) {
|
if (has_cg) {
|
||||||
const union kernfs_node_id *id = cgid_start(iter->ent);
|
const union kernfs_node_id *id = cgid_start(iter->ent);
|
||||||
|
|
||||||
trace_seq_printf(&iter->seq, "%3d,%-3d %x,%-x %2s %3s ",
|
if (blk_tracer_flags.val & TRACE_BLK_OPT_CGNAME) {
|
||||||
|
char blkcg_name_buf[NAME_MAX + 1] = "<...>";
|
||||||
|
|
||||||
|
cgroup_path_from_kernfs_id(id, blkcg_name_buf,
|
||||||
|
sizeof(blkcg_name_buf));
|
||||||
|
trace_seq_printf(&iter->seq, "%3d,%-3d %s %2s %3s ",
|
||||||
|
MAJOR(t->device), MINOR(t->device),
|
||||||
|
blkcg_name_buf, act, rwbs);
|
||||||
|
} else
|
||||||
|
trace_seq_printf(&iter->seq,
|
||||||
|
"%3d,%-3d %x,%-x %2s %3s ",
|
||||||
MAJOR(t->device), MINOR(t->device),
|
MAJOR(t->device), MINOR(t->device),
|
||||||
id->ino, id->generation, act, rwbs);
|
id->ino, id->generation, act, rwbs);
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in New Issue