Re: [PATCH V6 06/12] perf tools: remove unnecessary callchain validation

2013-07-17 Thread Adrian Hunter
On 16/07/13 15:05, Jiri Olsa wrote:
> On Tue, Jul 16, 2013 at 09:38:12AM +0300, Adrian Hunter wrote:
> 
> SNIP
> 
>>  }
>>  }
>>  
>> -static int perf_session__preprocess_sample(struct perf_session *session,
>> -   union perf_event *event, struct 
>> perf_sample *sample)
>> -{
>> -if (event->header.type != PERF_RECORD_SAMPLE ||
>> -!sample->callchain)
>> -return 0;
>> -
>> -if (!ip_callchain__valid(sample->callchain, event)) {
>> -pr_debug("call-chain problem with event, skipping it.\n");
>> -++session->stats.nr_invalid_chains;
>> -session->stats.total_invalid_chains += sample->period;
> 
> How about the '*invalid_chains' stats here? I dont see
> it incremented in the parsing routine.
> 
> Also the current behaviour is to increments stats for invalid
> callchains, but dont fail. With your changes we fail during the
> parsing.

It would fail during parsing sometimes anyway.  The code was:

if (type & PERF_SAMPLE_CALLCHAIN) {
if (sample_overlap(event, array, sizeof(data->callchain->nr)))
return -EFAULT;

data->callchain = (struct ip_callchain *)array;

if (sample_overlap(event, array, data->callchain->nr))
return -EFAULT;

array += 1 + data->callchain->nr;
}

But sample overlap did not handle size being effectively negative
i.e. 'offset + size' overflows

static bool sample_overlap(const union perf_event *event,
   const void *offset, u64 size)
{
const void *base = event;

if (offset + size > base + event->header.size)
return true;

return false;
}


> 
> On the other hand.. maybe we should fail ;-) I think that
> invalid callchain data is serious enough to be overlooked
> by not seeing the nr_invalid_chains got incremented.
> 
> let's see other comments and then silently push it :-)
> 
> jirka
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V6 06/12] perf tools: remove unnecessary callchain validation

2013-07-17 Thread Adrian Hunter
On 16/07/13 15:05, Jiri Olsa wrote:
 On Tue, Jul 16, 2013 at 09:38:12AM +0300, Adrian Hunter wrote:
 
 SNIP
 
  }
  }
  
 -static int perf_session__preprocess_sample(struct perf_session *session,
 -   union perf_event *event, struct 
 perf_sample *sample)
 -{
 -if (event-header.type != PERF_RECORD_SAMPLE ||
 -!sample-callchain)
 -return 0;
 -
 -if (!ip_callchain__valid(sample-callchain, event)) {
 -pr_debug(call-chain problem with event, skipping it.\n);
 -++session-stats.nr_invalid_chains;
 -session-stats.total_invalid_chains += sample-period;
 
 How about the '*invalid_chains' stats here? I dont see
 it incremented in the parsing routine.
 
 Also the current behaviour is to increments stats for invalid
 callchains, but dont fail. With your changes we fail during the
 parsing.

It would fail during parsing sometimes anyway.  The code was:

if (type  PERF_SAMPLE_CALLCHAIN) {
if (sample_overlap(event, array, sizeof(data-callchain-nr)))
return -EFAULT;

data-callchain = (struct ip_callchain *)array;

if (sample_overlap(event, array, data-callchain-nr))
return -EFAULT;

array += 1 + data-callchain-nr;
}

But sample overlap did not handle size being effectively negative
i.e. 'offset + size' overflows

static bool sample_overlap(const union perf_event *event,
   const void *offset, u64 size)
{
const void *base = event;

if (offset + size  base + event-header.size)
return true;

return false;
}


 
 On the other hand.. maybe we should fail ;-) I think that
 invalid callchain data is serious enough to be overlooked
 by not seeing the nr_invalid_chains got incremented.
 
 let's see other comments and then silently push it :-)
 
 jirka
 
 

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V6 06/12] perf tools: remove unnecessary callchain validation

2013-07-16 Thread Jiri Olsa
On Tue, Jul 16, 2013 at 09:38:12AM +0300, Adrian Hunter wrote:

SNIP

>   }
>  }
>  
> -static int perf_session__preprocess_sample(struct perf_session *session,
> -union perf_event *event, struct 
> perf_sample *sample)
> -{
> - if (event->header.type != PERF_RECORD_SAMPLE ||
> - !sample->callchain)
> - return 0;
> -
> - if (!ip_callchain__valid(sample->callchain, event)) {
> - pr_debug("call-chain problem with event, skipping it.\n");
> - ++session->stats.nr_invalid_chains;
> - session->stats.total_invalid_chains += sample->period;

How about the '*invalid_chains' stats here? I dont see
it incremented in the parsing routine.

Also the current behaviour is to increments stats for invalid
callchains, but dont fail. With your changes we fail during the
parsing.

On the other hand.. maybe we should fail ;-) I think that
invalid callchain data is serious enough to be overlooked
by not seeing the nr_invalid_chains got incremented.

let's see other comments and then silently push it :-)

jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH V6 06/12] perf tools: remove unnecessary callchain validation

2013-07-16 Thread Adrian Hunter
Now that the sample parsing correctly checks data sizes
there is no reason for it to be done again for callchains.

Signed-off-by: Adrian Hunter 
---
 tools/perf/util/callchain.c |  8 
 tools/perf/util/callchain.h |  5 -
 tools/perf/util/session.c   | 20 
 3 files changed, 33 deletions(-)

diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 42b6a63..024162a 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -20,14 +20,6 @@
 
 __thread struct callchain_cursor callchain_cursor;
 
-bool ip_callchain__valid(struct ip_callchain *chain,
-const union perf_event *event)
-{
-   unsigned int chain_size = event->header.size;
-   chain_size -= (unsigned long)>ip.__more_data - (unsigned 
long)event;
-   return chain->nr * sizeof(u64) <= chain_size;
-}
-
 #define chain_for_each_child(child, parent)\
list_for_each_entry(child, >children, siblings)
 
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 3ee9f67..988c1aa 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -103,11 +103,6 @@ int callchain_append(struct callchain_root *root,
 int callchain_merge(struct callchain_cursor *cursor,
struct callchain_root *dst, struct callchain_root *src);
 
-struct ip_callchain;
-union perf_event;
-
-bool ip_callchain__valid(struct ip_callchain *chain,
-const union perf_event *event);
 /*
  * Initialize a cursor before adding entries inside, but keep
  * the previously allocated entries as a cache.
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 708c72b..1b07d7a 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -889,22 +889,6 @@ static int perf_session_deliver_event(struct perf_session 
*session,
}
 }
 
-static int perf_session__preprocess_sample(struct perf_session *session,
-  union perf_event *event, struct 
perf_sample *sample)
-{
-   if (event->header.type != PERF_RECORD_SAMPLE ||
-   !sample->callchain)
-   return 0;
-
-   if (!ip_callchain__valid(sample->callchain, event)) {
-   pr_debug("call-chain problem with event, skipping it.\n");
-   ++session->stats.nr_invalid_chains;
-   session->stats.total_invalid_chains += sample->period;
-   return -EINVAL;
-   }
-   return 0;
-}
-
 static int perf_session__process_user_event(struct perf_session *session, 
union perf_event *event,
struct perf_tool *tool, u64 
file_offset)
 {
@@ -967,10 +951,6 @@ static int perf_session__process_event(struct perf_session 
*session,
if (ret)
return ret;
 
-   /* Preprocess sample records - precheck callchains */
-   if (perf_session__preprocess_sample(session, event, ))
-   return 0;
-
if (tool->ordered_samples) {
ret = perf_session_queue_event(session, event, ,
   file_offset);
-- 
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH V6 06/12] perf tools: remove unnecessary callchain validation

2013-07-16 Thread Adrian Hunter
Now that the sample parsing correctly checks data sizes
there is no reason for it to be done again for callchains.

Signed-off-by: Adrian Hunter adrian.hun...@intel.com
---
 tools/perf/util/callchain.c |  8 
 tools/perf/util/callchain.h |  5 -
 tools/perf/util/session.c   | 20 
 3 files changed, 33 deletions(-)

diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 42b6a63..024162a 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -20,14 +20,6 @@
 
 __thread struct callchain_cursor callchain_cursor;
 
-bool ip_callchain__valid(struct ip_callchain *chain,
-const union perf_event *event)
-{
-   unsigned int chain_size = event-header.size;
-   chain_size -= (unsigned long)event-ip.__more_data - (unsigned 
long)event;
-   return chain-nr * sizeof(u64) = chain_size;
-}
-
 #define chain_for_each_child(child, parent)\
list_for_each_entry(child, parent-children, siblings)
 
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 3ee9f67..988c1aa 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -103,11 +103,6 @@ int callchain_append(struct callchain_root *root,
 int callchain_merge(struct callchain_cursor *cursor,
struct callchain_root *dst, struct callchain_root *src);
 
-struct ip_callchain;
-union perf_event;
-
-bool ip_callchain__valid(struct ip_callchain *chain,
-const union perf_event *event);
 /*
  * Initialize a cursor before adding entries inside, but keep
  * the previously allocated entries as a cache.
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 708c72b..1b07d7a 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -889,22 +889,6 @@ static int perf_session_deliver_event(struct perf_session 
*session,
}
 }
 
-static int perf_session__preprocess_sample(struct perf_session *session,
-  union perf_event *event, struct 
perf_sample *sample)
-{
-   if (event-header.type != PERF_RECORD_SAMPLE ||
-   !sample-callchain)
-   return 0;
-
-   if (!ip_callchain__valid(sample-callchain, event)) {
-   pr_debug(call-chain problem with event, skipping it.\n);
-   ++session-stats.nr_invalid_chains;
-   session-stats.total_invalid_chains += sample-period;
-   return -EINVAL;
-   }
-   return 0;
-}
-
 static int perf_session__process_user_event(struct perf_session *session, 
union perf_event *event,
struct perf_tool *tool, u64 
file_offset)
 {
@@ -967,10 +951,6 @@ static int perf_session__process_event(struct perf_session 
*session,
if (ret)
return ret;
 
-   /* Preprocess sample records - precheck callchains */
-   if (perf_session__preprocess_sample(session, event, sample))
-   return 0;
-
if (tool-ordered_samples) {
ret = perf_session_queue_event(session, event, sample,
   file_offset);
-- 
1.7.11.7

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V6 06/12] perf tools: remove unnecessary callchain validation

2013-07-16 Thread Jiri Olsa
On Tue, Jul 16, 2013 at 09:38:12AM +0300, Adrian Hunter wrote:

SNIP

   }
  }
  
 -static int perf_session__preprocess_sample(struct perf_session *session,
 -union perf_event *event, struct 
 perf_sample *sample)
 -{
 - if (event-header.type != PERF_RECORD_SAMPLE ||
 - !sample-callchain)
 - return 0;
 -
 - if (!ip_callchain__valid(sample-callchain, event)) {
 - pr_debug(call-chain problem with event, skipping it.\n);
 - ++session-stats.nr_invalid_chains;
 - session-stats.total_invalid_chains += sample-period;

How about the '*invalid_chains' stats here? I dont see
it incremented in the parsing routine.

Also the current behaviour is to increments stats for invalid
callchains, but dont fail. With your changes we fail during the
parsing.

On the other hand.. maybe we should fail ;-) I think that
invalid callchain data is serious enough to be overlooked
by not seeing the nr_invalid_chains got incremented.

let's see other comments and then silently push it :-)

jirka
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/