Fix softirq raise dynamic expand
[lttv.git] / lttv / lttv / state.c
index e98275e8cdf4a488ab198830883c7dc62fa8a04d..fffd95f08bb81d7783e45cc75014ff257c108c8c 100644 (file)
@@ -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");
This page took 0.025003 seconds and 4 git commands to generate.