In order to allow multiple traces to co-exist markers need to be enabled per-trace. This requires first creating a trace struct with corresponding hashes and then activating markers. This patch just separates out the trace_struct allocation for the trace and makes the corresponding necessary changes to ustctl, ustcmd, tracectl and test-cases.
Signed-off-by: Nils Carlson <[email protected]> --- libust/tracectl.c | 31 +++--- libust/tracer.c | 108 ++++++++++++++++---- libust/tracer.h | 2 +- libust/tracercore.c | 1 + libust/tracercore.h | 1 + libustcmd/ustcmd.c | 11 ++ tests/manual_mode_tracing.sh | 3 +- .../ustcmd_function_tests/ustcmd_function_tests.c | 6 +- ustctl/ustctl.c | 12 ++ 9 files changed, 137 insertions(+), 38 deletions(-) diff --git a/libust/tracectl.c b/libust/tracectl.c index d5ca7d2..692364d 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -185,7 +185,7 @@ static void request_buffer_consumer(int sock, * produced by this pid. * * The trace must be at least allocated. (It can also be started.) - * This is because _ltt_trace_find is used. + * This is because _ltt_trace_find_alloc is used. */ static void inform_consumer_daemon(const char *trace_name) @@ -203,7 +203,7 @@ static void inform_consumer_daemon(const char *trace_name) ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); if (trace == NULL) { WARN("inform_consumer_daemon: could not find trace \"%s\"; it is probably already destroyed", trace_name); goto unlock_traces; @@ -255,7 +255,7 @@ static int get_buffer_shmid_pipe_fd(const char *trace_name, const char *ch_name, DBG("get_buffer_shmid_pipe_fd"); ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); ltt_unlock_traces(); if (trace == NULL) { @@ -287,7 +287,7 @@ static int get_subbuf_num_size(const char *trace_name, const char *ch_name, DBG("get_subbuf_size"); ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); ltt_unlock_traces(); if (!trace) { @@ -410,7 +410,7 @@ static int get_subbuffer(const char *trace_name, const char *ch_name, *consumed_old = 0; ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); if (!trace) { DBG("Cannot find trace. It was likely destroyed by the user."); @@ -451,7 +451,7 @@ static int notify_buffer_mapped(const char *trace_name, DBG("get_buffer_fd"); ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); if (!trace) { retval = -ENODATA; @@ -498,7 +498,7 @@ static int put_subbuffer(const char *trace_name, const char *ch_name, DBG("put_subbuf"); ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); if (!trace) { retval = -ENODATA; @@ -644,15 +644,9 @@ static int process_trace_cmd(int command, char *trace_name) case CREATE_TRACE: DBG("trace create"); - result = ltt_trace_setup(trace_name); - if (result < 0) { - ERR("ltt_trace_setup failed"); - return result; - } - - result = ltt_trace_set_type(trace_name, trace_type); + result = ltt_trace_create(trace_name); if (result < 0) { - ERR("ltt_trace_set_type failed"); + ERR("ltt_trace_create failed"); return result; } @@ -1381,6 +1375,12 @@ static void __attribute__((constructor)) init() */ ltt_channels_register("ust"); + result = ltt_trace_create(trace_name); + if (result < 0) { + ERR("ltt_trace_create failed"); + return; + } + result = ltt_trace_setup(trace_name); if (result < 0) { ERR("ltt_trace_setup failed"); @@ -1613,6 +1613,7 @@ static void ust_fork(void) return; } create_listener(); + ltt_trace_create("auto"); ltt_trace_setup("auto"); result = ltt_trace_set_type("auto", "ustrelay"); if (result < 0) { diff --git a/libust/tracer.c b/libust/tracer.c index c0d7a1a..73cd981 100644 --- a/libust/tracer.c +++ b/libust/tracer.c @@ -288,12 +288,29 @@ static void trace_async_wakeup(struct ust_trace *trace) //ust// } /** - * _ltt_trace_find - find a trace by given name. + * _ltt_trace_find_created - find a created trace by given name. * trace_name: trace name * * Returns a pointer to the trace structure, NULL if not found. */ -struct ust_trace *_ltt_trace_find(const char *trace_name) +struct ust_trace *_ltt_trace_find_created(const char *trace_name) +{ + struct ust_trace *trace; + + list_for_each_entry(trace, <t_traces.created_head, list) + if (!strncmp(trace->trace_name, trace_name, NAME_MAX)) + return trace; + + return NULL; +} + +/** + * _ltt_trace_find_alloc - find an allocated trace by given name. + * trace_name: trace name + * + * Returns a pointer to the trace structure, NULL if not found. + */ +struct ust_trace *_ltt_trace_find_alloc(const char *trace_name) { struct ust_trace *trace; @@ -320,6 +337,30 @@ struct ust_trace *_ltt_trace_find_setup(const char *trace_name) return NULL; } +/* _ltt_trace_find : + * find a trace by a given name. + * + * Returns a pointer to the trace structure, NULL if not found. + */ +struct ust_trace *_ltt_trace_find(const char *trace_name) +{ + struct ust_trace *trace; + + trace = _ltt_trace_find_alloc(trace_name); + if (trace) + return trace; + + trace = _ltt_trace_find_setup(trace_name); + if (trace) + return trace; + + trace = _ltt_trace_find_created(trace_name); + if (trace) + return trace; + + return NULL; +} + /** * ltt_release_transport - Release an LTT transport * @kref : reference count on the transport @@ -358,19 +399,10 @@ static inline void prepare_chan_size_num(unsigned int *subbuf_size, WARN_ON(hweight32(*n_subbufs) != 1); } -int _ltt_trace_setup(const char *trace_name) +static int _ltt_trace_create(const char *trace_name) { int err = 0; struct ust_trace *new_trace = NULL; - int metadata_index; - unsigned int chan; - enum ltt_channels chantype; - - if (_ltt_trace_find_setup(trace_name)) { - ERR("Trace name %s already used", trace_name); - err = -EEXIST; - goto traces_error; - } if (_ltt_trace_find(trace_name)) { ERR("Trace name %s already used", trace_name); @@ -385,13 +417,40 @@ int _ltt_trace_setup(const char *trace_name) goto traces_error; } strncpy(new_trace->trace_name, trace_name, NAME_MAX); + + list_add(&new_trace->list, <t_traces.created_head); + + return 0; + +trace_free: + free(new_trace); +traces_error: + return err; + +} + +int _ltt_trace_setup(const char *trace_name) +{ + int err = 0; + struct ust_trace *new_trace = NULL; + int metadata_index; + unsigned int chan; + enum ltt_channels chantype; + + new_trace = _ltt_trace_find_created(trace_name); + if (!new_trace) { + ERR("Trace not found %s", trace_name); + err = -ENOENT; + goto traces_error; + } + new_trace->channels = ltt_channels_trace_alloc(&new_trace->nr_channels, ust_channels_overwrite_by_default, ust_channels_request_collection_by_default, 1); if (!new_trace->channels) { ERR("Unable to allocate memory for chaninfo %s\n", trace_name); err = -ENOMEM; - goto trace_free; + goto traces_error; } /* @@ -417,16 +476,25 @@ int _ltt_trace_setup(const char *trace_name) chan_infos[chantype].def_subbufcount; } + list_del(&new_trace->list); list_add(&new_trace->list, <t_traces.setup_head); return 0; -trace_free: - free(new_trace); traces_error: return err; } +int ltt_trace_create(const char *trace_name) +{ + int ret; + ltt_lock_traces(); + ret = _ltt_trace_create(trace_name); + ltt_unlock_traces(); + return ret; +} + + int ltt_trace_setup(const char *trace_name) { int ret; @@ -628,7 +696,7 @@ int ltt_trace_alloc(const char *trace_name) ltt_lock_traces(); - if (_ltt_trace_find(trace_name)) { /* Trace already allocated */ + if (_ltt_trace_find_alloc(trace_name)) { /* Trace already allocated */ err = 1; goto traces_error; } @@ -831,7 +899,7 @@ int ltt_trace_destroy(const char *trace_name, int drop) ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); if (trace) { err = _ltt_trace_destroy(trace); if (err) @@ -894,7 +962,7 @@ int ltt_trace_start(const char *trace_name) ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); err = _ltt_trace_start(trace); if (err) goto no_trace; @@ -958,7 +1026,7 @@ int ltt_trace_stop(const char *trace_name) struct ust_trace *trace; ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); err = _ltt_trace_stop(trace); ltt_unlock_traces(); return err; @@ -976,7 +1044,7 @@ int ltt_filter_control(enum ltt_filter_control_msg msg, const char *trace_name) DBG("ltt_filter_control : trace %s", trace_name); ltt_lock_traces(); - trace = _ltt_trace_find(trace_name); + trace = _ltt_trace_find_alloc(trace_name); if (trace == NULL) { ERR("Trace does not exist. Cannot proxy control request"); err = -ENOENT; diff --git a/libust/tracer.h b/libust/tracer.h index c5df6ec..7d4ec38 100644 --- a/libust/tracer.h +++ b/libust/tracer.h @@ -435,6 +435,6 @@ extern void ltt_dump_marker_state(struct ust_trace *trace); extern void ltt_lock_traces(void); extern void ltt_unlock_traces(void); -extern struct ust_trace *_ltt_trace_find(const char *trace_name); +extern struct ust_trace *_ltt_trace_find_alloc(const char *trace_name); #endif /* _LTT_TRACER_H */ diff --git a/libust/tracercore.c b/libust/tracercore.c index bbc8691..36656f9 100644 --- a/libust/tracercore.c +++ b/libust/tracercore.c @@ -22,6 +22,7 @@ /* Traces structures */ struct ltt_traces ltt_traces = { + .created_head = LIST_HEAD_INIT(ltt_traces.created_head), .setup_head = LIST_HEAD_INIT(ltt_traces.setup_head), .head = LIST_HEAD_INIT(ltt_traces.head), }; diff --git a/libust/tracercore.h b/libust/tracercore.h index 5c396f4..857930e 100644 --- a/libust/tracercore.h +++ b/libust/tracercore.h @@ -32,6 +32,7 @@ * list. */ struct ltt_traces { + struct list_head created_head; /* Created traces list */ struct list_head setup_head; /* Pre-allocated traces list */ struct list_head head; /* Allocated Traces list */ unsigned int num_active_traces; /* Number of active traces */ diff --git a/libustcmd/ustcmd.c b/libustcmd/ustcmd.c index bffd3c2..aada64b 100644 --- a/libustcmd/ustcmd.c +++ b/libustcmd/ustcmd.c @@ -353,6 +353,17 @@ int ustcmd_create_trace(const char *trace, pid_t pid) } /** + * Sets up an UST trace according to a PID. + * + * @param pid Traced process ID + * @return 0 if successful, or error USTCMD_ERR_GEN + */ +int ustcmd_setup_trace(const char *trace, pid_t pid) +{ + return do_trace_cmd(trace, pid, SETUP_TRACE); +} + +/** * Starts an UST trace according to a PID. * * @param pid Traced process ID diff --git a/tests/manual_mode_tracing.sh b/tests/manual_mode_tracing.sh index 3f203b1..ec6d508 100755 --- a/tests/manual_mode_tracing.sh +++ b/tests/manual_mode_tracing.sh @@ -28,7 +28,7 @@ source $TESTDIR/tap.sh starttest "Manual mode tracing" -plan_tests 9 +plan_tests 10 TRACE_DIR="/tmp/ust-testsuite-manual-trace" rm -rf "$TRACE_DIR" @@ -47,6 +47,7 @@ okx ustctl --list-markers "$PID" okx ustctl --enable-marker ust/malloc $PID okx ustctl --enable-marker ust/free $PID okx ustctl --create-trace $PID +okx ustctl --setup-trace $PID okx ustctl --alloc-trace $PID okx ustctl --start-trace $PID sleep 0.5 diff --git a/tests/ustcmd_function_tests/ustcmd_function_tests.c b/tests/ustcmd_function_tests/ustcmd_function_tests.c index d44dafc..3209964 100644 --- a/tests/ustcmd_function_tests/ustcmd_function_tests.c +++ b/tests/ustcmd_function_tests/ustcmd_function_tests.c @@ -82,6 +82,8 @@ static void ustcmd_function_tests(pid_t pid) /* Create and allocate a trace */ tap_ok(!ustcmd_create_trace(trace, pid), "ustcmd_create_trace"); + tap_ok(!ustcmd_setup_trace(trace, pid), "ustcmd_setup_trace"); + tap_ok(!ustcmd_alloc_trace(trace, pid), "ustcmd_alloc_trace"); /* Get subbuf size and number */ @@ -105,6 +107,8 @@ static void ustcmd_function_tests(pid_t pid) /* Create a new trace */ tap_ok(!ustcmd_create_trace(trace, pid), "ustcmd_create_trace - create a new trace"); + tap_ok(!ustcmd_setup_trace(trace, pid), "ustcmd_setup_trace - setup a new trace"); + printf("Setting new subbufer number and sizes (doubling)\n"); new_subbuf_num = 2 * subbuf_num; new_subbuf_size = 2 * subbuf_size; @@ -162,7 +166,7 @@ int main() pid_t parent_pid, child_pid; FILE *pipe_file; - tap_plan(27); + tap_plan(29); printf("Function tests for ustcmd\n"); diff --git a/ustctl/ustctl.c b/ustctl/ustctl.c index aad3834..1a029ac 100644 --- a/ustctl/ustctl.c +++ b/ustctl/ustctl.c @@ -27,6 +27,7 @@ enum command { CREATE_TRACE=1000, + SETUP_TRACE, ALLOC_TRACE, START_TRACE, STOP_TRACE, @@ -61,6 +62,7 @@ void usage(void) \n\ Commands:\n\ --create-trace\t\t\tCreate trace\n\ + --setup-trace\t\t\tSetup trace\n\ --alloc-trace\t\t\tAlloc trace\n\ --start-trace\t\t\tStart tracing\n\ --stop-trace\t\t\tStop tracing\n\ @@ -91,6 +93,7 @@ int parse_opts_long(int argc, char **argv, struct ust_opts *opts) int option_index = 0; static struct option long_options[] = { { "create-trace", 0, 0, CREATE_TRACE }, + { "setup-trace", 0, 0, SETUP_TRACE }, { "alloc-trace", 0, 0, ALLOC_TRACE }, { "start-trace", 0, 0, START_TRACE }, { "stop-trace", 0, 0, STOP_TRACE }, @@ -282,6 +285,15 @@ int main(int argc, char *argv[]) } break; + case SETUP_TRACE: + result = ustcmd_setup_trace(trace, *pidit); + if (result) { + ERR("error while trying to create trace with PID %u\n", (unsigned int) *pidit); + retval = EXIT_FAILURE; + break; + } + break; + case START_TRACE: result = ustcmd_start_trace(trace, *pidit); if (result) { -- 1.7.1 _______________________________________________ ltt-dev mailing list [email protected] http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
