Merge branch 'rework/prb-fixes' into for-linus
commit
add9d911be
|
|
@ -14,7 +14,7 @@
|
||||||
*
|
*
|
||||||
* Data Structure
|
* Data Structure
|
||||||
* --------------
|
* --------------
|
||||||
* The printk_ringbuffer is made up of 3 internal ringbuffers:
|
* The printk_ringbuffer is made up of 2 internal ringbuffers:
|
||||||
*
|
*
|
||||||
* desc_ring
|
* desc_ring
|
||||||
* A ring of descriptors and their meta data (such as sequence number,
|
* A ring of descriptors and their meta data (such as sequence number,
|
||||||
|
|
@ -224,7 +224,7 @@
|
||||||
*
|
*
|
||||||
* prb_rec_init_rd(&r, &info, &text_buf[0], sizeof(text_buf));
|
* prb_rec_init_rd(&r, &info, &text_buf[0], sizeof(text_buf));
|
||||||
*
|
*
|
||||||
* prb_for_each_record(0, &test_rb, &seq, &r) {
|
* prb_for_each_record(0, &test_rb, seq, &r) {
|
||||||
* if (info.seq != seq)
|
* if (info.seq != seq)
|
||||||
* pr_warn("lost %llu records\n", info.seq - seq);
|
* pr_warn("lost %llu records\n", info.seq - seq);
|
||||||
*
|
*
|
||||||
|
|
@ -1302,23 +1302,26 @@ static const char *get_data(struct prb_data_ring *data_ring,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sanity check. Data-less blocks were handled earlier. */
|
|
||||||
if (WARN_ON_ONCE(!data_check_size(data_ring, *data_size) || !*data_size))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* A valid data block will always be aligned to the ID size. */
|
/* A valid data block will always be aligned to the ID size. */
|
||||||
if (WARN_ON_ONCE(blk_lpos->begin != ALIGN(blk_lpos->begin, sizeof(db->id))) ||
|
if (WARN_ON_ONCE(blk_lpos->begin != ALIGN(blk_lpos->begin, sizeof(db->id))) ||
|
||||||
WARN_ON_ONCE(blk_lpos->next != ALIGN(blk_lpos->next, sizeof(db->id)))) {
|
WARN_ON_ONCE(blk_lpos->next != ALIGN(blk_lpos->next, sizeof(db->id)))) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A valid data block will always have at least an ID. */
|
/*
|
||||||
if (WARN_ON_ONCE(*data_size < sizeof(db->id)))
|
* A regular data block will always have an ID and at least
|
||||||
|
* 1 byte of data. Data-less blocks were handled earlier.
|
||||||
|
*/
|
||||||
|
if (WARN_ON_ONCE(*data_size <= sizeof(db->id)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Subtract block ID space from size to reflect data size. */
|
/* Subtract block ID space from size to reflect data size. */
|
||||||
*data_size -= sizeof(db->id);
|
*data_size -= sizeof(db->id);
|
||||||
|
|
||||||
|
/* Sanity check the max size of the regular data block. */
|
||||||
|
if (WARN_ON_ONCE(!data_check_size(data_ring, *data_size)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return &db->data[0];
|
return &db->data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1365,7 +1368,7 @@ static struct prb_desc *desc_reopen_last(struct prb_desc_ring *desc_ring,
|
||||||
*
|
*
|
||||||
* WMB from _prb_commit:A to _prb_commit:B
|
* WMB from _prb_commit:A to _prb_commit:B
|
||||||
* matching
|
* matching
|
||||||
* MB If desc_reopen_last:A to prb_reserve_in_last:A
|
* MB from desc_reopen_last:A to prb_reserve_in_last:A
|
||||||
*/
|
*/
|
||||||
if (!atomic_long_try_cmpxchg(&d->state_var, &prev_state_val,
|
if (!atomic_long_try_cmpxchg(&d->state_var, &prev_state_val,
|
||||||
DESC_SV(id, desc_reserved))) { /* LMM(desc_reopen_last:A) */
|
DESC_SV(id, desc_reserved))) { /* LMM(desc_reopen_last:A) */
|
||||||
|
|
@ -1770,9 +1773,9 @@ static void _prb_commit(struct prb_reserved_entry *e, unsigned long state_val)
|
||||||
*
|
*
|
||||||
* Relies on:
|
* Relies on:
|
||||||
*
|
*
|
||||||
* MB _prb_commit:B to prb_commit:A
|
* MB from _prb_commit:B to prb_commit:A
|
||||||
* matching
|
* matching
|
||||||
* MB desc_reserve:D to desc_make_final:A
|
* MB from desc_reserve:D to desc_make_final:A
|
||||||
*/
|
*/
|
||||||
if (!atomic_long_try_cmpxchg(&d->state_var, &prev_state_val,
|
if (!atomic_long_try_cmpxchg(&d->state_var, &prev_state_val,
|
||||||
DESC_SV(e->id, state_val))) { /* LMM(_prb_commit:B) */
|
DESC_SV(e->id, state_val))) { /* LMM(_prb_commit:B) */
|
||||||
|
|
@ -2035,7 +2038,7 @@ u64 prb_first_seq(struct printk_ringbuffer *rb)
|
||||||
*
|
*
|
||||||
* MB from desc_push_tail:B to desc_reserve:F
|
* MB from desc_push_tail:B to desc_reserve:F
|
||||||
* matching
|
* matching
|
||||||
* RMB prb_first_seq:B to prb_first_seq:A
|
* RMB from prb_first_seq:B to prb_first_seq:A
|
||||||
*/
|
*/
|
||||||
smp_rmb(); /* LMM(prb_first_seq:C) */
|
smp_rmb(); /* LMM(prb_first_seq:C) */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ enum desc_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define _DATA_SIZE(sz_bits) (1UL << (sz_bits))
|
#define _DATA_SIZE(sz_bits) (1UL << (sz_bits))
|
||||||
#define _DESCS_COUNT(ct_bits) (1U << (ct_bits))
|
#define _DESCS_COUNT(ct_bits) (1UL << (ct_bits))
|
||||||
#define DESC_SV_BITS BITS_PER_LONG
|
#define DESC_SV_BITS BITS_PER_LONG
|
||||||
#define DESC_FLAGS_SHIFT (DESC_SV_BITS - 2)
|
#define DESC_FLAGS_SHIFT (DESC_SV_BITS - 2)
|
||||||
#define DESC_FLAGS_MASK (3UL << DESC_FLAGS_SHIFT)
|
#define DESC_FLAGS_MASK (3UL << DESC_FLAGS_SHIFT)
|
||||||
|
|
@ -388,7 +388,7 @@ for ((s) = from; prb_read_valid(rb, s, r); (s) = (r)->info->seq + 1)
|
||||||
*
|
*
|
||||||
* This is a macro for conveniently iterating over a ringbuffer.
|
* This is a macro for conveniently iterating over a ringbuffer.
|
||||||
* Note that @s may not be the sequence number of the record on each
|
* Note that @s may not be the sequence number of the record on each
|
||||||
* iteration. For the sequence number, @r->info->seq should be checked.
|
* iteration. For the sequence number, @i->seq should be checked.
|
||||||
*
|
*
|
||||||
* Context: Any context.
|
* Context: Any context.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue