Re: [RFC PATCH] Linux kernel Wait-Free Concurrent QueueImplementation

From: Mathieu Desnoyers
Date: Thu Mar 14 2013 - 22:08:22 EST


* Peter Hurley (peter@xxxxxxxxxxxxxxxxxx) wrote:
> On Mon, 2013-03-11 at 17:36 -0400, Mathieu Desnoyers wrote:
> > +/*
> > + * Do not put head and tail on the same cache-line if concurrent
> > + * enqueue/dequeue are expected from many CPUs. This eliminates
> > + * false-sharing between enqueue and dequeue.
> > + */
> > +struct wfcq_head {
> > + struct wfcq_node node;
> > + struct mutex lock;
> > +};
> > +
> > +struct wfcq_tail {
> > + struct wfcq_node *p;
> > +};
>
>
> If you want to force separate cachelines for SMP, this would be
>
> struct wfcq_head {
> struct wfcq_node node;
> struct mutex lock;
> } ____cacheline_aligned_in_smp;
>
> struct wfcq_tail {
> struct wfcq_node *p;
> } ____cacheline_aligned_in_smp;

Well, the thing is: I don't want to force it. The queue head and tail
can be used in a few ways:

1) tail used by frequent enqueue on one CPU, head used for frequent
dequeues on another CPU. In this case, we want head/tail on different
cache lines.
2) same scenario as 1), but head and tail are placed in per-cpu data
of the two CPUs. We don't need to align each structure explicitly.
3) tail and head used locally, e.g. on the stack, as splice destination
followed by iteration or dequeue from the same CPU. We don't want to
waste precious memory space in this case, so no alignment.

So as you see, only (1) actually requires explicit alignment of head and
tail.

Thanks,

Mathieu

--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
--
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/