• John Ogness's avatar
    printk: add lockless ringbuffer · b6cf8b3f
    John Ogness authored
    Introduce a multi-reader multi-writer lockless ringbuffer for storing
    the kernel log messages. Readers and writers may use their API from
    any context (including scheduler and NMI). This ringbuffer will make
    it possible to decouple printk() callers from any context, locking,
    or console constraints. It also makes it possible for readers to have
    full access to the ringbuffer contents at any time and context (for
    example from any panic situation).
    
    The printk_ringbuffer is made up of 3 internal ringbuffers:
    
    desc_ring:
    A ring of descriptors. A descriptor contains all record meta data
    (sequence number, timestamp, loglevel, etc.) as well as internal state
    information about the record and logical positions specifying where in
    the other ringbuffers the text and dictionary strings are located.
    
    text_data_ring:
    A ring of data blocks. A data block consists of an unsigned long
    integer (ID) that maps to a desc_ring index followed by the text
    string of the record.
    
    dict_data_ring:
    A ring of data blocks. A data block consists of an unsigned long
    integer (ID) that maps to a desc_ring index followed by the dictionary
    string of the record.
    
    The internal state information of a descriptor is the key element to
    allow readers and writers to locklessly synchronize access to the data.
    Co-developed-by: default avatarPetr Mladek <pmladek@suse.com>
    Signed-off-by: default avatarJohn Ogness <john.ogness@linutronix.de>
    Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
    Reviewed-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20200709132344.760-3-john.ogness@linutronix.de
    b6cf8b3f
printk_ringbuffer.c 53.9 KB