ring-buffer: document reader page design
In a private email conversation I explained how the ring buffer page worked by using silly ASCII art. Ingo suggested that I add that to the comments of the code. Here it is. Requested-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Steven Rostedt <srostedt@redhat.com>
This commit is contained in:
Родитель
f28e55765e
Коммит
5cc9854888
|
@ -21,6 +21,74 @@
|
|||
|
||||
#include "trace.h"
|
||||
|
||||
/*
|
||||
* The ring buffer is made up of a list of pages. A separate list of pages is
|
||||
* allocated for each CPU. A writer may only write to a buffer that is
|
||||
* associated with the CPU it is currently executing on. A reader may read
|
||||
* from any per cpu buffer.
|
||||
*
|
||||
* The reader is special. For each per cpu buffer, the reader has its own
|
||||
* reader page. When a reader has read the entire reader page, this reader
|
||||
* page is swapped with another page in the ring buffer.
|
||||
*
|
||||
* Now, as long as the writer is off the reader page, the reader can do what
|
||||
* ever it wants with that page. The writer will never write to that page
|
||||
* again (as long as it is out of the ring buffer).
|
||||
*
|
||||
* Here's some silly ASCII art.
|
||||
*
|
||||
* +------+
|
||||
* |reader| RING BUFFER
|
||||
* |page |
|
||||
* +------+ +---+ +---+ +---+
|
||||
* | |-->| |-->| |
|
||||
* +---+ +---+ +---+
|
||||
* ^ |
|
||||
* | |
|
||||
* +---------------+
|
||||
*
|
||||
*
|
||||
* +------+
|
||||
* |reader| RING BUFFER
|
||||
* |page |------------------v
|
||||
* +------+ +---+ +---+ +---+
|
||||
* | |-->| |-->| |
|
||||
* +---+ +---+ +---+
|
||||
* ^ |
|
||||
* | |
|
||||
* +---------------+
|
||||
*
|
||||
*
|
||||
* +------+
|
||||
* |reader| RING BUFFER
|
||||
* |page |------------------v
|
||||
* +------+ +---+ +---+ +---+
|
||||
* ^ | |-->| |-->| |
|
||||
* | +---+ +---+ +---+
|
||||
* | |
|
||||
* | |
|
||||
* +------------------------------+
|
||||
*
|
||||
*
|
||||
* +------+
|
||||
* |buffer| RING BUFFER
|
||||
* |page |------------------v
|
||||
* +------+ +---+ +---+ +---+
|
||||
* ^ | | | |-->| |
|
||||
* | New +---+ +---+ +---+
|
||||
* | Reader------^ |
|
||||
* | page |
|
||||
* +------------------------------+
|
||||
*
|
||||
*
|
||||
* After we make this swap, the reader can hand this page off to the splice
|
||||
* code and be done with it. It can even allocate a new page if it needs to
|
||||
* and swap that into the ring buffer.
|
||||
*
|
||||
* We will be using cmpxchg soon to make all this lockless.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* A fast way to enable or disable all ring buffers is to
|
||||
* call tracing_on or tracing_off. Turning off the ring buffers
|
||||
|
|
Загрузка…
Ссылка в новой задаче