]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - latester/latester.c
Add ftrace support
[can-benchmark.git] / latester / latester.c
index cb578a11ed716ad591198df47fe7b1acb27199fb..9f0a46654f00ba98ed1ee007ecd07520e6315571 100644 (file)
@@ -35,6 +35,8 @@
 
 #include "histogram.h"
 
+//#define FTRACE
+
 #ifndef DEBUG
 #define dbg(level, fmt, arg...) do {} while (0)
 #else
@@ -60,6 +62,7 @@ struct options {
        FILE *file;
        FILE *histogram;
        int length;
+       int userhist;
 };
 
 struct options opt = {
@@ -228,9 +231,15 @@ static inline unsigned get_msg_latency_us(struct msg_info *mi)
 {
        struct timespec diff;
        if (num_interfaces == 3)
-               timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_rx_onwire_kern);
+               if (opt.userhist)
+                       timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_rx_onwire_kern);
+               else
+                       timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_rx_onwire);
        else
-               timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_sent);
+               if (opt.userhist)
+                       timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_sent);
+               else
+                       timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_sent);
        return diff.tv_sec * 1000000 + diff.tv_nsec/1000;
 }
 
@@ -268,7 +277,43 @@ static inline int sock_get_if_index(int s, const char *if_name)
 
 static inline get_tstamp(struct timespec *ts)
 {
-       clock_gettime(CLOCK_MONOTONIC, ts);
+       clock_gettime(CLOCK_REALTIME, ts);
+}
+
+
+int trace_fd = -1;
+int marker_fd = -1;
+
+int init_ftrace()
+{
+#ifdef FTRACE
+       char *debugfs;
+       char path[256];
+       FILE *f;
+       
+       debugfs = "/sys/kernel/debug";
+       if (debugfs) {
+               strcpy(path, debugfs);
+               strcat(path,"/tracing/tracing_on");
+               trace_fd = open(path, O_WRONLY);
+               if (trace_fd >= 0)
+                       write(trace_fd, "1", 1);
+
+               strcpy(path, debugfs);
+               strcat(path,"/tracing/trace_marker");
+               marker_fd = open(path, O_WRONLY);
+
+               strcpy(path, debugfs);
+               strcat(path,"/tracing/set_ftrace_pid");
+               f = fopen(path, "w");
+               fprintf(f, "%d\n", getpid());
+               fclose(f);
+               system("echo function_graph > /sys/kernel/debug/tracing/current_tracer");
+               system("echo can_send > /sys/kernel/debug/tracing/set_graph_function");
+               system("echo > /sys/kernel/debug/tracing/trace");
+               system("echo 1 > /sys/kernel/debug/tracing/tracing_enabled");
+       }
+#endif /* FTRACE */
 }
 
 int send_frame(int socket)
@@ -304,7 +349,17 @@ int send_frame(int socket)
        mi->length = frame.can_dlc;
        get_tstamp(&mi->ts_sent);
        mi->sent = frame;
+       
+       if (trace_fd >= 0)
+               write(trace_fd, "1", 1);
        ret = write(socket, &frame, sizeof(frame));
+       if (marker_fd >= 0) {
+               char marker[100];
+               sprintf(marker, "write returned %d\n", ret);
+               write(marker_fd, marker, strlen(marker));
+       }
+       if (trace_fd >= 0)
+               write(trace_fd, "0", 1);
        return ret;
 }
 
@@ -546,6 +601,7 @@ struct poptOption optionsTable[] = {
        { "file",   'f', POPT_ARG_STRING,                         NULL, 'f',         "File where to store results", "filename"},
        { "histogram", 'h', POPT_ARG_STRING,                      NULL, 'h',         "Store histogram in file", "filename"},
        { "length", 'l', POPT_ARG_INT|POPT_ARGFLAG_SHOW_DEFAULT,  &opt.length, 0,    "The length of generated messages", "bytes"},
+       { "userhist", 'u', POPT_ARG_NONE,                         &opt.userhist, 0,  "Generate histogram from userspace timestamps"},
        POPT_AUTOHELP
        { NULL, 0, 0, NULL, 0 }
 };
@@ -619,6 +675,8 @@ int main(int argc, const char *argv[])
        ret = fcntl(completion_pipe[1], F_SETFL, O_NONBLOCK);
        if (ret == -1)
                error(1, errno, "pipe fcntl");
+
+       init_ftrace();
        
        pthread_create(&thread, 0, measure_thread, NULL);