]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
core: hint the dout()'s message crafting as a cold code.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 9 Feb 2018 15:19:10 +0000 (16:19 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Feb 2018 10:38:48 +0000 (11:38 +0100)
The idea is to:
  1. Do not put the dout()'s crafting stuff on the hot, fall-through
     path. Cheapest branches are those that are forward and never taken.
  2. Move it to separated sections placed far away from the main path
     to be more friendly to ICache and ITLB. That is, dout_impl constructs
     a function now.

Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/common/compiler_extensions.h
src/common/dout.h
src/common/likely.h

index 2fd8f5c2d1367ed343e529c578cbe738ad4721cb..64bad194038d7ee3cd20874ca499aa413bc0a538 100644 (file)
 #ifdef __GNUC__
 // GCC
 #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+
+#define HINT_COLD_CODE __attribute__((cold))
+#define HINT_NO_INLINE __attribute__((noinline))
 #else
 // some other compiler - just make it a no-op
 #define WARN_UNUSED_RESULT
+
+#define HINT_COLD_CODE
+#define HINT_NO_INLINE
 #endif
 
 #endif
index 085773d74a96791d2a7ff7072175b4273eee9183..5fb93e9030fc8d4ba9cb7323a47a92e9e39dd8a1 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "global/global_context.h"
 #include "common/config.h"
+#include "common/compiler_extensions.h"
 #include "common/likely.h"
 #include "common/Clock.h"
 #include "log/Log.h"
@@ -78,7 +79,8 @@ struct is_dynamic<dynamic_marker_t<T>> : public std::true_type {};
     }                                                                  \
   }(cct);                                                              \
                                                                        \
-  if (should_gather) {                                                 \
+  if (unlikely(should_gather)) {                                       \
+    [&]() HINT_NO_INLINE HINT_COLD_CODE {                              \
     static size_t _log_exp_length = 80;                                \
     ceph::logging::Entry *_dout_e =                                    \
       cct->_log->create_entry(v, sub, &_log_exp_length);               \
@@ -108,7 +110,8 @@ struct is_dynamic<dynamic_marker_t<T>> : public std::true_type {};
 // /usr/include/assert.h clobbers our fancier version.
 #define dendl_impl std::flush;                         \
   _ASSERT_H->_log->submit_entry(_dout_e);              \
-    }                                          \
+    }();                                               \
+    }                                                  \
   } while (0)
 
 #define dendl dendl_impl
index e8146a3f69eb0884388e4e857a847276c3dd7fa5..f3696bfb026fd9376079cdecd1cc6c9008730bba 100644 (file)
@@ -18,7 +18,7 @@
 /*
  * Likely / Unlikely macros
  */
-#define likely(x)       __builtin_expect((x),1)
-#define unlikely(x)     __builtin_expect((x),0)
+#define likely(x)       __builtin_expect((const bool)(x),1)
+#define unlikely(x)     __builtin_expect((const bool)(x),0)
 
 #endif