• Linus Torvalds's avatar
    Merge tag 'trace-ring-buffer-v6.8-rc7-2' of... · 63bd30f2
    Linus Torvalds authored
    Merge tag 'trace-ring-buffer-v6.8-rc7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
    
    Pull tracing updates from Steven Rostedt:
    
     - Do not update shortest_full in rb_watermark_hit() if the watermark is
       hit. The shortest_full field was being updated regardless if the task
       was going to wait or not. If the watermark is hit, then the task is
       not going to wait, so do not update the shortest_full field (used by
       the waker).
    
     - Update shortest_full field before setting the full_waiters_pending
       flag
    
       In the poll logic, the full_waiters_pending flag was being set before
       the shortest_full field was set. If the full_waiters_pending flag is
       set, writers will check the shortest_full field which has the least
       percentage of data that the ring buffer needs to be filled before
       waking up. The writer will check shortest_full if
       full_waiters_pending is set, and if the ring buffer percentage filled
       is greater than shortest full, then it will call the irq_work to wake
       up the waiters.
    
       The problem was that the poll logic set the full_waiters_pending flag
       before updating shortest_full, which when zero will always trigger
       the writer to call the irq_work to wake up the waiters. The irq_work
       will reset the shortest_full field back to zero as the woken waiters
       is suppose to reset it.
    
     - There's some optimized logic in the rb_watermark_hit() that is used
       in ring_buffer_wait(). Use that helper function in the poll logic as
       well.
    
     - Restructure ring_buffer_wait() to use wait_event_interruptible()
    
       The logic to wake up pending readers when the file descriptor is
       closed is racy. Restructure ring_buffer_wait() to allow callers to
       pass in conditions besides the ring buffer having enough data in it
       by using wait_event_interruptible().
    
     - Update the tracing_wait_on_pipe() to call ring_buffer_wait() with its
       own conditions to exit the wait loop.
    
    * tag 'trace-ring-buffer-v6.8-rc7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
      tracing/ring-buffer: Fix wait_on_pipe() race
      ring-buffer: Use wait_event_interruptible() in ring_buffer_wait()
      ring-buffer: Reuse rb_watermark_hit() for the poll logic
      ring-buffer: Fix full_waiters_pending in poll
      ring-buffer: Do not set shortest_full when full target is hit
    63bd30f2
trace.c 264 KB