X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=trunk%2Flttv%2Flttv%2Flttv%2Fstate.c;h=3574868ad254fb3cba1c3379c882caa0e3c1162b;hb=4858a3ed6e270481195fedffbd94225292a61224;hp=2105cb769032c5161c513fca1f0dc635611f0f24;hpb=cc731880f3e5c8a4b34a22c69b3843a6221c1826;p=lttv.git diff --git a/trunk/lttv/lttv/lttv/state.c b/trunk/lttv/lttv/lttv/state.c index 2105cb76..3574868a 100644 --- a/trunk/lttv/lttv/lttv/state.c +++ b/trunk/lttv/lttv/lttv/state.c @@ -32,6 +32,7 @@ #include #include #include +#include /* Comment : * Mathieu Desnoyers @@ -45,22 +46,34 @@ #define PREALLOCATED_EXECUTION_STACK 10 -/* Facilities Quarks */ +/* Channel Quarks */ GQuark - LTT_FACILITY_KERNEL, - LTT_FACILITY_KERNEL_ARCH, - LTT_FACILITY_LIST, - LTT_FACILITY_FS, - LTT_FACILITY_USER_GENERIC, - LTT_FACILITY_BLOCK, - LTT_FACILITY_STATEDUMP; + LTT_CHANNEL_FD_STATE, + LTT_CHANNEL_GLOBAL_STATE, + LTT_CHANNEL_IRQ_STATE, + LTT_CHANNEL_MODULE_STATE, + LTT_CHANNEL_NETIF_STATE, + LTT_CHANNEL_SOFTIRQ_STATE, + LTT_CHANNEL_SWAP_STATE, + LTT_CHANNEL_SYSCALL_STATE, + LTT_CHANNEL_TASK_STATE, + LTT_CHANNEL_VM_STATE, + LTT_CHANNEL_FS, + LTT_CHANNEL_KERNEL, + LTT_CHANNEL_MM, + LTT_CHANNEL_USERSPACE, + LTT_CHANNEL_BLOCK; /* Events Quarks */ GQuark LTT_EVENT_SYSCALL_ENTRY, LTT_EVENT_SYSCALL_EXIT, + LTT_EVENT_PAGE_FAULT_NOSEM_ENTRY, + LTT_EVENT_PAGE_FAULT_NOSEM_EXIT, + LTT_EVENT_PAGE_FAULT_ENTRY, + LTT_EVENT_PAGE_FAULT_EXIT, LTT_EVENT_TRAP_ENTRY, LTT_EVENT_TRAP_EXIT, LTT_EVENT_IRQ_ENTRY, @@ -83,7 +96,8 @@ GQuark LTT_EVENT_REQUEST_COMPLETE, LTT_EVENT_LIST_INTERRUPT, LTT_EVENT_SYS_CALL_TABLE, - LTT_EVENT_SOFTIRQ_VEC; + LTT_EVENT_SOFTIRQ_VEC, + LTT_EVENT_KPROBE_TABLE; /* Fields Quarks */ @@ -114,7 +128,8 @@ GQuark LTT_FIELD_ACTION, LTT_FIELD_ID, LTT_FIELD_ADDRESS, - LTT_FIELD_SYMBOL; + LTT_FIELD_SYMBOL, + LTT_FIELD_IP; LttvExecutionMode LTTV_STATE_MODE_UNKNOWN, @@ -638,12 +653,12 @@ init(LttvTracesetState *self, LttvTraceset *ts) /* It's a Usertrace */ guint tid = ltt_tracefile_tid(tfcs->parent.tf); GTree *usertrace_tree = (GTree*)g_hash_table_lookup(tcs->usertraces, - (gconstpointer)tid); + GUINT_TO_POINTER(tid)); if(!usertrace_tree) { usertrace_tree = g_tree_new_full(compare_usertraces, NULL, free_usertrace_key, NULL); g_hash_table_insert(tcs->usertraces, - (gpointer)tid, usertrace_tree); + GUINT_TO_POINTER(tid), usertrace_tree); } LttTime *timestamp = g_new(LttTime, 1); *timestamp = ltt_interpolate_time_from_tsc(tfcs->parent.tf, @@ -753,7 +768,7 @@ static void write_process_state(gpointer key, gpointer value, for(i = 0 ; i < process->user_stack->len; i++) { address = g_array_index(process->user_stack, guint64, i); - fprintf(fp, " \n", + fprintf(fp, " \n", address); } @@ -807,7 +822,7 @@ void lttv_state_write(LttvTraceState *self, LttTime t, FILE *fp) else { ltt_event_position(e, ep); ltt_event_position_get(ep, &tf, &nb_block, &offset, &tsc); - fprintf(fp, " BLOCK=%u OFFSET=%u TSC=%llu/>\n", nb_block, offset, + fprintf(fp, " BLOCK=%u OFFSET=%u TSC=%" PRIu64 "/>\n", nb_block, offset, tsc); } } @@ -1528,7 +1543,7 @@ static void state_save(LttvTraceState *self, LttvAttribute *container) guint64 tsc; LttTracefile *tf; ltt_event_position_get(ep, &tf, &nb_block, &offset, &tsc); - g_info("Block %u offset %u tsc %llu time %lu.%lu", nb_block, offset, + g_info("Block %u offset %u tsc %" PRIu64 " time %lu.%lu", nb_block, offset, tsc, tfcs->parent.timestamp.tv_sec, tfcs->parent.timestamp.tv_nsec); } @@ -1876,7 +1891,7 @@ create_name_tables(LttvTraceState *tcs) hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 1); if(!lttv_trace_find_hook(tcs->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_SYSCALL_ENTRY, FIELD_ARRAY(LTT_FIELD_SYSCALL_ID), NULL, NULL, &hooks)) { @@ -1912,7 +1927,7 @@ create_name_tables(LttvTraceState *tcs) lttv_trace_hook_remove_all(&hooks); if(!lttv_trace_find_hook(tcs->parent.t, - LTT_FACILITY_KERNEL_ARCH, + LTT_CHANNEL_KERNEL, LTT_EVENT_TRAP_ENTRY, FIELD_ARRAY(LTT_FIELD_TRAP_ID), NULL, NULL, &hooks)) { @@ -1941,7 +1956,7 @@ create_name_tables(LttvTraceState *tcs) lttv_trace_hook_remove_all(&hooks); if(!lttv_trace_find_hook(tcs->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_IRQ_ENTRY, FIELD_ARRAY(LTT_FIELD_IRQ_ID), NULL, NULL, &hooks)) { @@ -2234,7 +2249,8 @@ static LttvTracefileState *ltt_state_usertrace_find(LttvTraceState *tcs, * timestamp the lowest, but higher or equal to "timestamp". */ res.time = timestamp; res.best = NULL; - GTree *usertrace_tree = g_hash_table_lookup(tcs->usertraces, (gpointer)pid); + GTree *usertrace_tree = g_hash_table_lookup(tcs->usertraces, + GUINT_TO_POINTER(pid)); if(usertrace_tree) { g_tree_search(usertrace_tree, search_usertrace, &res); if(res.best) @@ -2563,7 +2579,7 @@ static gboolean soft_irq_raise(void *hook_data, void *call_data) } else { /* Fixup an incomplete irq table */ GString *string = g_string_new(""); - g_string_printf(string, "softirq %llu", softirq); + g_string_printf(string, "softirq %" PRIu64, softirq); submode = g_quark_from_string(string->str); g_string_free(string, TRUE); } @@ -2700,7 +2716,7 @@ static void pop_function(LttvTracefileState *tfs, guint64 funcptr) if(process->current_function != funcptr){ g_info("Different functions (%lu.%09lu): ignore it\n", tfs->parent.timestamp.tv_sec, tfs->parent.timestamp.tv_nsec); - g_info("process state has %llu when pop_function is %llu\n", + g_info("process state has %" PRIu64 " when pop_function is %" PRIu64 "\n", process->current_function, funcptr); g_info("{ %u, %u, %s, %s, %s }\n", process->pid, @@ -2947,7 +2963,16 @@ static gboolean process_fork(void *hook_data, void *call_data) * * Simply put a correct parent. */ - g_error("Process %u has been created before fork on cpu %u. Probably an unsynchronized TSC problem on the traced machine.", child_pid, cpu); + g_error("Process %u has been created at [%lu.%09lu] " + "and inserted at [%lu.%09lu] before \n" + "fork on cpu %u[%lu.%09lu].\n" + "Probably an unsynchronized TSC problem on the traced machine.", + child_pid, + child_process->creation_time.tv_sec, + child_process->creation_time.tv_nsec, + child_process->insertion_time.tv_sec, + child_process->insertion_time.tv_nsec, + cpu, ltt_event_time(e).tv_sec, ltt_event_time(e).tv_nsec); //g_assert(0); /* This is a problematic case : the process has been created // before the fork event */ child_process->ppid = process->pid; @@ -3379,106 +3404,130 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) //hn = 0; lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_SYSCALL_ENTRY, FIELD_ARRAY(LTT_FIELD_SYSCALL_ID), syscall_entry, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_SYSCALL_EXIT, NULL, syscall_exit, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, + LTT_CHANNEL_KERNEL, LTT_EVENT_TRAP_ENTRY, FIELD_ARRAY(LTT_FIELD_TRAP_ID), trap_entry, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, + LTT_CHANNEL_KERNEL, LTT_EVENT_TRAP_EXIT, NULL, trap_exit, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, + LTT_EVENT_PAGE_FAULT_ENTRY, + FIELD_ARRAY(LTT_FIELD_TRAP_ID), + trap_entry, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_CHANNEL_KERNEL, + LTT_EVENT_PAGE_FAULT_EXIT, + NULL, + trap_exit, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_CHANNEL_KERNEL, + LTT_EVENT_PAGE_FAULT_NOSEM_ENTRY, + FIELD_ARRAY(LTT_FIELD_TRAP_ID), + trap_entry, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_CHANNEL_KERNEL, + LTT_EVENT_PAGE_FAULT_NOSEM_EXIT, + NULL, + trap_exit, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_CHANNEL_KERNEL, LTT_EVENT_IRQ_ENTRY, FIELD_ARRAY(LTT_FIELD_IRQ_ID), irq_entry, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_IRQ_EXIT, NULL, irq_exit, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_SOFT_IRQ_RAISE, FIELD_ARRAY(LTT_FIELD_SOFT_IRQ_ID), soft_irq_raise, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_SOFT_IRQ_ENTRY, FIELD_ARRAY(LTT_FIELD_SOFT_IRQ_ID), soft_irq_entry, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_SOFT_IRQ_EXIT, NULL, soft_irq_exit, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_SCHED_SCHEDULE, FIELD_ARRAY(LTT_FIELD_PREV_PID, LTT_FIELD_NEXT_PID, LTT_FIELD_PREV_STATE), schedchange, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_PROCESS_FORK, FIELD_ARRAY(LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, LTT_FIELD_CHILD_TGID), process_fork, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, + LTT_CHANNEL_KERNEL, LTT_EVENT_KTHREAD_CREATE, FIELD_ARRAY(LTT_FIELD_PID), process_kernel_thread, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_PROCESS_EXIT, FIELD_ARRAY(LTT_FIELD_PID), process_exit, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, + LTT_CHANNEL_KERNEL, LTT_EVENT_PROCESS_FREE, FIELD_ARRAY(LTT_FIELD_PID), process_free, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_FS, + LTT_CHANNEL_FS, LTT_EVENT_EXEC, FIELD_ARRAY(LTT_FIELD_FILENAME), process_exec, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_USER_GENERIC, + LTT_CHANNEL_USERSPACE, LTT_EVENT_THREAD_BRAND, FIELD_ARRAY(LTT_FIELD_NAME), thread_brand, NULL, &hooks); /* statedump-related hooks */ lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_LIST, + LTT_CHANNEL_TASK_STATE, LTT_EVENT_PROCESS_STATE, FIELD_ARRAY(LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME, LTT_FIELD_TYPE, LTT_FIELD_MODE, LTT_FIELD_SUBMODE, @@ -3486,49 +3535,49 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) enum_process_state, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_LIST, + LTT_CHANNEL_GLOBAL_STATE, LTT_EVENT_STATEDUMP_END, NULL, statedump_end, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_LIST, + LTT_CHANNEL_IRQ_STATE, LTT_EVENT_LIST_INTERRUPT, FIELD_ARRAY(LTT_FIELD_ACTION, LTT_FIELD_IRQ_ID), enum_interrupt, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_BLOCK, + LTT_CHANNEL_BLOCK, LTT_EVENT_REQUEST_ISSUE, FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION), bdev_request_issue, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_BLOCK, + LTT_CHANNEL_BLOCK, LTT_EVENT_REQUEST_COMPLETE, FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION), bdev_request_complete, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_USER_GENERIC, + LTT_CHANNEL_USERSPACE, LTT_EVENT_FUNCTION_ENTRY, FIELD_ARRAY(LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE), function_entry, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_USER_GENERIC, + LTT_CHANNEL_USERSPACE, LTT_EVENT_FUNCTION_EXIT, FIELD_ARRAY(LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE), function_exit, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_STATEDUMP, + LTT_CHANNEL_SYSCALL_STATE, LTT_EVENT_SYS_CALL_TABLE, FIELD_ARRAY(LTT_FIELD_ID, LTT_FIELD_ADDRESS, LTT_FIELD_SYMBOL), dump_syscall, NULL, &hooks); lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_STATEDUMP, + LTT_CHANNEL_SOFTIRQ_STATE, LTT_EVENT_SOFTIRQ_VEC, FIELD_ARRAY(LTT_FIELD_ID, LTT_FIELD_ADDRESS, LTT_FIELD_SYMBOL), dump_softirq, NULL, &hooks); @@ -3544,11 +3593,12 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) for(k = 0 ; k < hooks->len ; k++) { th = &g_array_index(hooks, LttvTraceHook, k); - lttv_hooks_add( - lttv_hooks_by_id_find(tfs->parent.event_by_id, th->id), - th->h, - th, - LTTV_PRIO_STATE); + if (th->mdata == tfs->parent.tf->mdata) + lttv_hooks_add( + lttv_hooks_by_id_find(tfs->parent.event_by_id, th->id), + th->h, + th, + LTTV_PRIO_STATE); } } lttv_attribute_find(ts->parent.a, LTTV_STATE_HOOKS, LTTV_POINTER, &val); @@ -3599,6 +3649,7 @@ void lttv_state_remove_event_hooks(LttvTracesetState *self) for(k = 0 ; k < hooks->len ; k++) { th = &g_array_index(hooks, LttvTraceHook, k); + if (th->mdata == tfs->parent.tf->mdata) lttv_hooks_remove_data( lttv_hooks_by_id_find(tfs->parent.event_by_id, th->id), th->h, @@ -3938,7 +3989,7 @@ void lttv_state_traceset_seek_time_closest(LttvTracesetState *self, LttTime t) gboolean is_named; - LttvAttribute *saved_states_tree, *saved_state_tree, *closest_tree; + LttvAttribute *saved_states_tree, *saved_state_tree, *closest_tree = NULL; //g_tree_destroy(self->parent.pqueue); //self->parent.pqueue = g_tree_new(compare_tracefile); @@ -4189,19 +4240,30 @@ static void module_init() LTTV_STATE_RESOURCE_TRAPS = g_quark_from_string("trap resource states"); LTTV_STATE_RESOURCE_BLKDEVS = g_quark_from_string("blkdevs resource states"); - - LTT_FACILITY_KERNEL = g_quark_from_string("kernel"); - LTT_FACILITY_KERNEL_ARCH = g_quark_from_string("kernel_arch"); - LTT_FACILITY_FS = g_quark_from_string("fs"); - LTT_FACILITY_LIST = g_quark_from_string("list"); - LTT_FACILITY_USER_GENERIC = g_quark_from_string("user_generic"); - LTT_FACILITY_BLOCK = g_quark_from_string("block"); - LTT_FACILITY_STATEDUMP = g_quark_from_string("statedump"); - + LTT_CHANNEL_FD_STATE = g_quark_from_string("fd_state"); + LTT_CHANNEL_GLOBAL_STATE = g_quark_from_string("global_state"); + LTT_CHANNEL_IRQ_STATE = g_quark_from_string("irq_state"); + LTT_CHANNEL_MODULE_STATE = g_quark_from_string("module_state"); + LTT_CHANNEL_NETIF_STATE = g_quark_from_string("netif_state"); + LTT_CHANNEL_SOFTIRQ_STATE = g_quark_from_string("softirq_state"); + LTT_CHANNEL_SWAP_STATE = g_quark_from_string("swap_state"); + LTT_CHANNEL_SYSCALL_STATE = g_quark_from_string("syscall_state"); + LTT_CHANNEL_TASK_STATE = g_quark_from_string("task_state"); + LTT_CHANNEL_VM_STATE = g_quark_from_string("vm_state"); + LTT_CHANNEL_FS = g_quark_from_string("fs"); + LTT_CHANNEL_KERNEL = g_quark_from_string("kernel"); + LTT_CHANNEL_MM = g_quark_from_string("mm"); + LTT_CHANNEL_USERSPACE = g_quark_from_string("userspace"); + LTT_CHANNEL_BLOCK = g_quark_from_string("block"); + LTT_EVENT_SYSCALL_ENTRY = g_quark_from_string("syscall_entry"); LTT_EVENT_SYSCALL_EXIT = g_quark_from_string("syscall_exit"); LTT_EVENT_TRAP_ENTRY = g_quark_from_string("trap_entry"); LTT_EVENT_TRAP_EXIT = g_quark_from_string("trap_exit"); + LTT_EVENT_PAGE_FAULT_ENTRY = g_quark_from_string("page_fault_entry"); + LTT_EVENT_PAGE_FAULT_EXIT = g_quark_from_string("page_fault_exit"); + LTT_EVENT_PAGE_FAULT_NOSEM_ENTRY = g_quark_from_string("page_fault_nosem_entry"); + LTT_EVENT_PAGE_FAULT_NOSEM_EXIT = g_quark_from_string("page_fault_nosem_exit"); LTT_EVENT_IRQ_ENTRY = g_quark_from_string("irq_entry"); LTT_EVENT_IRQ_EXIT = g_quark_from_string("irq_exit"); LTT_EVENT_SOFT_IRQ_RAISE = g_quark_from_string("softirq_raise"); @@ -4223,6 +4285,7 @@ static void module_init() LTT_EVENT_LIST_INTERRUPT = g_quark_from_string("interrupt"); LTT_EVENT_SYS_CALL_TABLE = g_quark_from_string("sys_call_table"); LTT_EVENT_SOFTIRQ_VEC = g_quark_from_string("softirq_vec"); + LTT_EVENT_KPROBE_TABLE = g_quark_from_string("kprobe_table"); LTT_FIELD_SYSCALL_ID = g_quark_from_string("syscall_id"); LTT_FIELD_TRAP_ID = g_quark_from_string("trap_id"); @@ -4251,6 +4314,7 @@ static void module_init() LTT_FIELD_ID = g_quark_from_string("id"); LTT_FIELD_ADDRESS = g_quark_from_string("address"); LTT_FIELD_SYMBOL = g_quark_from_string("symbol"); + LTT_FIELD_IP = g_quark_from_string("ip"); LTTV_CPU_UNKNOWN = g_quark_from_string("unknown"); LTTV_CPU_IDLE = g_quark_from_string("idle");