Discussion:
[PATCH] process: introduce get_pevent_field_str()
Sergey Senozhatsky
2012-04-30 20:21:33 UTC
Permalink
| commit 8580d679ede86a1c91f5925b6971a094cea6f832
| Author: Chris E Ferron <chris.e.ferron-VuQAYsv1563Yd54FQh9/***@public.gmane.org>
| Date: Mon Apr 30 11:38:32 2012 -0700
|
| updated remaining string fields to insure descriptions are valid.
|

extended pevent field offset calculation to sched events.
It tourned out to be uneccessary, since offset calculation and 0xffff alignment
required only for DYNAMIC fields: the one with __data_loc in filed type.

irq_handler_entry event is defined with __string name, while sched_switch event
is defined with __array char next_comm TASK_COMM_LEN field.

Function get_pevent_field_str() checks field->flags and return `char *'
with proper offset calculated.

Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky-***@public.gmane.org>

---

src/process/do_process.cpp | 43 +++++++++++++++++++++----------------------
1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/src/process/do_process.cpp b/src/process/do_process.cpp
index 58afbef..e3d7856 100644
--- a/src/process/do_process.cpp
+++ b/src/process/do_process.cpp
@@ -199,6 +199,20 @@ static void dbg_printf_pevent_info(struct event_format *event, struct record *re
trace_seq_destroy(&s);
}

+static char * get_pevent_field_str(void *trace, struct event_format *event, struct format_field *field)
+{
+ unsigned long long offset, len;
+ if (field->flags & FIELD_IS_DYNAMIC) {
+ offset = field->offset;
+ len = field->size;
+ offset = pevent_read_number(event->pevent, (char *)trace + offset, len);
+ offset &= 0xffff;
+ return (char *)trace + offset;
+ }
+ /** no __data_loc field type*/
+ return (char *)trace + field->offset;
+}
+
void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time)
{
struct event_format *event;
@@ -226,20 +240,15 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time
if (strcmp(event->name, "sched_switch") == 0) {
class process *old_proc = NULL;
class process *new_proc = NULL;
- unsigned long long offset, len;
const char *next_comm;
int next_pid;
int prev_pid;

field = pevent_find_any_field(event, "next_comm");
- if (!field || !(field->flags & FIELD_IS_STRING ))
+ if (!field || !(field->flags & FIELD_IS_STRING))
return; /* ?? */
-
- offset = field->offset;
- len = field->size;
- offset = pevent_read_number(event->pevent, (char *)trace + offset, len);
- offset &= 0xffff;
- next_comm = (char *)trace + offset;
+
+ next_comm = get_pevent_field_str(trace, event, field);

ret = pevent_get_field_val(NULL, event, "next_pid", &rec, &val, 0);
if (ret < 0)
@@ -299,12 +308,10 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time
class power_consumer *from = NULL;
class process *dest_proc = NULL;
class process *from_proc = NULL;
- unsigned long long offset, len;
const char *comm;
int flags;
int pid;

-
ret = pevent_get_common_field_val(NULL, event, "flags", &rec, &val, 0);
if (ret < 0)
return;
@@ -330,12 +337,8 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time

if (!field || !(field->flags & FIELD_IS_STRING))
return;
-
- offset = field->offset;
- len = field->size;
- offset = pevent_read_number(event->pevent, (char *)trace + offset, len);
- offset &= 0xffff;
- comm = (char *)trace + offset;
+
+ comm = get_pevent_field_str(trace, event, field);

ret = pevent_get_field_val(NULL, event, "pid", &rec, &val, 0);
if (ret < 0)
@@ -363,7 +366,6 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time

}
else if (strcmp(event->name, "irq_handler_entry") == 0) {
- unsigned long long offset, len;
class interrupt *irq = NULL;
const char *handler;
int nr;
@@ -371,11 +373,8 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time
field = pevent_find_any_field(event, "name");
if (!field || !(field->flags & FIELD_IS_STRING))
return; /* ?? */
- offset = field->offset;
- len = field->size;
- offset = pevent_read_number(event->pevent, (char *)trace + offset, len);
- offset &= 0xffff;
- handler = (char *)trace + offset;
+
+ handler = get_pevent_field_str(trace, event, field);

ret = pevent_get_field_val(NULL, event, "irq", &rec, &val, 0);
if (ret < 0)

Loading...