Fix marker/tracepoint/trace_event lib list: expected to be sorted
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 22 Feb 2011 14:15:48 +0000 (09:15 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 22 Feb 2011 14:15:48 +0000 (09:15 -0500)
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 <mathieu.desnoyers@efficios.com>
libust/marker.c
libust/trace_event.c
libust/tracepoint.c

index 8ca028c3e0f38f36cbadf18fabcb413452a6011c..dafa0d7207cfd1dd4bf6bf29199286f9ba1c473f 100644 (file)
@@ -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);
index d0d9ec455e36c132f8b3eed065517940f63583b3..2464d444807deb21ff8dd90853cd5484f6106022 100644 (file)
@@ -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);
index ca40902494f61b9785a1e0b863852dca4694aff3..5a834a3fc91ed8956c0faba7cba65878b8bad458 100644 (file)
@@ -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);
This page took 0.02726 seconds and 4 git commands to generate.