]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[profile] Provide methods for profiling individual stages of operations
authorMichael Brown <mcb30@ipxe.org>
Sat, 3 May 2014 17:25:19 +0000 (18:25 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sat, 3 May 2014 17:50:26 +0000 (18:50 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/transitions/librm_test.c
src/include/ipxe/profile.h

index 76ed1f7e8ff2527174bac589250e71c5278a5c7e..8f5be42293d2be9b209c9f90a6ae3621d603da64 100644 (file)
@@ -51,7 +51,8 @@ static struct profiler r2p_profiler __profiler = { .name = "r2p" };
  */
 static void librm_test_exec ( void ) {
        unsigned int i;
-       unsigned long p2r_elapsed;
+       unsigned long timestamp;
+       unsigned int discard_d;
 
        /* Profile mode transitions.  We want to profile each
         * direction of the transition separately, so perform an RDTSC
@@ -61,10 +62,11 @@ static void librm_test_exec ( void ) {
        for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
                profile_start ( &p2r_profiler );
                __asm__ __volatile__ ( REAL_CODE ( "rdtsc\n\t" )
-                                      : "=A" ( r2p_profiler.started ) : );
+                                      : "=a" ( timestamp ), "=d" ( discard_d )
+                                      : );
+               profile_start_at ( &r2p_profiler, timestamp );
                profile_stop ( &r2p_profiler );
-               p2r_elapsed = ( r2p_profiler.started - p2r_profiler.started );
-               profile_update ( &p2r_profiler, p2r_elapsed );
+               profile_stop_at ( &p2r_profiler, timestamp );
        }
 }
 
index 0b15fe5450ed4ae92bb15fa56de0e35dca6d68ba..d4fc4f90f3bec3e0e11d413c41d98d73c5bf68c8 100644 (file)
@@ -9,7 +9,6 @@
 
 FILE_LICENCE ( GPL2_OR_LATER );
 
-#include <stdint.h>
 #include <bits/profile.h>
 #include <ipxe/tables.h>
 
@@ -26,7 +25,9 @@ struct profiler {
        /** Name */
        const char *name;
        /** Start timestamp */
-       uint64_t started;
+       unsigned long started;
+       /** Stop timestamp */
+       unsigned long stopped;
        /** Number of samples */
        unsigned int count;
        /** Mean sample value (scaled) */
@@ -62,6 +63,20 @@ extern unsigned long profile_mean ( struct profiler *profiler );
 extern unsigned long profile_variance ( struct profiler *profiler );
 extern unsigned long profile_stddev ( struct profiler *profiler );
 
+/**
+ * Start profiling
+ *
+ * @v profiler         Profiler
+ * @v started          Start timestamp
+ */
+static inline __attribute__ (( always_inline )) void
+profile_start_at ( struct profiler *profiler, unsigned long started ) {
+
+       /* If profiling is active then record start timestamp */
+       if ( PROFILING )
+               profiler->started = started;
+}
+
 /**
  * Start profiling
  *
@@ -72,23 +87,36 @@ profile_start ( struct profiler *profiler ) {
 
        /* If profiling is active then record start timestamp */
        if ( PROFILING )
-               profiler->started = profile_timestamp();
+               profile_start_at ( profiler, profile_timestamp() );
 }
 
 /**
  * Record profiling result
  *
  * @v profiler         Profiler
+ * @v stopped          Stop timestamp
  */
 static inline __attribute__ (( always_inline )) void
-profile_stop ( struct profiler *profiler ) {
-       uint64_t ended;
+profile_stop_at ( struct profiler *profiler, unsigned long stopped ) {
 
        /* If profiling is active then record end timestamp and update stats */
        if ( PROFILING ) {
-               ended = profile_timestamp();
-               profile_update ( profiler, ( ended - profiler->started ) );
+               profiler->stopped = stopped;
+               profile_update ( profiler, ( stopped - profiler->started ) );
        }
 }
 
+/**
+ * Record profiling result
+ *
+ * @v profiler         Profiler
+ */
+static inline __attribute__ (( always_inline )) void
+profile_stop ( struct profiler *profiler ) {
+
+       /* If profiling is active then record end timestamp and update stats */
+       if ( PROFILING )
+               profile_stop_at ( profiler, profile_timestamp() );
+}
+
 #endif /* _IPXE_PROFILE_H */