* [ltt-dev] [RFC UST PATCH] Code base to fix the print errors in UST
@ 2011-02-25 17:55 David Goulet
2011-02-25 18:07 ` Mathieu Desnoyers
0 siblings, 1 reply; 2+ messages in thread
From: David Goulet @ 2011-02-25 17:55 UTC (permalink / raw)
The last problem is the commit_count in ust_buffer. It's not
allocated in the shared memory thus cannot be access via
the buffer_info struct.
So, with this code, the consumerd segfault when accessing
these counters.
---
include/ust/ustconsumer.h | 4 ++
libust/buffers.c | 80 +--------------------------------------
libustconsumer/libustconsumer.c | 4 ++
libustconsumer/lowlevel.c | 64 +++++++++++++++++++++++++++++++
4 files changed, 73 insertions(+), 79 deletions(-)
diff --git a/include/ust/ustconsumer.h b/include/ust/ustconsumer.h
index e07b75e..f99f8f1 100644
--- a/include/ust/ustconsumer.h
+++ b/include/ust/ustconsumer.h
@@ -57,6 +57,10 @@ struct buffer_info {
int n_subbufs;
/* size of each subbuffer */
int subbuf_size;
+ /* subbuf size count order */
+ int subbuf_size_order;
+ /* alloc size of all subbuf */
+ int alloc_size;
/* the buffer information struct */
void *bufstruct_mem;
diff --git a/libust/buffers.c b/libust/buffers.c
index 4011b64..ba293f4 100644
--- a/libust/buffers.c
+++ b/libust/buffers.c
@@ -254,8 +254,6 @@ unmap_buf:
return -1;
}
-static void ltt_relay_print_buffer_errors(struct ust_channel *chan, int cpu);
-
static void close_buf(struct ust_buffer *buf)
{
struct ust_channel *chan = buf->chan;
@@ -267,7 +265,7 @@ static void close_buf(struct ust_buffer *buf)
PERROR("shmdt");
}
- free(buf->commit_count);
+ //free(buf->commit_count);
result = close(buf->data_ready_fd_read);
if (result < 0) {
@@ -278,9 +276,6 @@ static void close_buf(struct ust_buffer *buf)
if (result < 0 && errno != EBADF) {
PERROR("close");
}
-
- /* FIXME: This spews out errors, are they real?:
- * ltt_relay_print_buffer_errors(chan, cpu); */
}
@@ -517,78 +512,6 @@ int ust_buffers_put_subbuf(struct ust_buffer *buf, unsigned long uconsumed_old)
return 0;
}
-static void ltt_relay_print_subbuffer_errors(
- struct ust_channel *channel,
- long cons_off, int cpu)
-{
- struct ust_buffer *ltt_buf = channel->buf[cpu];
- long cons_idx, commit_count, commit_count_sb, write_offset;
-
- cons_idx = SUBBUF_INDEX(cons_off, channel);
- commit_count = uatomic_read(<t_buf->commit_count[cons_idx].cc);
- commit_count_sb = uatomic_read(<t_buf->commit_count[cons_idx].cc_sb);
-
- /*
- * No need to order commit_count and write_offset reads because we
- * execute after trace is stopped when there are no readers left.
- */
- write_offset = uatomic_read(<t_buf->offset);
- WARN( "LTT : unread channel %s offset is %ld "
- "and cons_off : %ld (cpu %d)\n",
- channel->channel_name, write_offset, cons_off, cpu);
- /* Check each sub-buffer for non filled commit count */
- if (((commit_count - channel->subbuf_size) & channel->commit_count_mask)
- - (BUFFER_TRUNC(cons_off, channel) >> channel->n_subbufs_order) != 0) {
- ERR("LTT : %s : subbuffer %lu has non filled "
- "commit count [cc, cc_sb] [%lu,%lu].\n",
- channel->channel_name, cons_idx, commit_count, commit_count_sb);
- }
- ERR("LTT : %s : commit count : %lu, subbuf size %zd\n",
- channel->channel_name, commit_count,
- channel->subbuf_size);
-}
-
-static void ltt_relay_print_errors(struct ust_trace *trace,
- struct ust_channel *channel, int cpu)
-{
- struct ust_buffer *ltt_buf = channel->buf[cpu];
- long cons_off;
-
- /*
- * Can be called in the error path of allocation when
- * trans_channel_data is not yet set.
- */
- if (!channel)
- return;
-
-//ust// for (cons_off = 0; cons_off < rchan->alloc_size;
-//ust// cons_off = SUBBUF_ALIGN(cons_off, rchan))
-//ust// ust_buffers_print_written(ltt_chan, cons_off, cpu);
- for (cons_off = uatomic_read(<t_buf->consumed);
- (SUBBUF_TRUNC(uatomic_read(<t_buf->offset),
- channel)
- - cons_off) > 0;
- cons_off = SUBBUF_ALIGN(cons_off, channel))
- ltt_relay_print_subbuffer_errors(channel, cons_off, cpu);
-}
-
-static void ltt_relay_print_buffer_errors(struct ust_channel *channel, int cpu)
-{
- struct ust_trace *trace = channel->trace;
- struct ust_buffer *ltt_buf = channel->buf[cpu];
-
- if (uatomic_read(<t_buf->events_lost))
- ERR("channel %s: %ld events lost (cpu %d)",
- channel->channel_name,
- uatomic_read(<t_buf->events_lost), cpu);
- if (uatomic_read(<t_buf->corrupted_subbuffers))
- ERR("channel %s : %ld corrupted subbuffers (cpu %d)",
- channel->channel_name,
- uatomic_read(<t_buf->corrupted_subbuffers), cpu);
-
- ltt_relay_print_errors(trace, channel, cpu);
-}
-
static int map_buf_structs(struct ust_channel *chan)
{
void *ptr;
@@ -721,7 +644,6 @@ static void remove_channel(struct ust_channel *chan)
free(chan->buf_struct_shmids);
free(chan->buf);
-
}
static void ltt_relay_async_wakeup_chan(struct ust_channel *ltt_channel)
diff --git a/libustconsumer/libustconsumer.c b/libustconsumer/libustconsumer.c
index c51b106..ef54fe8 100644
--- a/libustconsumer/libustconsumer.c
+++ b/libustconsumer/libustconsumer.c
@@ -353,6 +353,10 @@ struct buffer_info *connect_buffer(struct ustconsumer_instance *instance, pid_t
goto close_fifo;
}
+ /* Set subbuffer's information */
+ buf->subbuf_size_order = get_count_order(buf->subbuf_size);
+ buf->alloc_size = buf->subbuf_size * buf->n_subbufs;
+
/* attach memory */
buf->mem = shmat(buf->shmid, NULL, 0);
if(buf->mem == (void *) 0) {
diff --git a/libustconsumer/lowlevel.c b/libustconsumer/lowlevel.c
index 730dd11..a65ae4d 100644
--- a/libustconsumer/lowlevel.c
+++ b/libustconsumer/lowlevel.c
@@ -31,6 +31,67 @@
#define LTT_MAGIC_NUMBER 0x00D6B7ED
#define LTT_REV_MAGIC_NUMBER 0xEDB7D600
+
+static void ltt_relay_print_subbuffer_errors(
+ struct buffer_info *buf,
+ long cons_off, int cpu)
+{
+ struct ust_buffer *ust_buf = buf->bufstruct_mem;
+ long cons_idx, commit_count, commit_count_sb, commit_count_mask, write_offset;
+
+ cons_idx = SUBBUF_INDEX(cons_off, buf);
+ commit_count = uatomic_read(&ust_buf->commit_count[cons_idx].cc);
+ commit_count_sb = uatomic_read(&ust_buf->commit_count[cons_idx].cc_sb);
+ commit_count_mask = (~0UL >> get_count_order(buf->n_subbufs));
+
+ /*
+ * No need to order commit_count and write_offset reads because we
+ * execute after trace is stopped when there are no readers left.
+ */
+ write_offset = uatomic_read(&ust_buf->offset);
+ WARN( "LTT : unread channel %s offset is %ld "
+ "and cons_off : %ld (cpu %d)\n",
+ buf->channel, write_offset, cons_off, cpu);
+ /* Check each sub-buffer for non filled commit count */
+ if (((commit_count - buf->subbuf_size) & commit_count_mask)
+ - (BUFFER_TRUNC(cons_off, buf) >> get_count_order(buf->n_subbufs)) != 0) {
+ ERR("LTT : %s : subbuffer %lu has non filled "
+ "commit count [cc, cc_sb] [%lu,%lu].\n",
+ buf->channel, cons_idx, commit_count, commit_count_sb);
+ }
+ ERR("LTT : %s : commit count : %lu, subbuf size %d\n",
+ buf->channel, commit_count,
+ buf->subbuf_size);
+}
+
+static void ltt_relay_print_errors(struct buffer_info *buf, int cpu)
+{
+ struct ust_buffer *ust_buf = buf->bufstruct_mem;
+ long cons_off;
+
+ for (cons_off = uatomic_read(&ust_buf->consumed);
+ (SUBBUF_TRUNC(uatomic_read(&ust_buf->offset), buf)
+ - cons_off) > 0;
+ cons_off = SUBBUF_ALIGN(cons_off, buf))
+ ltt_relay_print_subbuffer_errors(buf, cons_off, cpu);
+}
+
+static void ltt_relay_print_buffer_errors(struct buffer_info *buf, int cpu)
+{
+ struct ust_buffer *ust_buf = buf->bufstruct_mem;
+
+ if (uatomic_read(&ust_buf->events_lost))
+ ERR("channel %s: %ld events lost (cpu %d)",
+ buf->channel,
+ uatomic_read(&ust_buf->events_lost), cpu);
+ if (uatomic_read(&ust_buf->corrupted_subbuffers))
+ ERR("channel %s : %ld corrupted subbuffers (cpu %d)",
+ buf->channel,
+ uatomic_read(&ust_buf->corrupted_subbuffers), cpu);
+
+ ltt_relay_print_errors(buf, cpu);
+}
+
/* Returns the size of a subbuffer size. This is the size that
* will need to be written to disk.
*
@@ -86,6 +147,9 @@ void finish_consuming_dead_subbuffer(struct ustconsumer_callbacks *callbacks, st
DBG("first_subbuf=%ld", first_subbuf);
DBG("last_subbuf=%ld", last_subbuf);
+ printf("PRINT ERRORS\n");
+ ltt_relay_print_buffer_errors(buf, buf->channel_cpu);
+
if(last_subbuf - first_subbuf >= buf->n_subbufs) {
DBG("an overflow has occurred, nothing can be recovered");
return;
--
1.7.4.1
^ permalink raw reply [flat|nested] 2+ messages in thread* [ltt-dev] [RFC UST PATCH] Code base to fix the print errors in UST
2011-02-25 17:55 [ltt-dev] [RFC UST PATCH] Code base to fix the print errors in UST David Goulet
@ 2011-02-25 18:07 ` Mathieu Desnoyers
0 siblings, 0 replies; 2+ messages in thread
From: Mathieu Desnoyers @ 2011-02-25 18:07 UTC (permalink / raw)
* David Goulet (david.goulet at polymtl.ca) wrote:
> The last problem is the commit_count in ust_buffer. It's not
> allocated in the shared memory thus cannot be access via
> the buffer_info struct.
>
> So, with this code, the consumerd segfault when accessing
> these counters.
replace "commit_count" by "commit_seq" in the error printing function
and everything should work fine. "commit_seq" is exported (it's at the
end of the struct buf, as a variable-length array), and is what we
should use.
Thanks,
Mathieu
> ---
> include/ust/ustconsumer.h | 4 ++
> libust/buffers.c | 80 +--------------------------------------
> libustconsumer/libustconsumer.c | 4 ++
> libustconsumer/lowlevel.c | 64 +++++++++++++++++++++++++++++++
> 4 files changed, 73 insertions(+), 79 deletions(-)
>
> diff --git a/include/ust/ustconsumer.h b/include/ust/ustconsumer.h
> index e07b75e..f99f8f1 100644
> --- a/include/ust/ustconsumer.h
> +++ b/include/ust/ustconsumer.h
> @@ -57,6 +57,10 @@ struct buffer_info {
> int n_subbufs;
> /* size of each subbuffer */
> int subbuf_size;
> + /* subbuf size count order */
> + int subbuf_size_order;
> + /* alloc size of all subbuf */
> + int alloc_size;
>
> /* the buffer information struct */
> void *bufstruct_mem;
> diff --git a/libust/buffers.c b/libust/buffers.c
> index 4011b64..ba293f4 100644
> --- a/libust/buffers.c
> +++ b/libust/buffers.c
> @@ -254,8 +254,6 @@ unmap_buf:
> return -1;
> }
>
> -static void ltt_relay_print_buffer_errors(struct ust_channel *chan, int cpu);
> -
> static void close_buf(struct ust_buffer *buf)
> {
> struct ust_channel *chan = buf->chan;
> @@ -267,7 +265,7 @@ static void close_buf(struct ust_buffer *buf)
> PERROR("shmdt");
> }
>
> - free(buf->commit_count);
> + //free(buf->commit_count);
>
> result = close(buf->data_ready_fd_read);
> if (result < 0) {
> @@ -278,9 +276,6 @@ static void close_buf(struct ust_buffer *buf)
> if (result < 0 && errno != EBADF) {
> PERROR("close");
> }
> -
> - /* FIXME: This spews out errors, are they real?:
> - * ltt_relay_print_buffer_errors(chan, cpu); */
> }
>
>
> @@ -517,78 +512,6 @@ int ust_buffers_put_subbuf(struct ust_buffer *buf, unsigned long uconsumed_old)
> return 0;
> }
>
> -static void ltt_relay_print_subbuffer_errors(
> - struct ust_channel *channel,
> - long cons_off, int cpu)
> -{
> - struct ust_buffer *ltt_buf = channel->buf[cpu];
> - long cons_idx, commit_count, commit_count_sb, write_offset;
> -
> - cons_idx = SUBBUF_INDEX(cons_off, channel);
> - commit_count = uatomic_read(<t_buf->commit_count[cons_idx].cc);
> - commit_count_sb = uatomic_read(<t_buf->commit_count[cons_idx].cc_sb);
> -
> - /*
> - * No need to order commit_count and write_offset reads because we
> - * execute after trace is stopped when there are no readers left.
> - */
> - write_offset = uatomic_read(<t_buf->offset);
> - WARN( "LTT : unread channel %s offset is %ld "
> - "and cons_off : %ld (cpu %d)\n",
> - channel->channel_name, write_offset, cons_off, cpu);
> - /* Check each sub-buffer for non filled commit count */
> - if (((commit_count - channel->subbuf_size) & channel->commit_count_mask)
> - - (BUFFER_TRUNC(cons_off, channel) >> channel->n_subbufs_order) != 0) {
> - ERR("LTT : %s : subbuffer %lu has non filled "
> - "commit count [cc, cc_sb] [%lu,%lu].\n",
> - channel->channel_name, cons_idx, commit_count, commit_count_sb);
> - }
> - ERR("LTT : %s : commit count : %lu, subbuf size %zd\n",
> - channel->channel_name, commit_count,
> - channel->subbuf_size);
> -}
> -
> -static void ltt_relay_print_errors(struct ust_trace *trace,
> - struct ust_channel *channel, int cpu)
> -{
> - struct ust_buffer *ltt_buf = channel->buf[cpu];
> - long cons_off;
> -
> - /*
> - * Can be called in the error path of allocation when
> - * trans_channel_data is not yet set.
> - */
> - if (!channel)
> - return;
> -
> -//ust// for (cons_off = 0; cons_off < rchan->alloc_size;
> -//ust// cons_off = SUBBUF_ALIGN(cons_off, rchan))
> -//ust// ust_buffers_print_written(ltt_chan, cons_off, cpu);
> - for (cons_off = uatomic_read(<t_buf->consumed);
> - (SUBBUF_TRUNC(uatomic_read(<t_buf->offset),
> - channel)
> - - cons_off) > 0;
> - cons_off = SUBBUF_ALIGN(cons_off, channel))
> - ltt_relay_print_subbuffer_errors(channel, cons_off, cpu);
> -}
> -
> -static void ltt_relay_print_buffer_errors(struct ust_channel *channel, int cpu)
> -{
> - struct ust_trace *trace = channel->trace;
> - struct ust_buffer *ltt_buf = channel->buf[cpu];
> -
> - if (uatomic_read(<t_buf->events_lost))
> - ERR("channel %s: %ld events lost (cpu %d)",
> - channel->channel_name,
> - uatomic_read(<t_buf->events_lost), cpu);
> - if (uatomic_read(<t_buf->corrupted_subbuffers))
> - ERR("channel %s : %ld corrupted subbuffers (cpu %d)",
> - channel->channel_name,
> - uatomic_read(<t_buf->corrupted_subbuffers), cpu);
> -
> - ltt_relay_print_errors(trace, channel, cpu);
> -}
> -
> static int map_buf_structs(struct ust_channel *chan)
> {
> void *ptr;
> @@ -721,7 +644,6 @@ static void remove_channel(struct ust_channel *chan)
> free(chan->buf_struct_shmids);
>
> free(chan->buf);
> -
> }
>
> static void ltt_relay_async_wakeup_chan(struct ust_channel *ltt_channel)
> diff --git a/libustconsumer/libustconsumer.c b/libustconsumer/libustconsumer.c
> index c51b106..ef54fe8 100644
> --- a/libustconsumer/libustconsumer.c
> +++ b/libustconsumer/libustconsumer.c
> @@ -353,6 +353,10 @@ struct buffer_info *connect_buffer(struct ustconsumer_instance *instance, pid_t
> goto close_fifo;
> }
>
> + /* Set subbuffer's information */
> + buf->subbuf_size_order = get_count_order(buf->subbuf_size);
> + buf->alloc_size = buf->subbuf_size * buf->n_subbufs;
> +
> /* attach memory */
> buf->mem = shmat(buf->shmid, NULL, 0);
> if(buf->mem == (void *) 0) {
> diff --git a/libustconsumer/lowlevel.c b/libustconsumer/lowlevel.c
> index 730dd11..a65ae4d 100644
> --- a/libustconsumer/lowlevel.c
> +++ b/libustconsumer/lowlevel.c
> @@ -31,6 +31,67 @@
> #define LTT_MAGIC_NUMBER 0x00D6B7ED
> #define LTT_REV_MAGIC_NUMBER 0xEDB7D600
>
> +
> +static void ltt_relay_print_subbuffer_errors(
> + struct buffer_info *buf,
> + long cons_off, int cpu)
> +{
> + struct ust_buffer *ust_buf = buf->bufstruct_mem;
> + long cons_idx, commit_count, commit_count_sb, commit_count_mask, write_offset;
> +
> + cons_idx = SUBBUF_INDEX(cons_off, buf);
> + commit_count = uatomic_read(&ust_buf->commit_count[cons_idx].cc);
> + commit_count_sb = uatomic_read(&ust_buf->commit_count[cons_idx].cc_sb);
> + commit_count_mask = (~0UL >> get_count_order(buf->n_subbufs));
> +
> + /*
> + * No need to order commit_count and write_offset reads because we
> + * execute after trace is stopped when there are no readers left.
> + */
> + write_offset = uatomic_read(&ust_buf->offset);
> + WARN( "LTT : unread channel %s offset is %ld "
> + "and cons_off : %ld (cpu %d)\n",
> + buf->channel, write_offset, cons_off, cpu);
> + /* Check each sub-buffer for non filled commit count */
> + if (((commit_count - buf->subbuf_size) & commit_count_mask)
> + - (BUFFER_TRUNC(cons_off, buf) >> get_count_order(buf->n_subbufs)) != 0) {
> + ERR("LTT : %s : subbuffer %lu has non filled "
> + "commit count [cc, cc_sb] [%lu,%lu].\n",
> + buf->channel, cons_idx, commit_count, commit_count_sb);
> + }
> + ERR("LTT : %s : commit count : %lu, subbuf size %d\n",
> + buf->channel, commit_count,
> + buf->subbuf_size);
> +}
> +
> +static void ltt_relay_print_errors(struct buffer_info *buf, int cpu)
> +{
> + struct ust_buffer *ust_buf = buf->bufstruct_mem;
> + long cons_off;
> +
> + for (cons_off = uatomic_read(&ust_buf->consumed);
> + (SUBBUF_TRUNC(uatomic_read(&ust_buf->offset), buf)
> + - cons_off) > 0;
> + cons_off = SUBBUF_ALIGN(cons_off, buf))
> + ltt_relay_print_subbuffer_errors(buf, cons_off, cpu);
> +}
> +
> +static void ltt_relay_print_buffer_errors(struct buffer_info *buf, int cpu)
> +{
> + struct ust_buffer *ust_buf = buf->bufstruct_mem;
> +
> + if (uatomic_read(&ust_buf->events_lost))
> + ERR("channel %s: %ld events lost (cpu %d)",
> + buf->channel,
> + uatomic_read(&ust_buf->events_lost), cpu);
> + if (uatomic_read(&ust_buf->corrupted_subbuffers))
> + ERR("channel %s : %ld corrupted subbuffers (cpu %d)",
> + buf->channel,
> + uatomic_read(&ust_buf->corrupted_subbuffers), cpu);
> +
> + ltt_relay_print_errors(buf, cpu);
> +}
> +
> /* Returns the size of a subbuffer size. This is the size that
> * will need to be written to disk.
> *
> @@ -86,6 +147,9 @@ void finish_consuming_dead_subbuffer(struct ustconsumer_callbacks *callbacks, st
> DBG("first_subbuf=%ld", first_subbuf);
> DBG("last_subbuf=%ld", last_subbuf);
>
> + printf("PRINT ERRORS\n");
> + ltt_relay_print_buffer_errors(buf, buf->channel_cpu);
> +
> if(last_subbuf - first_subbuf >= buf->n_subbufs) {
> DBG("an overflow has occurred, nothing can be recovered");
> return;
> --
> 1.7.4.1
>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-02-25 18:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-02-25 17:55 [ltt-dev] [RFC UST PATCH] Code base to fix the print errors in UST David Goulet
2011-02-25 18:07 ` Mathieu Desnoyers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox