From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Eric Wong <normalperson@yhbt.net>
Cc: linux-kernel@vger.kernel.org,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Lai Jiangshan <laijs@cn.fujitsu.com>
Subject: Re: [PATCH] wfcqueue: add function for unsynchronized prepend
Date: Tue, 2 Apr 2013 09:05:42 -0400 [thread overview]
Message-ID: <20130402130541.GC11621@Krystal> (raw)
In-Reply-To: <20130329081016.GA15979@dcvr.yhbt.net>
* Eric Wong (normalperson@yhbt.net) wrote:
> In some situations, it is necessary to prepend a node to a queue.
> For epoll, this is necessary for two rare conditions:
>
> * when the user triggers -EFAULT
> * when reinjecting elements from the ovflist (implemented as a stack)
This approach makes sense.
In terms of API naming, I wonder if "prepend" is the good counterpart
for "enqueue". Maybe "enqueue_first" or "enqueue_head" could be better
suited ?
Currently, we have an "append" function used internally, but it's not
exposed by the API.
Just for fun, I tried making your "prepend" wait-free (thus not
requiring a mutex), but it's really not obvious, because of its impact
on splice operation and dequeue-last-node operation.
Thoughts ?
Thanks,
Mathieu
>
> Signed-off-by: Eric Wong <normalperson@yhbt.net>
> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> ---
> This is on top of my other patch to implement __wfcq_enqueue
>
> include/linux/wfcqueue.h | 35 +++++++++++++++++++++++++++--------
> 1 file changed, 27 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/wfcqueue.h b/include/linux/wfcqueue.h
> index a452ab9..4cb8f22 100644
> --- a/include/linux/wfcqueue.h
> +++ b/include/linux/wfcqueue.h
> @@ -56,15 +56,17 @@
> * [5] __wfcq_first
> * [6] __wfcq_next
> * [7] __wfcq_enqueue
> + * [8] __wfcq_prepend
> *
> - * [1] [2] [3] [4] [5] [6] [7]
> - * [1] - - - - - - X
> - * [2] - - - - - - X
> - * [3] - - X X X X X
> - * [4] - - X - X X X
> - * [5] - - X X - - X
> - * [6] - - X X - - X
> - * [7] X X X X X X X
> + * [1] [2] [3] [4] [5] [6] [7] [8]
> + * [1] - - - - - - X X
> + * [2] - - - - - - X X
> + * [3] - - X X X X X X
> + * [4] - - X - X X X X
> + * [5] - - X X - - X X
> + * [6] - - X X - - X X
> + * [7] X X X X X X X X
> + * [8] X X X X X X X X
> *
> * Besides locking, mutual exclusion of dequeue, splice and iteration
> * can be ensured by performing all of those operations from a single
> @@ -441,6 +443,23 @@ static inline enum wfcq_ret __wfcq_splice(
> }
>
> /*
> + * __wfcq_prepend: prepend a node into a queue, requiring mutual exclusion.
> + *
> + * No memory barriers are issued. Mutual exclusion is the responsibility
> + * of the caller.
> + */
> +static inline void __wfcq_prepend(struct wfcq_head *head,
> + struct wfcq_tail *tail, struct wfcq_node *node)
> +{
> + node->next = head->node.next;
> + head->node.next = node;
> +
> + /* if the queue was empty before, it is no longer empty now */
> + if (tail->p == &head->node)
> + tail->p = node;
> +}
> +
> +/*
> * __wfcq_for_each: Iterate over all nodes in a queue,
> * without dequeuing them.
> * @head: head of the queue (struct wfcq_head pointer).
> --
> Eric Wong
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2013-04-02 13:05 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-11 21:36 [RFC PATCH] Linux kernel Wait-Free Concurrent Queue Implementation Mathieu Desnoyers
2013-03-14 4:22 ` Eric Wong
2013-03-14 13:18 ` Mathieu Desnoyers
2013-03-14 19:07 ` Eric Wong
2013-03-14 19:48 ` Mathieu Desnoyers
2013-03-14 21:32 ` Eric Wong
2013-03-15 2:38 ` Mathieu Desnoyers
2013-03-16 22:02 ` Eric Wong
2013-03-17 2:03 ` Mathieu Desnoyers
2013-03-18 10:37 ` Eric Wong
2013-03-15 0:49 ` Peter Hurley
2013-03-15 2:08 ` Mathieu Desnoyers
2013-03-21 11:43 ` [PATCH] wfcqueue: functions for local append and enqueue Eric Wong
2013-03-22 2:01 ` Mathieu Desnoyers
2013-03-22 10:31 ` Eric Wong
2013-03-23 19:07 ` [PATCH v2] " Eric Wong
2013-03-23 19:43 ` Mathieu Desnoyers
2013-03-23 20:42 ` [PATCH v3] " Eric Wong
2013-03-23 22:10 ` Mathieu Desnoyers
2013-03-29 8:10 ` [PATCH] wfcqueue: add function for unsynchronized prepend Eric Wong
2013-04-02 13:05 ` Mathieu Desnoyers [this message]
2013-04-02 21:15 ` Eric Wong
2013-04-06 21:42 ` [RFC PATCH] wfcqueue: implement __wfcq_enqueue_head() Mathieu Desnoyers
2013-04-11 21:23 ` [RFC PATCH] Linux kernel Wait-Free Concurrent Queue Implementation Eric Wong
2013-04-11 22:44 ` Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130402130541.GC11621@Krystal \
--to=mathieu.desnoyers@efficios.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=normalperson@yhbt.net \
--cc=paulmck@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.