Messages in this thread | | | Date | Fri, 04 Jun 2010 18:36:55 +0200 | From | Henrik Rydberg <> | Subject | Re: [PATCH 1/4] input: Introduce buflock, a one-to-many circular buffer mechanism |
| |
>> +#define buflock_write(bw, buf, size, item) \ >> + do { \ >> + bw.next_head = (bw.head + 1) & ((size) - 1); \ >> + smp_wmb(); \ > > Why do we need the write barrier here?
I believe my first answer to this question was foggy indeed, so allow me to go again, with a time line:
Scenario 1, correct write order:
writer store_next_head store_buf store_head reader load_head load_buf load_next_head
Result: head != next_head, incoherent read detected
Scenario 2, incorrect write order:
writer store_buf store_next_head store_head reader load_head load_buf load_next_head
Result: head == next_head, incoherent read not detected
Based on the assumption that scenario 2 could happen if the smp_wmb() is not present, the barrier is needed.
Henrik
| |