block: use standard blktrace API to output cgroup info for debug notes
authorShaohua Li <shli@fb.com>
Wed, 12 Jul 2017 18:49:56 +0000 (11:49 -0700)
committerJens Axboe <axboe@kernel.dk>
Sat, 29 Jul 2017 15:00:03 +0000 (09:00 -0600)
Currently cfq/bfq/blk-throttle output cgroup info in trace in their own
way. Now we have standard blktrace API for this, so convert them to use
it.

Note, this changes the behavior a little bit. cgroup info isn't output
by default, we only do this with 'blk_cgroup' option enabled. cgroup
info isn't output as a string by default too, we only do this with
'blk_cgname' option enabled. Also cgroup info is output in different
position of the note string. I think these behavior changes aren't a big
issue (actually we make trace data shorter which is good), since the
blktrace note is solely for debugging.

Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bfq-iosched.h
block/blk-throttle.c
block/cfq-iosched.c
include/linux/blktrace_api.h
kernel/trace/blktrace.c

index 63e771ab56d80ade8cd5b5e8ccd86f2fac5f0573..1f74d71b45cdf9126d6c78ad277cafb2546ebcbd 100644 (file)
@@ -917,13 +917,16 @@ void bfq_add_bfqq_busy(struct bfq_data *bfqd, struct bfq_queue *bfqq);
 struct bfq_group *bfqq_group(struct bfq_queue *bfqq);
 
 #define bfq_log_bfqq(bfqd, bfqq, fmt, args...) do {                    \
-       blk_add_trace_msg((bfqd)->queue, "bfq%d%c %s " fmt, (bfqq)->pid,\
-                       bfq_bfqq_sync((bfqq)) ? 'S' : 'A',              \
-                       bfqq_group(bfqq)->blkg_path, ##args);           \
+       blk_add_cgroup_trace_msg((bfqd)->queue,                         \
+                       bfqg_to_blkg(bfqq_group(bfqq))->blkcg,          \
+                       "bfq%d%c " fmt, (bfqq)->pid,                    \
+                       bfq_bfqq_sync((bfqq)) ? 'S' : 'A', ##args);     \
 } while (0)
 
-#define bfq_log_bfqg(bfqd, bfqg, fmt, args...) \
-       blk_add_trace_msg((bfqd)->queue, "%s " fmt, (bfqg)->blkg_path, ##args)
+#define bfq_log_bfqg(bfqd, bfqg, fmt, args...) do {                    \
+       blk_add_cgroup_trace_msg((bfqd)->queue,                         \
+               bfqg_to_blkg(bfqg)->blkcg, fmt, ##args);                \
+} while (0)
 
 #else /* CONFIG_BFQ_GROUP_IOSCHED */
 
index a6ebd2bdb4df9498743449fc3c6a220ae4c5522e..6a4c4c493dd57cf9f2ef807eae142abf9a10be48 100644 (file)
@@ -373,10 +373,8 @@ static unsigned int tg_iops_limit(struct throtl_grp *tg, int rw)
        if (likely(!blk_trace_note_message_enabled(__td->queue)))       \
                break;                                                  \
        if ((__tg)) {                                                   \
-               char __pbuf[128];                                       \
-                                                                       \
-               blkg_path(tg_to_blkg(__tg), __pbuf, sizeof(__pbuf));    \
-               blk_add_trace_msg(__td->queue, "throtl %s " fmt, __pbuf, ##args); \
+               blk_add_cgroup_trace_msg(__td->queue,                   \
+                       tg_to_blkg(__tg)->blkcg, "throtl " fmt, ##args);\
        } else {                                                        \
                blk_add_trace_msg(__td->queue, "throtl " fmt, ##args);  \
        }                                                               \
index 3d5c289457191ed8e1718ac3ebb5892a5343ff66..0fb78fb3c03cae86fec0b38647fb8d0a4cbbec52 100644 (file)
@@ -656,20 +656,17 @@ static inline void cfqg_put(struct cfq_group *cfqg)
 }
 
 #define cfq_log_cfqq(cfqd, cfqq, fmt, args...) do {                    \
-       char __pbuf[128];                                               \
-                                                                       \
-       blkg_path(cfqg_to_blkg((cfqq)->cfqg), __pbuf, sizeof(__pbuf));  \
-       blk_add_trace_msg((cfqd)->queue, "cfq%d%c%c %s " fmt, (cfqq)->pid, \
+       blk_add_cgroup_trace_msg((cfqd)->queue,                         \
+                       cfqg_to_blkg((cfqq)->cfqg)->blkcg,              \
+                       "cfq%d%c%c " fmt, (cfqq)->pid,                  \
                        cfq_cfqq_sync((cfqq)) ? 'S' : 'A',              \
                        cfqq_type((cfqq)) == SYNC_NOIDLE_WORKLOAD ? 'N' : ' ',\
-                         __pbuf, ##args);                              \
+                         ##args);                                      \
 } while (0)
 
 #define cfq_log_cfqg(cfqd, cfqg, fmt, args...) do {                    \
-       char __pbuf[128];                                               \
-                                                                       \
-       blkg_path(cfqg_to_blkg(cfqg), __pbuf, sizeof(__pbuf));          \
-       blk_add_trace_msg((cfqd)->queue, "%s " fmt, __pbuf, ##args);    \
+       blk_add_cgroup_trace_msg((cfqd)->queue,                         \
+                       cfqg_to_blkg(cfqg)->blkcg, fmt, ##args);        \
 } while (0)
 
 static inline void cfqg_stats_update_io_add(struct cfq_group *cfqg,
index d2e908586e3d50322025806a61816d1ec1b56ece..67b4d4dfc19c5e6f1e958ca73fc8f463d2a4991c 100644 (file)
@@ -28,10 +28,12 @@ struct blk_trace {
        atomic_t dropped;
 };
 
+struct blkcg;
+
 extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *);
 extern void blk_trace_shutdown(struct request_queue *);
-extern __printf(2, 3)
-void __trace_note_message(struct blk_trace *, const char *fmt, ...);
+extern __printf(3, 4)
+void __trace_note_message(struct blk_trace *, struct blkcg *blkcg, const char *fmt, ...);
 
 /**
  * blk_add_trace_msg - Add a (simple) message to the blktrace stream
@@ -46,12 +48,14 @@ void __trace_note_message(struct blk_trace *, const char *fmt, ...);
  *     NOTE: Can not use 'static inline' due to presence of var args...
  *
  **/
-#define blk_add_trace_msg(q, fmt, ...)                                 \
+#define blk_add_cgroup_trace_msg(q, cg, fmt, ...)                      \
        do {                                                            \
                struct blk_trace *bt = (q)->blk_trace;                  \
                if (unlikely(bt))                                       \
-                       __trace_note_message(bt, fmt, ##__VA_ARGS__);   \
+                       __trace_note_message(bt, cg, fmt, ##__VA_ARGS__);\
        } while (0)
+#define blk_add_trace_msg(q, fmt, ...)                                 \
+       blk_add_cgroup_trace_msg(q, NULL, fmt, ##__VA_ARGS__)
 #define BLK_TN_MAX_MSG         128
 
 static inline bool blk_trace_note_message_enabled(struct request_queue *q)
@@ -82,6 +86,7 @@ extern struct attribute_group blk_trace_attr_group;
 # define blk_trace_startstop(q, start)                 (-ENOTTY)
 # define blk_trace_remove(q)                           (-ENOTTY)
 # define blk_add_trace_msg(q, fmt, ...)                        do { } while (0)
+# define blk_add_cgroup_trace_msg(q, cg, fmt, ...)     do { } while (0)
 # define blk_trace_remove_sysfs(dev)                   do { } while (0)
 # define blk_trace_note_message_enabled(q)             (false)
 static inline int blk_trace_init_sysfs(struct device *dev)
index e90974ed4532748d5f3467e445254b13f8f8545c..7724de18d2feb3eb376610862ae2377f48363ee4 100644 (file)
@@ -154,7 +154,8 @@ static void trace_note_time(struct blk_trace *bt)
        local_irq_restore(flags);
 }
 
-void __trace_note_message(struct blk_trace *bt, const char *fmt, ...)
+void __trace_note_message(struct blk_trace *bt, struct blkcg *blkcg,
+       const char *fmt, ...)
 {
        int n;
        va_list args;
@@ -178,7 +179,14 @@ void __trace_note_message(struct blk_trace *bt, const char *fmt, ...)
        n = vscnprintf(buf, BLK_TN_MAX_MSG, fmt, args);
        va_end(args);
 
+       if (!(blk_tracer_flags.val & TRACE_BLK_OPT_CGROUP))
+               blkcg = NULL;
+#ifdef CONFIG_BLK_CGROUP
+       trace_note(bt, 0, BLK_TN_MESSAGE, buf, n,
+               blkcg ? cgroup_get_kernfs_id(blkcg->css.cgroup) : NULL);
+#else
        trace_note(bt, 0, BLK_TN_MESSAGE, buf, n, NULL);
+#endif
        local_irq_restore(flags);
 }
 EXPORT_SYMBOL_GPL(__trace_note_message);
@@ -375,7 +383,7 @@ static ssize_t blk_msg_write(struct file *filp, const char __user *buffer,
                return PTR_ERR(msg);
 
        bt = filp->private_data;
-       __trace_note_message(bt, "%s", msg);
+       __trace_note_message(bt, NULL, "%s", msg);
        kfree(msg);
 
        return count;