alf_queue: SPSC: Single-Producer/Consumer variants of enqueue/dequeue

This implements the Single-Producer/Consumer variants the
Enqueue/Dequeue functions.  As the name indicate, only a single CPU is
allowed to use the queue for enqueue, and another single CPU is
allowed to dequeue.

Some assertion statements are added to catch race conditions, that can
only occur if the queue used incorrectly, either by being accessed by
several CPU or due to preemption.  The assertions can be disabled
compile time as they do add a slight overhead.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
alf_queue_bench: add micro-benchmark tests for SPSC

Adding micro-benchmarking tests for queue variant:
 SPSC = Single Producer Single Consumer

Reorganize to support both MPMC and SPSC queue tests.  Using compiler
optimization trick to avoid duplicating too much code.  The compiler
should inline optimize other function calls out.

Results on E5-2695:

(none-bulking): comparing MPMC -> SPSC
                   MPMC     -> SPSC
 simple         :  8.617 ns -> 2.023 ns  (without-asserts: 1.735 ns)
 multi(step:128): 12.687 ns -> 2.420 ns  (without-asserts: 2.363 ns)

It is very clear that the SPSC variant is significantly faster when
only enqueuing/dequeuing a single element at the time.  This is
obviously due to the expensive locked cmpxchg needed for MPMC.

Note using helper "unroll" (have best pipelining)

(bulking) cost per element comparing MPMC -> SPSC:
         MPMC     ->  SPSC      -> (SPSC without asserts)
 bulk2 : 5.282 ns ->  2.346 ns  -> (2.071 ns)
 bulk3 : 3.643 ns ->  1.688 ns  -> (1.508 ns)
 bulk4 : 3.015 ns ->  1.466 ns  -> (1.281 ns)
 bulk6 : 2.096 ns ->  1.094 ns  -> (0.972 ns)
 bulk8 : 1.762 ns ->  1.003 ns  -> (0.919 ns)
 bulk16: 1.105 ns ->  0.754 ns  -> (0.710 ns)

Bulking does help SPSC queue, but it is clear that the MPMC queue
benefit mostly, as it amortize the cost of the locked cmpxchg.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
alf_queue_bench: update MPMC performance numbers in comments

The performance of ALF-queue have been optimized since the
comments about the performance was added.

Performance was optimized for the none-bulking case:
 MPMC-simple : 10.910 ns -> 8.615 ns
 MPMC-multi  : 13.576 ns -> 12.688 ns (step:128)

Also add the SPSC base numbers on CPU E5-2695.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>