From b467f7a77d78880b71ec10d8fa8904da7d28043e Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 22 Feb 2011 09:15:48 -0500 Subject: [PATCH] Fix marker/tracepoint/trace_event lib list: expected to be sorted Sort library lists. List operations expect the library lists to be sorted by pointer addresses (this was needed for iteration on kernel modules without having to hold the mutex across read system calls). It's usefulness in userspace is debatable, but there is clearly a bug here, since the code that iterates on the lists still expects them to be sorted. Signed-off-by: Mathieu Desnoyers --- libust/marker.c | 16 +++++++++++++++- libust/trace_event.c | 15 ++++++++++++++- libust/tracepoint.c | 15 ++++++++++++++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/libust/marker.c b/libust/marker.c index 8ca028c..dafa0d7 100644 --- a/libust/marker.c +++ b/libust/marker.c @@ -1350,7 +1350,7 @@ static void new_markers(struct marker * const *start, struct marker * const *end int marker_register_lib(struct marker * const *markers_start, int markers_count) { - struct lib *pl; + struct lib *pl, *iter; pl = (struct lib *) zmalloc(sizeof(struct lib)); @@ -1359,7 +1359,21 @@ int marker_register_lib(struct marker * const *markers_start, int markers_count) /* FIXME: maybe protect this with its own mutex? */ lock_markers(); + + /* + * We sort the libs by struct lib pointer address. + */ + cds_list_for_each_entry_reverse(iter, &libs, list) { + BUG_ON(iter == pl); /* Should never be in the list twice */ + if (iter < pl) { + /* We belong to the location right after iter. */ + cds_list_add(&pl->list, &iter->list); + goto lib_added; + } + } + /* We should be added at the head of the list */ cds_list_add(&pl->list, &libs); +lib_added: unlock_markers(); new_markers(markers_start, markers_start + markers_count); diff --git a/libust/trace_event.c b/libust/trace_event.c index d0d9ec4..2464d44 100644 --- a/libust/trace_event.c +++ b/libust/trace_event.c @@ -120,7 +120,7 @@ void trace_event_iter_reset(struct trace_event_iter *iter) int trace_event_register_lib(struct trace_event * const *trace_events_start, int trace_events_count) { - struct trace_event_lib *pl; + struct trace_event_lib *pl, *iter; pl = (struct trace_event_lib *) malloc(sizeof(struct trace_event_lib)); @@ -129,7 +129,20 @@ int trace_event_register_lib(struct trace_event * const *trace_events_start, /* FIXME: maybe protect this with its own mutex? */ pthread_mutex_lock(&trace_events_mutex); + /* + * We sort the libs by struct lib pointer address. + */ + cds_list_for_each_entry_reverse(iter, &libs, list) { + BUG_ON(iter == pl); /* Should never be in the list twice */ + if (iter < pl) { + /* We belong to the location right after iter. */ + cds_list_add(&pl->list, &iter->list); + goto lib_added; + } + } + /* We should be added at the head of the list */ cds_list_add(&pl->list, &libs); +lib_added: pthread_mutex_unlock(&trace_events_mutex); DBG("just registered a trace_events section from %p and having %d trace_events", trace_events_start, trace_events_count); diff --git a/libust/tracepoint.c b/libust/tracepoint.c index ca40902..5a834a3 100644 --- a/libust/tracepoint.c +++ b/libust/tracepoint.c @@ -660,7 +660,7 @@ static void new_tracepoints(struct tracepoint * const *start, struct tracepoint int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tracepoints_count) { - struct tracepoint_lib *pl; + struct tracepoint_lib *pl, *iter; pl = (struct tracepoint_lib *) zmalloc(sizeof(struct tracepoint_lib)); @@ -669,7 +669,20 @@ int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tr /* FIXME: maybe protect this with its own mutex? */ pthread_mutex_lock(&tracepoints_mutex); + /* + * We sort the libs by struct lib pointer address. + */ + cds_list_for_each_entry_reverse(iter, &libs, list) { + BUG_ON(iter == pl); /* Should never be in the list twice */ + if (iter < pl) { + /* We belong to the location right after iter. */ + cds_list_add(&pl->list, &iter->list); + goto lib_added; + } + } + /* We should be added at the head of the list */ cds_list_add(&pl->list, &libs); +lib_added: pthread_mutex_unlock(&tracepoints_mutex); new_tracepoints(tracepoints_start, tracepoints_start + tracepoints_count); -- 2.34.1