X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fstate.c;h=fffd95f08bb81d7783e45cc75014ff257c108c8c;hb=df6c9904b5af57377091f60b1e5cc6e61792d80b;hp=e98275e8cdf4a488ab198830883c7dc62fa8a04d;hpb=bdddf3f5bfa75ca47e494b7510fda7cefbb6e093;p=lttv.git diff --git a/lttv/lttv/state.c b/lttv/lttv/state.c index e98275e8..fffd95f0 100644 --- a/lttv/lttv/state.c +++ b/lttv/lttv/state.c @@ -143,8 +143,11 @@ GQuark LttvExecutionMode LTTV_STATE_MODE_UNKNOWN, LTTV_STATE_USER_MODE, + LTTV_STATE_MAYBE_USER_MODE, LTTV_STATE_SYSCALL, + LTTV_STATE_MAYBE_SYSCALL, LTTV_STATE_TRAP, + LTTV_STATE_MAYBE_TRAP, LTTV_STATE_IRQ, LTTV_STATE_SOFT_IRQ; @@ -2017,9 +2020,9 @@ static void create_name_tables(LttvTraceState *tcs) // } // } - name_tables->nb_syscalls = 256; - name_tables->syscall_names = g_new(GQuark, 256); - for(i = 0 ; i < 256 ; i++) { + name_tables->nb_syscalls = PREALLOC_NB_SYSCALLS; + name_tables->syscall_names = g_new(GQuark, name_tables->nb_syscalls); + for(i = 0 ; i < name_tables->nb_syscalls; i++) { g_string_printf(fe_name, "syscall %d", i); name_tables->syscall_names[i] = g_quark_from_string(fe_name->str); } @@ -2051,9 +2054,9 @@ static void create_name_tables(LttvTraceState *tcs) // ltt_enum_string_get(t, i)); // } - name_tables->nb_traps = 256; - name_tables->trap_names = g_new(GQuark, 256); - for(i = 0 ; i < 256 ; i++) { + name_tables->nb_traps = PREALLOC_NB_TRAPS; + name_tables->trap_names = g_new(GQuark, name_tables->nb_traps); + for(i = 0 ; i < name_tables->nb_traps; i++) { g_string_printf(fe_name, "trap %d", i); name_tables->trap_names[i] = g_quark_from_string(fe_name->str); } @@ -2076,11 +2079,10 @@ static void create_name_tables(LttvTraceState *tcs) } */ /* FIXME: LttvIRQState *irq_states should become a g_array */ - /* temp fix: increase from 256 to 512 default size */ - name_tables->nb_irqs = 512; - name_tables->irq_names = g_new(GQuark, 512); - for(i = 0 ; i < 512 ; i++) { + name_tables->nb_irqs = PREALLOC_NB_IRQS; + name_tables->irq_names = g_new(GQuark, name_tables->nb_irqs); + for(i = 0 ; i < name_tables->nb_irqs; i++) { g_string_printf(fe_name, "irq %d", i); name_tables->irq_names[i] = g_quark_from_string(fe_name->str); } @@ -2096,8 +2098,7 @@ static void create_name_tables(LttvTraceState *tcs) } */ - /* the kernel is limited to 32 statically defined softirqs */ - name_tables->nb_soft_irqs = 32; + name_tables->nb_soft_irqs = PREALLOC_NB_SOFT_IRQS; name_tables->soft_irq_names = g_new(GQuark, name_tables->nb_soft_irqs); for(i = 0 ; i < name_tables->nb_soft_irqs ; i++) { g_string_printf(fe_name, "softirq %d", i); @@ -2695,20 +2696,12 @@ static gboolean soft_irq_raise(void *hook_data, void *call_data) LttvTraceHook *th = (LttvTraceHook *)hook_data; struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvNameTables *nt = ((LttvTraceState *)(s->parent.t_context))->name_tables; - LttvExecutionSubmode submode; guint64 softirq = ltt_event_get_long_unsigned(e, f); - guint64 nb_softirqs = nt->nb_soft_irqs; - if(softirq < nb_softirqs) { - submode = nt->soft_irq_names[softirq]; - } else { - /* Fixup an incomplete irq table */ - GString *string = g_string_new(""); - g_string_printf(string, "softirq %" PRIu64, softirq); - submode = g_quark_from_string(string->str); - g_string_free(string, TRUE); - } + expand_soft_irq_table(ts, softirq); + + submode = nt->soft_irq_names[softirq]; /* update softirq status */ /* a soft irq raises are not cumulative */ @@ -3016,8 +3009,11 @@ static gboolean schedchange(void *hook_data, void *call_data) if(process->pid == 0 && process->state->t == LTTV_STATE_MODE_UNKNOWN) { if(pid_out == 0) { - /* Scheduling out of pid 0 at beginning of the trace : - * we know for sure it is in syscall mode at this point. */ + /* + * Scheduling out of pid 0 at beginning of the trace. + * We are typically in system call mode at this point although + * (FIXME) we might be in a trap handler. + */ g_assert(process->execution_stack->len == 1); process->state->t = LTTV_STATE_SYSCALL; process->state->s = LTTV_STATE_WAIT; @@ -3363,7 +3359,7 @@ static void fix_process(gpointer key, gpointer value, gpointer user_data) if(process->type == LTTV_STATE_KERNEL_THREAD) { es = &g_array_index(process->execution_stack, LttvExecutionState, 0); - if(es->t == LTTV_STATE_MODE_UNKNOWN) { + if(es->t == LTTV_STATE_MAYBE_SYSCALL) { es->t = LTTV_STATE_SYSCALL; es->n = LTTV_STATE_SUBMODE_NONE; es->entry = *timestamp; @@ -3374,7 +3370,7 @@ static void fix_process(gpointer key, gpointer value, gpointer user_data) } } else { es = &g_array_index(process->execution_stack, LttvExecutionState, 0); - if(es->t == LTTV_STATE_MODE_UNKNOWN) { + if(es->t == LTTV_STATE_MAYBE_USER_MODE) { es->t = LTTV_STATE_USER_MODE; es->n = LTTV_STATE_SUBMODE_NONE; es->entry = *timestamp; @@ -3520,14 +3516,11 @@ static gboolean enum_process_state(void *hook_data, void *call_data) es = process->state = &g_array_index(process->execution_stack, LttvExecutionState, 0); process->type = LTTV_STATE_KERNEL_THREAD; - es->t = LTTV_STATE_MODE_UNKNOWN; + es->t = LTTV_STATE_MAYBE_SYSCALL; es->s = LTTV_STATE_UNNAMED; es->n = LTTV_STATE_SUBMODE_UNKNOWN; -#if 0 - es->t = LTTV_STATE_SYSCALL; - es->s = status; - es->n = submode; -#endif //0 + //es->s = status; + //es->n = submode; } else { /* User space process : * bottom : user mode @@ -3545,14 +3538,11 @@ static gboolean enum_process_state(void *hook_data, void *call_data) process->execution_stack = g_array_set_size(process->execution_stack, 1); es = process->state = &g_array_index(process->execution_stack, LttvExecutionState, 0); - es->t = LTTV_STATE_MODE_UNKNOWN; + es->t = LTTV_STATE_MAYBE_USER_MODE; es->s = LTTV_STATE_UNNAMED; es->n = LTTV_STATE_SUBMODE_UNKNOWN; - #if 0 - es->t = LTTV_STATE_USER_MODE; - es->s = status; - es->n = submode; - #endif //0 + //es->s = status; + //es->n = submode; } #if 0 /* UNKNOWN STATE */ @@ -4436,8 +4426,11 @@ static void module_init() LTTV_STATE_UNBRANDED = g_quark_from_string(""); LTTV_STATE_MODE_UNKNOWN = g_quark_from_string("MODE_UNKNOWN"); LTTV_STATE_USER_MODE = g_quark_from_string("USER_MODE"); + LTTV_STATE_MAYBE_USER_MODE = g_quark_from_string("MAYBE_USER_MODE"); LTTV_STATE_SYSCALL = g_quark_from_string("SYSCALL"); + LTTV_STATE_MAYBE_SYSCALL = g_quark_from_string("MAYBE_SYSCALL"); LTTV_STATE_TRAP = g_quark_from_string("TRAP"); + LTTV_STATE_MAYBE_TRAP = g_quark_from_string("MAYBE_TRAP"); LTTV_STATE_IRQ = g_quark_from_string("IRQ"); LTTV_STATE_SOFT_IRQ = g_quark_from_string("SOFTIRQ"); LTTV_STATE_SUBMODE_UNKNOWN = g_quark_from_string("UNKNOWN");