Performance: implement lttng_inline_memcpy
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 25 Sep 2016 16:27:01 +0000 (12:27 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 25 Sep 2016 16:27:01 +0000 (12:27 -0400)
Because all length parameters received for serializing data coming from
applications go through a callback, they are never constant, and it
hurts performance to perform a call to memcpy each time.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
lib/ringbuffer/backend_internal.h

index e03d8c0b1b23a1363fdebbe5ed8589223226983c..cb39ff69fe21fe6bc25fcd9df45e39515a537f71 100644 (file)
@@ -478,6 +478,28 @@ int update_read_sb_index(const struct lib_ring_buffer_config *config,
        return 0;
 }
 
+static inline __attribute__((always_inline))
+void lttng_inline_memcpy(void *dest, const void __user *src,
+               unsigned long len)
+{
+       switch (len) {
+       case 1:
+               *(uint8_t *) dest = *(const uint8_t *) src;
+               break;
+       case 2:
+               *(uint16_t *) dest = *(const uint16_t *) src;
+               break;
+       case 4:
+               *(uint32_t *) dest = *(const uint32_t *) src;
+               break;
+       case 8:
+               *(uint64_t *) dest = *(const uint64_t *) src;
+               break;
+       default:
+               inline_memcpy(dest, src, len);
+       }
+}
+
 /*
  * Use the architecture-specific memcpy implementation for constant-sized
  * inputs, but rely on an inline memcpy for length statically unknown.
@@ -489,7 +511,7 @@ do {                                                                \
        if (__builtin_constant_p(len))                          \
                memcpy(dest, src, __len);                       \
        else                                                    \
-               inline_memcpy(dest, src, __len);                \
+               lttng_inline_memcpy(dest, src, __len);          \
 } while (0)
 
 /*
This page took 0.025731 seconds and 4 git commands to generate.