blk-throttle: don't parse cgroup path if trace isn't enabled
authorShaohua Li <shli@fb.com>
Tue, 10 May 2016 00:22:15 +0000 (17:22 -0700)
committerJens Axboe <axboe@fb.com>
Tue, 10 May 2016 14:41:37 +0000 (08:41 -0600)
if trace isn't enabled, parsing cgroup path just wastes cpu

Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-throttle.c
include/linux/blktrace_api.h

index 2149a1ddbacf21a02a164b042c76e06bf6734c77..47a3e540631a38b123a078350d28ae457753ebbd 100644 (file)
@@ -211,15 +211,14 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
  *
  * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
  * throtl_grp; otherwise, just "throtl".
- *
- * TODO: this should be made a function and name formatting should happen
- * after testing whether blktrace is enabled.
  */
 #define throtl_log(sq, fmt, args...)   do {                            \
        struct throtl_grp *__tg = sq_to_tg((sq));                       \
        struct throtl_data *__td = sq_to_td((sq));                      \
                                                                        \
        (void)__td;                                                     \
+       if (likely(!blk_trace_note_message_enabled(__td->queue)))       \
+               break;                                                  \
        if ((__tg)) {                                                   \
                char __pbuf[128];                                       \
                                                                        \
index afc1343df3c7ab3775c8fc2e822c4e619bf658c1..0f3172b8b22597309cacf6aa8567786996ce7aa5 100644 (file)
@@ -57,6 +57,14 @@ void __trace_note_message(struct blk_trace *, const char *fmt, ...);
        } while (0)
 #define BLK_TN_MAX_MSG         128
 
+static inline bool blk_trace_note_message_enabled(struct request_queue *q)
+{
+       struct blk_trace *bt = q->blk_trace;
+       if (likely(!bt))
+               return false;
+       return bt->act_mask & BLK_TC_NOTIFY;
+}
+
 extern void blk_add_driver_data(struct request_queue *q, struct request *rq,
                                void *data, size_t len);
 extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
@@ -79,6 +87,7 @@ extern struct attribute_group blk_trace_attr_group;
 # define blk_trace_remove(q)                           (-ENOTTY)
 # define blk_add_trace_msg(q, 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)
 {
        return 0;