summaryrefslogtreecommitdiffstats
path: root/vppinfra/vppinfra/unix-kelog.c
diff options
context:
space:
mode:
Diffstat (limited to 'vppinfra/vppinfra/unix-kelog.c')
-rw-r--r--vppinfra/vppinfra/unix-kelog.c189
1 files changed, 102 insertions, 87 deletions
diff --git a/vppinfra/vppinfra/unix-kelog.c b/vppinfra/vppinfra/unix-kelog.c
index 21ac9921083..88428ee8f2e 100644
--- a/vppinfra/vppinfra/unix-kelog.c
+++ b/vppinfra/vppinfra/unix-kelog.c
@@ -26,12 +26,12 @@
#include <time.h>
typedef enum
- {
- RUNNING = 0,
- WAKEUP,
- } sched_event_type_t;
+{
+ RUNNING = 0,
+ WAKEUP,
+} sched_event_type_t;
-typedef struct
+typedef struct
{
u32 cpu;
u8 *task;
@@ -40,7 +40,8 @@ typedef struct
sched_event_type_t type;
} sched_event_t;
-void kelog_init (elog_main_t * em, char * kernel_tracer, u32 n_events)
+void
+kelog_init (elog_main_t * em, char *kernel_tracer, u32 n_events)
{
int enable_fd, current_tracer_fd, data_fd;
int len;
@@ -54,7 +55,7 @@ void kelog_init (elog_main_t * em, char * kernel_tracer, u32 n_events)
ASSERT (kernel_tracer);
/*$$$$ fixme */
- n_events = 1<<18;
+ n_events = 1 << 18;
/* init first so we won't hurt ourselves if we bail */
elog_init (em, n_events);
@@ -66,24 +67,24 @@ void kelog_init (elog_main_t * em, char * kernel_tracer, u32 n_events)
return;
}
/* disable kernel tracing */
- if (write (enable_fd, "0\n", 2) != 2)
+ if (write (enable_fd, "0\n", 2) != 2)
{
clib_unix_warning ("disable tracing");
- close(enable_fd);
+ close (enable_fd);
return;
}
-
- /*
+
+ /*
* open + clear the data buffer.
* see .../linux/kernel/trace/trace.c:tracing_open()
*/
data_fd = open (trace_data, O_RDWR | O_TRUNC);
- if (data_fd < 0)
+ if (data_fd < 0)
{
clib_warning ("Couldn't open+clear %s", trace_data);
return;
}
- close(data_fd);
+ close (data_fd);
/* configure tracing */
current_tracer_fd = open (current_tracer, O_RDWR);
@@ -91,23 +92,23 @@ void kelog_init (elog_main_t * em, char * kernel_tracer, u32 n_events)
if (current_tracer_fd < 0)
{
clib_warning ("Couldn't open %s", current_tracer);
- close(enable_fd);
+ close (enable_fd);
return;
}
- len = strlen(kernel_tracer);
+ len = strlen (kernel_tracer);
- if (write (current_tracer_fd, kernel_tracer, len) != len)
+ if (write (current_tracer_fd, kernel_tracer, len) != len)
{
clib_unix_warning ("configure trace");
- close(current_tracer_fd);
- close(enable_fd);
+ close (current_tracer_fd);
+ close (enable_fd);
return;
}
-
- close(current_tracer_fd);
- /*
+ close (current_tracer_fd);
+
+ /*
* The kernel event log uses CLOCK_MONOTONIC timestamps,
* not CLOCK_REALTIME timestamps. These differ by a constant
* but the constant is not available in user mode.
@@ -116,33 +117,35 @@ void kelog_init (elog_main_t * em, char * kernel_tracer, u32 n_events)
clib_time_init (&em->cpu_timer);
em->init_time.cpu = em->cpu_timer.init_cpu_time;
syscall (SYS_clock_gettime, CLOCK_MONOTONIC, &ts);
-
+
/* enable kernel tracing */
- if (write (enable_fd, "1\n", 2) != 2)
+ if (write (enable_fd, "1\n", 2) != 2)
{
clib_unix_warning ("enable tracing");
- close(enable_fd);
+ close (enable_fd);
return;
}
- close(enable_fd);
+ close (enable_fd);
}
-u8 *format_sched_event (u8 * s, va_list * va)
+u8 *
+format_sched_event (u8 * s, va_list * va)
{
sched_event_t *e = va_arg (*va, sched_event_t *);
s = format (s, "cpu %d task %10s type %s timestamp %12.6f\n",
- e->cpu, e->task, e->type ? "WAKEUP " : "RUNNING", e->timestamp);
+ e->cpu, e->task, e->type ? "WAKEUP " : "RUNNING", e->timestamp);
return s;
}
-sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
+sched_event_t *
+parse_sched_switch_trace (u8 * tdata, u32 * index)
{
u8 *cp = tdata + *index;
- u8 *limit = tdata + vec_len(tdata);
+ u8 *limit = tdata + vec_len (tdata);
int colons;
static sched_event_t event;
sched_event_t *e = &event;
@@ -150,23 +153,23 @@ sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
u32 secs, usecs;
int i;
- again:
+again:
/* eat leading w/s */
while (cp < limit && (*cp == ' ' && *cp == '\t'))
cp++;
if (cp == limit)
return 0;
-
+
/* header line */
if (*cp == '#')
{
while (cp < limit && (*cp != '\n'))
- cp++;
+ cp++;
if (*cp == '\n')
- {
- cp++;
- goto again;
- }
+ {
+ cp++;
+ goto again;
+ }
clib_warning ("bugger 0");
return 0;
}
@@ -182,7 +185,7 @@ sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
clib_warning ("bugger 0.1");
return 0;
}
-
+
cp++;
while (cp < limit && (*cp == ' ' && *cp == '\t'))
cp++;
@@ -191,8 +194,8 @@ sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
clib_warning ("bugger 0.2");
return 0;
}
-
- secs = atoi(cp);
+
+ secs = atoi (cp);
while (cp < limit && (*cp != '.'))
cp++;
@@ -202,18 +205,18 @@ sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
clib_warning ("bugger 0.3");
return 0;
}
-
+
cp++;
usecs = atoi (cp);
- e->timestamp = ((f64)secs) + ((f64)usecs)*1e-6;
-
+ e->timestamp = ((f64) secs) + ((f64) usecs) * 1e-6;
+
/* eat up to third colon */
for (i = 0; i < 3; i++)
{
while (cp < limit && *cp != ':')
- cp++;
+ cp++;
cp++;
}
--cp;
@@ -240,16 +243,16 @@ sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
}
cp += 3;
- if (cp >= limit)
+ if (cp >= limit)
{
clib_warning ("bugger 4");
return 0;
}
-
+
e->cpu = atoi (cp);
cp += 4;
-
- if (cp >= limit)
+
+ if (cp >= limit)
{
clib_warning ("bugger 4");
return 0;
@@ -258,11 +261,11 @@ sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
cp++;
e->pid = atoi (cp);
-
+
for (i = 0; i < 2; i++)
{
while (cp < limit && *cp != ':')
- cp++;
+ cp++;
cp++;
}
--cp;
@@ -273,35 +276,36 @@ sched_event_t *parse_sched_switch_trace (u8 *tdata, u32 *index)
}
cp += 3;
- if (cp >= limit)
+ if (cp >= limit)
{
clib_warning ("bugger 6");
return 0;
}
while (cp < limit && (*cp != ' ' && *cp != '\n'))
{
- vec_add1(task_name, *cp);
+ vec_add1 (task_name, *cp);
cp++;
}
- vec_add1(task_name, 0);
+ vec_add1 (task_name, 0);
/* _vec_len() = 0 in caller */
e->task = task_name;
if (cp < limit)
- cp++;
+ cp++;
*index = cp - tdata;
return e;
}
-static u32 elog_id_for_pid (elog_main_t *em, u8 *name, u32 pid)
+static u32
+elog_id_for_pid (elog_main_t * em, u8 * name, u32 pid)
{
- uword * p, r;
- mhash_t * h = &em->string_table_hash;
+ uword *p, r;
+ mhash_t *h = &em->string_table_hash;
- if (! em->string_table_hash.hash)
+ if (!em->string_table_hash.hash)
mhash_init (h, sizeof (uword), sizeof (pid));
-
+
p = mhash_get (h, &pid);
if (p)
return p[0];
@@ -310,7 +314,8 @@ static u32 elog_id_for_pid (elog_main_t *em, u8 *name, u32 pid)
return r;
}
-void kelog_collect_sched_switch_trace (elog_main_t *em)
+void
+kelog_collect_sched_switch_trace (elog_main_t * em)
{
int enable_fd, data_fd;
char *trace_enable = "/debug/tracing/tracing_enabled";
@@ -323,7 +328,7 @@ void kelog_collect_sched_switch_trace (elog_main_t *em)
u64 nsec_to_add;
u32 index;
f64 clocks_per_sec;
-
+
enable_fd = open (trace_enable, O_RDWR);
if (enable_fd < 0)
{
@@ -331,13 +336,13 @@ void kelog_collect_sched_switch_trace (elog_main_t *em)
return;
}
/* disable kernel tracing */
- if (write (enable_fd, "0\n", 2) != 2)
+ if (write (enable_fd, "0\n", 2) != 2)
{
clib_unix_warning ("disable tracing");
- close(enable_fd);
+ close (enable_fd);
return;
}
- close(enable_fd);
+ close (enable_fd);
/* Read the trace data */
data_fd = open (trace_data, O_RDWR);
@@ -347,7 +352,7 @@ void kelog_collect_sched_switch_trace (elog_main_t *em)
return;
}
- /*
+ /*
* Extract trace into a vector. Note that seq_printf() [kernel]
* is not guaranteed to produce 4096 bytes at a time.
*/
@@ -356,17 +361,17 @@ void kelog_collect_sched_switch_trace (elog_main_t *em)
pos = 0;
while (1)
{
- bytes = read(data_fd, data+pos, 4096);
- if (bytes <= 0)
- break;
+ bytes = read (data_fd, data + pos, 4096);
+ if (bytes <= 0)
+ break;
total_bytes += bytes;
- _vec_len(data) = total_bytes;
+ _vec_len (data) = total_bytes;
- pos = vec_len(data);
- vec_validate(data, vec_len(data)+4095);
+ pos = vec_len (data);
+ vec_validate (data, vec_len (data) + 4095);
}
- vec_add1(data, 0);
+ vec_add1 (data, 0);
/* Synthesize events */
em->is_enabled = 1;
@@ -378,23 +383,33 @@ void kelog_collect_sched_switch_trace (elog_main_t *em)
fake_cpu_clock = evt->timestamp * em->cpu_timer.clocks_per_second;
{
- ELOG_TYPE_DECLARE (e) =
- {
- .format = "%d: %s %s",
- .format_args = "i4T4t4",
- .n_enum_strings = 2,
- .enum_strings = { "running", "wakeup", },
- };
- struct { u32 cpu, string_table_offset, which; } * ed;
-
- ed = elog_event_data_not_inline (em, &__ELOG_TYPE_VAR(e),
- &em->default_track,
- fake_cpu_clock);
- ed->cpu = evt->cpu;
- ed->string_table_offset = elog_id_for_pid (em, evt->task, evt->pid);
- ed->which = evt->type;
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "%d: %s %s",.format_args = "i4T4t4",.n_enum_strings =
+ 2,.enum_strings =
+ {
+ "running", "wakeup",}
+ ,};
+ struct
+ {
+ u32 cpu, string_table_offset, which;
+ } *ed;
+
+ ed = elog_event_data_not_inline (em, &__ELOG_TYPE_VAR (e),
+ &em->default_track, fake_cpu_clock);
+ ed->cpu = evt->cpu;
+ ed->string_table_offset = elog_id_for_pid (em, evt->task, evt->pid);
+ ed->which = evt->type;
}
- _vec_len(evt->task) = 0;
+ _vec_len (evt->task) = 0;
}
em->is_enabled = 0;
}
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */