I apologies for numerous grammar mistakes in V1, those are the reason for
re-sending.


| commit 8580d679ede86a1c91f5925b6971a094cea6f832
| Author: Chris E Ferron <chris.e.fer...@linux.intel.com>
| 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 turned out to be unnecessary, since offset calculation and 0xffff alignment
required only for DYNAMIC fields -- field type starting with __data_loc.
    
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.senozhat...@gmail.com>

---

 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)

_______________________________________________
Power mailing list
Power@bughost.org
https://bughost.org/mailman/listinfo/power

Reply via email to