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 _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec