lkml.org 
[lkml]   [2020]   [Jul]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH v5 2/4] printk: add lockless ringbuffer
    On (20/07/09 15:29), John Ogness wrote:
    [..]
    > +/*
    > + * A data block: mapped directly to the beginning of the data block area
    > + * specified as a logical position within the data ring.
    > + *
    > + * @id: the ID of the associated descriptor
    > + * @data: the writer data
    > + *
    > + * Note that the size of a data block is only known by its associated
    > + * descriptor.
    > + */
    > +struct prb_data_block {
    > + unsigned long id;
    > + char data[0];
    > +};

    A nit: I think someone will send "Replace zero-length arrays with
    flexible array member" soon enough:

    - char data[0];
    + char data[];

    [..]
    > +/*
    > + * Sanity checker for reserve size. The ringbuffer code assumes that a data
    > + * block does not exceed the maximum possible size that could fit within the
    > + * ringbuffer. This function provides that basic size check so that the
    > + * assumption is safe.
    > + *
    > + * Writers are also not allowed to write 0-sized (data-less) records. Such
    > + * records are used only internally by the ringbuffer.
    > + */
    > +static bool data_check_size(struct prb_data_ring *data_ring, unsigned int size)
    > +{
    > + struct prb_data_block *db = NULL;
    > +
    > + /*
    > + * Writers are not allowed to write data-less records. Such records
    > + * are used only internally by the ringbuffer to denote records where
    > + * their data failed to allocate or have been lost.
    > + */

    A nit: The same data-less records comment is some 5 lines earlier. But OK.

    > + if (size == 0)
    > + return false;

    [..]

    > +void prb_init(struct printk_ringbuffer *rb,
    > + char *text_buf, unsigned int textbits,
    > + char *dict_buf, unsigned int dictbits,
    > + struct prb_desc *descs, unsigned int descbits)
    > +{
    > + memset(descs, 0, _DESCS_COUNT(descbits) * sizeof(descs[0]));
    > +
    > + rb->desc_ring.count_bits = descbits;
    > + rb->desc_ring.descs = descs;
    > + atomic_long_set(&rb->desc_ring.head_id, DESC0_ID(descbits));
    > + atomic_long_set(&rb->desc_ring.tail_id, DESC0_ID(descbits));
    > +
    > + rb->text_data_ring.size_bits = textbits;
    > + rb->text_data_ring.data = text_buf;
    > + atomic_long_set(&rb->text_data_ring.head_lpos, BLK0_LPOS(textbits));
    > + atomic_long_set(&rb->text_data_ring.tail_lpos, BLK0_LPOS(textbits));
    > +
    > + rb->dict_data_ring.size_bits = dictbits;
    > + rb->dict_data_ring.data = dict_buf;
    > + atomic_long_set(&rb->dict_data_ring.head_lpos, BLK0_LPOS(dictbits));
    > + atomic_long_set(&rb->dict_data_ring.tail_lpos, BLK0_LPOS(dictbits));
    > +

    Just a side note: some people want !CONFIG_PRINTK builds. I wonder
    how many people will want !CONFIG_PRINTK_DICT. The core logbuf/dict
    logbuf split is really cool.

    -ss

    \
     
     \ /
      Last update: 2020-07-10 10:43    [W:7.609 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site