• O
    tracing: Simplify the iteration logic in f_start/f_next · 7710b639
    Oleg Nesterov 提交于
    f_next() looks overcomplicated, and it is not strictly correct
    even if this doesn't matter.
    
    Say, FORMAT_FIELD_SEPERATOR should not return NULL (means EOF)
    if trace_get_fields() returns an empty list, we should simply
    advance to FORMAT_PRINTFMT as we do when we find the end of list.
    
    1. Change f_next() to return "struct list_head *" rather than
       "ftrace_event_field *", and change f_show() to do list_entry().
    
       This simplifies the code a bit, only f_show() needs to know
       about ftrace_event_field, and f_next() can play with ->prev
       directly
    
    2. Change f_next() to not play with ->prev / return inside the
       switch() statement. It can simply set node = head/common_head,
       the prev-or-advance-to-the-next-magic below does all work.
    
    While at it. f_start() looks overcomplicated too. I don't think
    *pos == 0 makes sense as a separate case, just change this code
    to do "while" instead of "do/while".
    
    The patch also moves f_start() down, close to f_stop(). This is
    purely cosmetic, just to make the locking added by the next patch
    more clear/visible.
    
    Link: http://lkml.kernel.org/r/20130718184710.GA4783@redhat.comSigned-off-by: NOleg Nesterov <oleg@redhat.com>
    Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
    7710b639
trace_events.c 61.7 KB