buf_ring: Remove old arm-only dequeue code
In the single consumer dequeue the consumer thread controls br_cons_head. As such no ordering between this and other data are required. Reviewed by: alc, imp, kib, markj Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D46153
This commit is contained in:
@@ -177,37 +177,8 @@ buf_ring_dequeue_sc(struct buf_ring *br)
|
||||
uint32_t prod_tail, mask;
|
||||
void *buf;
|
||||
|
||||
/*
|
||||
* This is a workaround to allow using buf_ring on ARM and ARM64.
|
||||
* ARM64TODO: Fix buf_ring in a generic way.
|
||||
* REMARKS: It is suspected that br_cons_head does not require
|
||||
* load_acq operation, but this change was extensively tested
|
||||
* and confirmed it's working. To be reviewed once again in
|
||||
* FreeBSD-12.
|
||||
*
|
||||
* Preventing following situation:
|
||||
|
||||
* Core(0) - buf_ring_enqueue() Core(1) - buf_ring_dequeue_sc()
|
||||
* ----------------------------------------- ----------------------------------------------
|
||||
*
|
||||
* cons_head = br->br_cons_head;
|
||||
* atomic_cmpset_acq_32(&br->br_prod_head, ...));
|
||||
* buf = br->br_ring[cons_head]; <see <1>>
|
||||
* br->br_ring[prod_head] = buf;
|
||||
* atomic_store_rel_32(&br->br_prod_tail, ...);
|
||||
* prod_tail = br->br_prod_tail;
|
||||
* if (cons_head == prod_tail)
|
||||
* return (NULL);
|
||||
* <condition is false and code uses invalid(old) buf>`
|
||||
*
|
||||
* <1> Load (on core 1) from br->br_ring[cons_head] can be reordered (speculative readed) by CPU.
|
||||
*/
|
||||
mask = br->br_cons_mask;
|
||||
#if defined(__arm__) || defined(__aarch64__)
|
||||
cons_head = atomic_load_acq_32(&br->br_cons_head);
|
||||
#else
|
||||
cons_head = br->br_cons_head;
|
||||
#endif
|
||||
prod_tail = atomic_load_acq_32(&br->br_prod_tail);
|
||||
|
||||
cons_next = cons_head + 1;
|
||||
|
||||
Reference in New Issue
Block a user