linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq
@ 2013-12-19  9:34 Namhyung Kim
  2013-12-19  9:34 ` [PATCH 2/4] tools lib traceevent: Check return value of realloc() Namhyung Kim
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Namhyung Kim @ 2013-12-19  9:34 UTC (permalink / raw)
  To: Steven Rostedt, Arnaldo Carvalho de Melo
  Cc: Frederic Weisbecker, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
	LKML, Jiri Olsa

From: Namhyung Kim <namhyung.kim@lge.com>

The trace_seq->state is for tracking errors during the use of
trace_seq APIs and getting rid of die() in it.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/lib/traceevent/event-parse.h |  7 +++++++
 tools/lib/traceevent/trace-seq.c   | 41 ++++++++++++++++++++++++++++++++++----
 2 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index cf5db9013f2c..3c890cb28db7 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -58,6 +58,12 @@ struct pevent_record {
 #endif
 };
 
+enum trace_seq_fail {
+	TRACE_SEQ__GOOD,
+	TRACE_SEQ__BUFFER_POISONED,
+	TRACE_SEQ__MEM_ALLOC_FAILED,
+};
+
 /*
  * Trace sequences are used to allow a function to call several other functions
  * to create a string of data to use (up to a max of PAGE_SIZE).
@@ -68,6 +74,7 @@ struct trace_seq {
 	unsigned int		buffer_size;
 	unsigned int		len;
 	unsigned int		readpos;
+	enum trace_seq_fail	state;
 };
 
 void trace_seq_init(struct trace_seq *s);
diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
index d7f2e68bc5b9..976ad2a146b3 100644
--- a/tools/lib/traceevent/trace-seq.c
+++ b/tools/lib/traceevent/trace-seq.c
@@ -32,8 +32,8 @@
 #define TRACE_SEQ_POISON	((void *)0xdeadbeef)
 #define TRACE_SEQ_CHECK(s)						\
 do {									\
-	if ((s)->buffer == TRACE_SEQ_POISON)			\
-		die("Usage of trace_seq after it was destroyed");	\
+	if ((s)->buffer == TRACE_SEQ_POISON)				\
+		(s)->state = TRACE_SEQ__BUFFER_POISONED;		\
 } while (0)
 
 /**
@@ -46,6 +46,7 @@ void trace_seq_init(struct trace_seq *s)
 	s->readpos = 0;
 	s->buffer_size = TRACE_SEQ_BUF_SIZE;
 	s->buffer = malloc_or_die(s->buffer_size);
+	s->state = TRACE_SEQ__GOOD;
 }
 
 /**
@@ -81,7 +82,7 @@ static void expand_buffer(struct trace_seq *s)
 	s->buffer_size += TRACE_SEQ_BUF_SIZE;
 	s->buffer = realloc(s->buffer, s->buffer_size);
 	if (!s->buffer)
-		die("Can't allocate trace_seq buffer memory");
+		s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
 }
 
 /**
@@ -108,6 +109,9 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
 	TRACE_SEQ_CHECK(s);
 
  try_again:
+	if (s->state != TRACE_SEQ__GOOD)
+		return 0;
+
 	len = (s->buffer_size - 1) - s->len;
 
 	va_start(ap, fmt);
@@ -144,6 +148,9 @@ trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
 	TRACE_SEQ_CHECK(s);
 
  try_again:
+	if (s->state != TRACE_SEQ__GOOD)
+		return 0;
+
 	len = (s->buffer_size - 1) - s->len;
 
 	ret = vsnprintf(s->buffer + s->len, len, fmt, args);
@@ -174,11 +181,17 @@ int trace_seq_puts(struct trace_seq *s, const char *str)
 
 	TRACE_SEQ_CHECK(s);
 
+	if (s->state != TRACE_SEQ__GOOD)
+		return 0;
+
 	len = strlen(str);
 
 	while (len > ((s->buffer_size - 1) - s->len))
 		expand_buffer(s);
 
+	if (s->state != TRACE_SEQ__GOOD)
+		return 0;
+
 	memcpy(s->buffer + s->len, str, len);
 	s->len += len;
 
@@ -189,9 +202,15 @@ int trace_seq_putc(struct trace_seq *s, unsigned char c)
 {
 	TRACE_SEQ_CHECK(s);
 
+	if (s->state != TRACE_SEQ__GOOD)
+		return 0;
+
 	while (s->len >= (s->buffer_size - 1))
 		expand_buffer(s);
 
+	if (s->state != TRACE_SEQ__GOOD)
+		return 0;
+
 	s->buffer[s->len++] = c;
 
 	return 1;
@@ -201,6 +220,9 @@ void trace_seq_terminate(struct trace_seq *s)
 {
 	TRACE_SEQ_CHECK(s);
 
+	if (s->state != TRACE_SEQ__GOOD)
+		return;
+
 	/* There's always one character left on the buffer */
 	s->buffer[s->len] = 0;
 }
@@ -208,5 +230,16 @@ void trace_seq_terminate(struct trace_seq *s)
 int trace_seq_do_printf(struct trace_seq *s)
 {
 	TRACE_SEQ_CHECK(s);
-	return printf("%.*s", s->len, s->buffer);
+
+	switch (s->state) {
+	case TRACE_SEQ__GOOD:
+		return printf("%.*s", s->len, s->buffer);
+	case TRACE_SEQ__BUFFER_POISONED:
+		puts("Usage of trace_seq after it was destroyed");
+		break;
+	case TRACE_SEQ__MEM_ALLOC_FAILED:
+		puts("Can't allocate trace_seq buffer memory");
+		break;
+	}
+	return -1;
 }
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/4] tools lib traceevent: Check return value of realloc()
  2013-12-19  9:34 [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
@ 2013-12-19  9:34 ` Namhyung Kim
  2013-12-19  9:34 ` [PATCH 3/4] tools lib traceevent: Get rid of malloc_or_die() in trace_seq_init() Namhyung Kim
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Namhyung Kim @ 2013-12-19  9:34 UTC (permalink / raw)
  To: Steven Rostedt, Arnaldo Carvalho de Melo
  Cc: Frederic Weisbecker, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
	LKML, Jiri Olsa

From: Namhyung Kim <namhyung.kim@lge.com>

If realloc() fails, it'll leak the buffer.  Also increate buffer size
only if the allocation succeeded.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/lib/traceevent/trace-seq.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
index 976ad2a146b3..57405652f26d 100644
--- a/tools/lib/traceevent/trace-seq.c
+++ b/tools/lib/traceevent/trace-seq.c
@@ -79,10 +79,16 @@ void trace_seq_destroy(struct trace_seq *s)
 
 static void expand_buffer(struct trace_seq *s)
 {
-	s->buffer_size += TRACE_SEQ_BUF_SIZE;
-	s->buffer = realloc(s->buffer, s->buffer_size);
-	if (!s->buffer)
+	char *buf;
+
+	buf = realloc(s->buffer, s->buffer_size + TRACE_SEQ_BUF_SIZE);
+	if (!buf) {
 		s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
+		return;
+	}
+
+	s->buffer = buf;
+	s->buffer_size += TRACE_SEQ_BUF_SIZE;
 }
 
 /**
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] tools lib traceevent: Get rid of malloc_or_die() in trace_seq_init()
  2013-12-19  9:34 [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
  2013-12-19  9:34 ` [PATCH 2/4] tools lib traceevent: Check return value of realloc() Namhyung Kim
@ 2013-12-19  9:34 ` Namhyung Kim
  2013-12-19  9:34 ` [PATCH 4/4] tools lib traceevent: Get rid of die() finally!! Namhyung Kim
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Namhyung Kim @ 2013-12-19  9:34 UTC (permalink / raw)
  To: Steven Rostedt, Arnaldo Carvalho de Melo
  Cc: Frederic Weisbecker, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
	LKML, Jiri Olsa

From: Namhyung Kim <namhyung.kim@lge.com>

Use plain malloc() and check its return value.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/lib/traceevent/trace-seq.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
index 57405652f26d..d24a33190bb8 100644
--- a/tools/lib/traceevent/trace-seq.c
+++ b/tools/lib/traceevent/trace-seq.c
@@ -45,8 +45,11 @@ void trace_seq_init(struct trace_seq *s)
 	s->len = 0;
 	s->readpos = 0;
 	s->buffer_size = TRACE_SEQ_BUF_SIZE;
-	s->buffer = malloc_or_die(s->buffer_size);
-	s->state = TRACE_SEQ__GOOD;
+	s->buffer = malloc(s->buffer_size);
+	if (s->buffer != NULL)
+		s->state = TRACE_SEQ__GOOD;
+	else
+		s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
 }
 
 /**
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] tools lib traceevent: Get rid of die() finally!!
  2013-12-19  9:34 [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
  2013-12-19  9:34 ` [PATCH 2/4] tools lib traceevent: Check return value of realloc() Namhyung Kim
  2013-12-19  9:34 ` [PATCH 3/4] tools lib traceevent: Get rid of malloc_or_die() in trace_seq_init() Namhyung Kim
@ 2013-12-19  9:34 ` Namhyung Kim
  2014-01-03  7:05 ` [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
  2014-01-03 13:24 ` Jiri Olsa
  4 siblings, 0 replies; 10+ messages in thread
From: Namhyung Kim @ 2013-12-19  9:34 UTC (permalink / raw)
  To: Steven Rostedt, Arnaldo Carvalho de Melo
  Cc: Frederic Weisbecker, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
	LKML, Jiri Olsa

From: Namhyung Kim <namhyung.kim@lge.com>

Now all of its users were gone. :)

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/lib/traceevent/event-utils.h |  4 ----
 tools/lib/traceevent/parse-utils.c | 44 --------------------------------------
 2 files changed, 48 deletions(-)

diff --git a/tools/lib/traceevent/event-utils.h b/tools/lib/traceevent/event-utils.h
index e76c9acb92cd..d1dc2170e402 100644
--- a/tools/lib/traceevent/event-utils.h
+++ b/tools/lib/traceevent/event-utils.h
@@ -23,18 +23,14 @@
 #include <ctype.h>
 
 /* Can be overridden */
-void die(const char *fmt, ...);
-void *malloc_or_die(unsigned int size);
 void warning(const char *fmt, ...);
 void pr_stat(const char *fmt, ...);
 void vpr_stat(const char *fmt, va_list ap);
 
 /* Always available */
-void __die(const char *fmt, ...);
 void __warning(const char *fmt, ...);
 void __pr_stat(const char *fmt, ...);
 
-void __vdie(const char *fmt, ...);
 void __vwarning(const char *fmt, ...);
 void __vpr_stat(const char *fmt, ...);
 
diff --git a/tools/lib/traceevent/parse-utils.c b/tools/lib/traceevent/parse-utils.c
index bba701cf10e6..eda07fa31dca 100644
--- a/tools/lib/traceevent/parse-utils.c
+++ b/tools/lib/traceevent/parse-utils.c
@@ -25,40 +25,6 @@
 
 #define __weak __attribute__((weak))
 
-void __vdie(const char *fmt, va_list ap)
-{
-	int ret = errno;
-
-	if (errno)
-		perror("trace-cmd");
-	else
-		ret = -1;
-
-	fprintf(stderr, "  ");
-	vfprintf(stderr, fmt, ap);
-
-	fprintf(stderr, "\n");
-	exit(ret);
-}
-
-void __die(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vdie(fmt, ap);
-	va_end(ap);
-}
-
-void __weak die(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vdie(fmt, ap);
-	va_end(ap);
-}
-
 void __vwarning(const char *fmt, va_list ap)
 {
 	if (errno)
@@ -117,13 +83,3 @@ void __weak pr_stat(const char *fmt, ...)
 	__vpr_stat(fmt, ap);
 	va_end(ap);
 }
-
-void __weak *malloc_or_die(unsigned int size)
-{
-	void *data;
-
-	data = malloc(size);
-	if (!data)
-		die("malloc");
-	return data;
-}
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq
  2013-12-19  9:34 [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
                   ` (2 preceding siblings ...)
  2013-12-19  9:34 ` [PATCH 4/4] tools lib traceevent: Get rid of die() finally!! Namhyung Kim
@ 2014-01-03  7:05 ` Namhyung Kim
  2014-01-03 13:24 ` Jiri Olsa
  4 siblings, 0 replies; 10+ messages in thread
From: Namhyung Kim @ 2014-01-03  7:05 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Arnaldo Carvalho de Melo, Frederic Weisbecker, Peter Zijlstra,
	Ingo Molnar, Namhyung Kim, LKML, Jiri Olsa

Ping!

On Thu, 19 Dec 2013 18:34:23 +0900, Namhyung Kim wrote:
> From: Namhyung Kim <namhyung.kim@lge.com>
>
> The trace_seq->state is for tracking errors during the use of
> trace_seq APIs and getting rid of die() in it.
>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/lib/traceevent/event-parse.h |  7 +++++++
>  tools/lib/traceevent/trace-seq.c   | 41 ++++++++++++++++++++++++++++++++++----
>  2 files changed, 44 insertions(+), 4 deletions(-)
>
> diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
> index cf5db9013f2c..3c890cb28db7 100644
> --- a/tools/lib/traceevent/event-parse.h
> +++ b/tools/lib/traceevent/event-parse.h
> @@ -58,6 +58,12 @@ struct pevent_record {
>  #endif
>  };
>  
> +enum trace_seq_fail {
> +	TRACE_SEQ__GOOD,
> +	TRACE_SEQ__BUFFER_POISONED,
> +	TRACE_SEQ__MEM_ALLOC_FAILED,
> +};
> +
>  /*
>   * Trace sequences are used to allow a function to call several other functions
>   * to create a string of data to use (up to a max of PAGE_SIZE).
> @@ -68,6 +74,7 @@ struct trace_seq {
>  	unsigned int		buffer_size;
>  	unsigned int		len;
>  	unsigned int		readpos;
> +	enum trace_seq_fail	state;
>  };
>  
>  void trace_seq_init(struct trace_seq *s);
> diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
> index d7f2e68bc5b9..976ad2a146b3 100644
> --- a/tools/lib/traceevent/trace-seq.c
> +++ b/tools/lib/traceevent/trace-seq.c
> @@ -32,8 +32,8 @@
>  #define TRACE_SEQ_POISON	((void *)0xdeadbeef)
>  #define TRACE_SEQ_CHECK(s)						\
>  do {									\
> -	if ((s)->buffer == TRACE_SEQ_POISON)			\
> -		die("Usage of trace_seq after it was destroyed");	\
> +	if ((s)->buffer == TRACE_SEQ_POISON)				\
> +		(s)->state = TRACE_SEQ__BUFFER_POISONED;		\
>  } while (0)
>  
>  /**
> @@ -46,6 +46,7 @@ void trace_seq_init(struct trace_seq *s)
>  	s->readpos = 0;
>  	s->buffer_size = TRACE_SEQ_BUF_SIZE;
>  	s->buffer = malloc_or_die(s->buffer_size);
> +	s->state = TRACE_SEQ__GOOD;
>  }
>  
>  /**
> @@ -81,7 +82,7 @@ static void expand_buffer(struct trace_seq *s)
>  	s->buffer_size += TRACE_SEQ_BUF_SIZE;
>  	s->buffer = realloc(s->buffer, s->buffer_size);
>  	if (!s->buffer)
> -		die("Can't allocate trace_seq buffer memory");
> +		s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
>  }
>  
>  /**
> @@ -108,6 +109,9 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
>  	TRACE_SEQ_CHECK(s);
>  
>   try_again:
> +	if (s->state != TRACE_SEQ__GOOD)
> +		return 0;
> +
>  	len = (s->buffer_size - 1) - s->len;
>  
>  	va_start(ap, fmt);
> @@ -144,6 +148,9 @@ trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
>  	TRACE_SEQ_CHECK(s);
>  
>   try_again:
> +	if (s->state != TRACE_SEQ__GOOD)
> +		return 0;
> +
>  	len = (s->buffer_size - 1) - s->len;
>  
>  	ret = vsnprintf(s->buffer + s->len, len, fmt, args);
> @@ -174,11 +181,17 @@ int trace_seq_puts(struct trace_seq *s, const char *str)
>  
>  	TRACE_SEQ_CHECK(s);
>  
> +	if (s->state != TRACE_SEQ__GOOD)
> +		return 0;
> +
>  	len = strlen(str);
>  
>  	while (len > ((s->buffer_size - 1) - s->len))
>  		expand_buffer(s);
>  
> +	if (s->state != TRACE_SEQ__GOOD)
> +		return 0;
> +
>  	memcpy(s->buffer + s->len, str, len);
>  	s->len += len;
>  
> @@ -189,9 +202,15 @@ int trace_seq_putc(struct trace_seq *s, unsigned char c)
>  {
>  	TRACE_SEQ_CHECK(s);
>  
> +	if (s->state != TRACE_SEQ__GOOD)
> +		return 0;
> +
>  	while (s->len >= (s->buffer_size - 1))
>  		expand_buffer(s);
>  
> +	if (s->state != TRACE_SEQ__GOOD)
> +		return 0;
> +
>  	s->buffer[s->len++] = c;
>  
>  	return 1;
> @@ -201,6 +220,9 @@ void trace_seq_terminate(struct trace_seq *s)
>  {
>  	TRACE_SEQ_CHECK(s);
>  
> +	if (s->state != TRACE_SEQ__GOOD)
> +		return;
> +
>  	/* There's always one character left on the buffer */
>  	s->buffer[s->len] = 0;
>  }
> @@ -208,5 +230,16 @@ void trace_seq_terminate(struct trace_seq *s)
>  int trace_seq_do_printf(struct trace_seq *s)
>  {
>  	TRACE_SEQ_CHECK(s);
> -	return printf("%.*s", s->len, s->buffer);
> +
> +	switch (s->state) {
> +	case TRACE_SEQ__GOOD:
> +		return printf("%.*s", s->len, s->buffer);
> +	case TRACE_SEQ__BUFFER_POISONED:
> +		puts("Usage of trace_seq after it was destroyed");
> +		break;
> +	case TRACE_SEQ__MEM_ALLOC_FAILED:
> +		puts("Can't allocate trace_seq buffer memory");
> +		break;
> +	}
> +	return -1;
>  }

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq
  2013-12-19  9:34 [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
                   ` (3 preceding siblings ...)
  2014-01-03  7:05 ` [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
@ 2014-01-03 13:24 ` Jiri Olsa
  2014-01-06  7:44   ` Namhyung Kim
  4 siblings, 1 reply; 10+ messages in thread
From: Jiri Olsa @ 2014-01-03 13:24 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Steven Rostedt, Arnaldo Carvalho de Melo, Frederic Weisbecker,
	Peter Zijlstra, Ingo Molnar, Namhyung Kim, LKML

On Thu, Dec 19, 2013 at 06:34:23PM +0900, Namhyung Kim wrote:
> From: Namhyung Kim <namhyung.kim@lge.com>
> 
> The trace_seq->state is for tracking errors during the use of
> trace_seq APIs and getting rid of die() in it.
> 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/lib/traceevent/event-parse.h |  7 +++++++
>  tools/lib/traceevent/trace-seq.c   | 41 ++++++++++++++++++++++++++++++++++----
>  2 files changed, 44 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
> index cf5db9013f2c..3c890cb28db7 100644
> --- a/tools/lib/traceevent/event-parse.h
> +++ b/tools/lib/traceevent/event-parse.h
> @@ -58,6 +58,12 @@ struct pevent_record {
>  #endif
>  };
>  
> +enum trace_seq_fail {
> +	TRACE_SEQ__GOOD,
> +	TRACE_SEQ__BUFFER_POISONED,
> +	TRACE_SEQ__MEM_ALLOC_FAILED,
> +};
> +
>  /*
>   * Trace sequences are used to allow a function to call several other functions
>   * to create a string of data to use (up to a max of PAGE_SIZE).
> @@ -68,6 +74,7 @@ struct trace_seq {
>  	unsigned int		buffer_size;
>  	unsigned int		len;
>  	unsigned int		readpos;
> +	enum trace_seq_fail	state;
>  };
>  
>  void trace_seq_init(struct trace_seq *s);
> diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
> index d7f2e68bc5b9..976ad2a146b3 100644
> --- a/tools/lib/traceevent/trace-seq.c
> +++ b/tools/lib/traceevent/trace-seq.c
> @@ -32,8 +32,8 @@
>  #define TRACE_SEQ_POISON	((void *)0xdeadbeef)
>  #define TRACE_SEQ_CHECK(s)						\
>  do {									\
> -	if ((s)->buffer == TRACE_SEQ_POISON)			\
> -		die("Usage of trace_seq after it was destroyed");	\
> +	if ((s)->buffer == TRACE_SEQ_POISON)				\
> +		(s)->state = TRACE_SEQ__BUFFER_POISONED;		\

So unless we use trace_seq_do_printf we dont have any
notification that this went wrong..?

How about use some sort of WARN_ONCE any time the state
is set != GOOD ?

thanks,
jirka

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq
  2014-01-03 13:24 ` Jiri Olsa
@ 2014-01-06  7:44   ` Namhyung Kim
  2014-01-06 14:38     ` Jiri Olsa
  0 siblings, 1 reply; 10+ messages in thread
From: Namhyung Kim @ 2014-01-06  7:44 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Steven Rostedt, Arnaldo Carvalho de Melo, Frederic Weisbecker,
	Peter Zijlstra, Ingo Molnar, Namhyung Kim, LKML

Hi Jiri,

On Fri, 3 Jan 2014 14:24:25 +0100, Jiri Olsa wrote:
> On Thu, Dec 19, 2013 at 06:34:23PM +0900, Namhyung Kim wrote:
>> From: Namhyung Kim <namhyung.kim@lge.com>
>> 
>> The trace_seq->state is for tracking errors during the use of
>> trace_seq APIs and getting rid of die() in it.
>> 
>> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
>> ---
>>  tools/lib/traceevent/event-parse.h |  7 +++++++
>>  tools/lib/traceevent/trace-seq.c   | 41 ++++++++++++++++++++++++++++++++++----
>>  2 files changed, 44 insertions(+), 4 deletions(-)
>> 
>> diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
>> index cf5db9013f2c..3c890cb28db7 100644
>> --- a/tools/lib/traceevent/event-parse.h
>> +++ b/tools/lib/traceevent/event-parse.h
>> @@ -58,6 +58,12 @@ struct pevent_record {
>>  #endif
>>  };
>>  
>> +enum trace_seq_fail {
>> +	TRACE_SEQ__GOOD,
>> +	TRACE_SEQ__BUFFER_POISONED,
>> +	TRACE_SEQ__MEM_ALLOC_FAILED,
>> +};
>> +
>>  /*
>>   * Trace sequences are used to allow a function to call several other functions
>>   * to create a string of data to use (up to a max of PAGE_SIZE).
>> @@ -68,6 +74,7 @@ struct trace_seq {
>>  	unsigned int		buffer_size;
>>  	unsigned int		len;
>>  	unsigned int		readpos;
>> +	enum trace_seq_fail	state;
>>  };
>>  
>>  void trace_seq_init(struct trace_seq *s);
>> diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
>> index d7f2e68bc5b9..976ad2a146b3 100644
>> --- a/tools/lib/traceevent/trace-seq.c
>> +++ b/tools/lib/traceevent/trace-seq.c
>> @@ -32,8 +32,8 @@
>>  #define TRACE_SEQ_POISON	((void *)0xdeadbeef)
>>  #define TRACE_SEQ_CHECK(s)						\
>>  do {									\
>> -	if ((s)->buffer == TRACE_SEQ_POISON)			\
>> -		die("Usage of trace_seq after it was destroyed");	\
>> +	if ((s)->buffer == TRACE_SEQ_POISON)				\
>> +		(s)->state = TRACE_SEQ__BUFFER_POISONED;		\
>
> So unless we use trace_seq_do_printf we dont have any
> notification that this went wrong..?

Right.

>
> How about use some sort of WARN_ONCE any time the state
> is set != GOOD ?

I'm not sure what's the right thing to do for that case.  Printing a
warning message might disturb user's output since it can be in a middle
of some (other) processing and she doesn't want to print anything during
the processing for some reason.

I just thought that it's not so important to print message so keeps the
error internally until it gets printed.  But I can be wrong as usual...

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq
  2014-01-06  7:44   ` Namhyung Kim
@ 2014-01-06 14:38     ` Jiri Olsa
  2014-01-06 14:45       ` Steven Rostedt
  0 siblings, 1 reply; 10+ messages in thread
From: Jiri Olsa @ 2014-01-06 14:38 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Steven Rostedt, Arnaldo Carvalho de Melo, Frederic Weisbecker,
	Peter Zijlstra, Ingo Molnar, Namhyung Kim, LKML

On Mon, Jan 06, 2014 at 04:44:18PM +0900, Namhyung Kim wrote:

SNIP

> >> +		(s)->state = TRACE_SEQ__BUFFER_POISONED;		\
> >
> > So unless we use trace_seq_do_printf we dont have any
> > notification that this went wrong..?
> 
> Right.
> 
> >
> > How about use some sort of WARN_ONCE any time the state
> > is set != GOOD ?
> 
> I'm not sure what's the right thing to do for that case.  Printing a
> warning message might disturb user's output since it can be in a middle
> of some (other) processing and she doesn't want to print anything during
> the processing for some reason.
> 
> I just thought that it's not so important to print message so keeps the
> error internally until it gets printed.  But I can be wrong as usual...

I think that if she manages to get one of those errors
the perf would fail soon anyway.. so it feels better
to print it out immediately.

jirka

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq
  2014-01-06 14:38     ` Jiri Olsa
@ 2014-01-06 14:45       ` Steven Rostedt
  2014-01-07  2:48         ` Namhyung Kim
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Rostedt @ 2014-01-06 14:45 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Namhyung Kim, Arnaldo Carvalho de Melo, Frederic Weisbecker,
	Peter Zijlstra, Ingo Molnar, Namhyung Kim, LKML

On Mon, 6 Jan 2014 15:38:28 +0100
Jiri Olsa <jolsa@redhat.com> wrote:


> > I just thought that it's not so important to print message so keeps the
> > error internally until it gets printed.  But I can be wrong as usual...
> 
> I think that if she manages to get one of those errors
> the perf would fail soon anyway.. so it feels better
> to print it out immediately.

Yeah, using a trace_seq after it has been destroyed is a critical
failure, and a major bug. A print to the user console should not be a
problem here. And actually, crashing is not that bad either, as glibc
does the same with using free() of a freed pointer.

But as this error is major, an unwanted print is minor.

-- Steve

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq
  2014-01-06 14:45       ` Steven Rostedt
@ 2014-01-07  2:48         ` Namhyung Kim
  0 siblings, 0 replies; 10+ messages in thread
From: Namhyung Kim @ 2014-01-07  2:48 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Jiri Olsa, Namhyung Kim, Arnaldo Carvalho de Melo,
	Frederic Weisbecker, Peter Zijlstra, Ingo Molnar, LKML

Hi Steve and Jiri,

2014-01-06 PM 11:45, Steven Rostedt wrote:
> On Mon, 6 Jan 2014 15:38:28 +0100
> Jiri Olsa <jolsa@redhat.com> wrote:
>
>
>>> I just thought that it's not so important to print message so keeps the
>>> error internally until it gets printed.  But I can be wrong as usual...
>>
>> I think that if she manages to get one of those errors
>> the perf would fail soon anyway.. so it feels better
>> to print it out immediately.
>
> Yeah, using a trace_seq after it has been destroyed is a critical
> failure, and a major bug. A print to the user console should not be a
> problem here. And actually, crashing is not that bad either, as glibc
> does the same with using free() of a freed pointer.
>
> But as this error is major, an unwanted print is minor.

OK, I'll add the WARN_ONCE in the TRACE_SEQ_CHECK then.

Thanks,
Namhyung


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-01-07  2:49 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-19  9:34 [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
2013-12-19  9:34 ` [PATCH 2/4] tools lib traceevent: Check return value of realloc() Namhyung Kim
2013-12-19  9:34 ` [PATCH 3/4] tools lib traceevent: Get rid of malloc_or_die() in trace_seq_init() Namhyung Kim
2013-12-19  9:34 ` [PATCH 4/4] tools lib traceevent: Get rid of die() finally!! Namhyung Kim
2014-01-03  7:05 ` [PATCH 1/4] tools lib traceevent: Add state member to struct trace_seq Namhyung Kim
2014-01-03 13:24 ` Jiri Olsa
2014-01-06  7:44   ` Namhyung Kim
2014-01-06 14:38     ` Jiri Olsa
2014-01-06 14:45       ` Steven Rostedt
2014-01-07  2:48         ` Namhyung Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).