On Fri, 26 Jun 2020 14:58:19 -0400
Steven Rostedt <rost...@goodmis.org> wrote:

> Second usage:
> 
>               /* SLOW PATH - Interrupted between A and C */
>               a_ok = rb_time_read(&cpu_buffer->write_stamp, &after);
>               ts = rb_time_stamp(cpu_buffer->buffer);
>               barrier();
>  /*E*/                if (write == (local_read(&tail_page->write) & 
> RB_WRITE_MASK) &&
>                   a_ok && after < ts) {
>                       /* Nothing came after this event between C and E */
>                       info->delta = ts - after;
>                       (void)rb_time_cmpxchg(&cpu_buffer->write_stamp, after, 
> info->ts);
>                       info->ts = ts;
>               } else {
>                       info->delta = 0;

Actually, I don't think a_ok can every be false here. An uninterrupted
event will leave with both before_stamp and write_stamp valid. As an
uninterrupted event will write to both (and a rb_time_t is only invalid
from reading an interrupted event).

To get to this path we have:

        w = local_read(write_tail);

        <--- Interrupt event (makes write_stamp valid!)

        write = local_add_return(write_tail, length);

        w != write - length;


        [..]

        a_ok = rb_time_read(write_stamp);

Must always be valid!

-- Steve

Reply via email to