26 Aug
2015
26 Aug
'15
8:43 p.m.
On Mon, Aug 24, 2015 at 01:39:14PM +0100, Qais Yousef wrote:
- /*
* must ensure we have one access at a time to the queue and rd_idx
* to be preemption and SMP safe
* Sempahores will ensure that we will only read after a complete write
* has finished, so we will never read and write from the same location.
*/
In what way will sempahores ensure that we will only read after a complete write?
- buf = bufferq->queue[bufferq->rd_idx];
So buffers are always retired in the same order that they are acquired?
+int axd_bufferq_put(struct axd_bufferq *bufferq, char *buf, int buf_size) +{
- int ret;
- if (!bufferq->queue)
return 0;
- if (buf_size < 0)
buf_size = bufferq->stride;
We've got strides as well? What is that?
+void axd_bufferq_abort_take(struct axd_bufferq *bufferq) +{
- if (axd_bufferq_is_empty(bufferq)) {
bufferq->abort_take = 1;
up(&bufferq->rd_sem);
- }
+}
+void axd_bufferq_abort_put(struct axd_bufferq *bufferq) +{
- if (axd_bufferq_is_full(bufferq)) {
bufferq->abort_put = 1;
up(&bufferq->wr_sem);
- }
+}
These look *incredibly* racy. Why are they here and why are they safe?