Re: [PATCH] Document Linux's circular buffering capabilities
From: David Howells
Date: Fri Mar 12 2010 - 18:41:47 EST
Stefan Richter <stefanr@xxxxxxxxxxxxxxxxx> wrote:
> "...do this" could be misunderstood as "use a modulus instruction",
> although the heading says that this section is about 2^n sized buffers.
> How about reversing the leading paragraph?
>
> Calculating the occupied or free space of a circular buffer involves
> a somewhat slow modulus operation. But if the buffer size is an
> exact power of 2, a quick bitwise AND can be used instead.
>
> There is a set of macros which do the latter, that can be made use
> of by [...]
How about:
Calculation of the occupancy or the remaining capacity of an
arbitrarily sized circular buffer would normally be a slow operation,
requiring the use of a modulus (divide) instruction. However, if the
buffer is of a power-of-2 size, then a much quicker bitwise-AND
instruction can be used instead.
Linux provides a set of macros for handling power-of-2 circular
buffers. These can be made use of by:
...
> > +Note the use of ACCESS_ONCE() in both algorithms to read the opposition index.
> > +This prevents the compiler from discarding and reloading its cached value -
> > +which some compilers will do, even after an implied compiler barrier.
>
> I don't understand why ACCESS_ONCE is needed here. The CIRC_SPACE and
> CIRC_CNT macros do not look at head and tail more than once.
In this example they don't, but say someone wants to read several elements
from the buffer, they might end up accessing their copy of head several times.
If you only access it once anyway, ACCESS_ONCE() shouldn't hurt.
David
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/