From: Sasha Levin <levinsasha928@gmail.com>
To: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Pekka Enberg <penberg@kernel.org>, Avi Kivity <avi@redhat.com>,
Ingo Molnar <mingo@elte.hu>,
john@jfloren.net, kvm@vger.kernel.org, asias.hejun@gmail.com,
gorcunov@gmail.com, prasadjoshi124@gmail.com,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Phil Howard <csbetterthanjava@gmail.com>,
rp@svcs.cs.pdx.edu
Subject: Re: RCU red-black tree (was: Re: [PATCH 4/6] kvm tools: Add rwlock wrapper)
Date: Sun, 29 May 2011 20:48:12 +0300 [thread overview]
Message-ID: <1306691292.14564.12.camel@lappy> (raw)
In-Reply-To: <20110529170104.GA17189@Krystal>
On Sun, 2011-05-29 at 13:01 -0400, Mathieu Desnoyers wrote:
> * Mathieu Desnoyers (mathieu.desnoyers@efficios.com) wrote:
> > * Sasha Levin (levinsasha928@gmail.com) wrote:
> [...]
> > > Hi Mathieu!
> > >
> > > In tools/kvm/ we use a rb-tree (same one used by the kernel) with the
> > > augmentation feature to support an interval rb-tree - which means that
> > > every update to the tree not only updates the nodes directly related to
> > > the updated node but also all the nodes on the path to the root of the
> > > tree.
> >
> > Cool !!
> >
> > I'm adding in copy Phil Howard who has been working on RCU RB tree for
> > much longer than myself.
> >
> > > I see that in liburcu there is an implementation of a rcu linked list
> > > but no implementation of a rb-tree.
> > >
> > > Are you currently working on one? or maybe I should try writing one and
> > > sending it to you?
> >
> > Actually, I started working on one last year, but had to interrupt my
> > effort before I got it even working right.
> [...]
> > We'd have to see how we can go from this implementation of a standard RB
> > tree to an interval RB tree too. I guess it will depend whether you need
> > the updates from the target node up to the root to be done "all at once"
> > from a reader perspective (then you would probably need to replace a
> > copy of a part of the tree all at once), or if you can allow the update
> > to be done piece-wise on a node-by-node basis as readers go through the
> > tree (from root to leafs).
>
> I've revisited the RCU rbtree implementation this weekend, and it works
> much better now. I reimplemented the whole thing from 0 starting from
> the CLRS chapter 12 algorithms (to get the non-rcu
> (insertion/removal)-only stress-tests working) and incrementally
Hi Mathieu!
Can't we use the rbtree provided by the kernel, and just add _rcu
functions to provide rcu protected rbtree?
> RCU-ized the updates and then added read-side tests. All along, I used
> the test_urcu_rbtree test case that does some basic coherency tests by
> searching for some random elements that *should* be there in parellel
> with insertion and removals. The implementation I currently have
> survives the "search for known elements in parallel with updates" stress
> test (so far). (e.g. test_urcu_rbtree 6 2 10 -g 30 : 6 readers, 2
> writers, 30 known random elements, writers are adding/removing 6 random
> elements, on a 8-core machine)
I've grabbed it and it works great for me here too :)
test_urcu_rbtree does print a lot of mess, making it somewhat hard to
work with.
>
> See: git://git.lttng.org/userspace-rcu.git
> branch : rbtree2
>
> The key idea I used in this implementation is to "decay" the old nodes
> (AFAIK, I just made this up) : "decaying" a node could be best described
> as creating an exact copy of a node, and putting a pointer to this new
> node into the old node to form a "decay chain". This allowed me to keep
> the algorithm very much similar to CLRS by just walking the decay chains
> whenever needed. The old node "decays" by using call_rcu to free it
> after a grace period passes. This imply that the updates must hold the
> RCU read-side lock in addition to a mutex to make sure the decaying
> nodes stay valid for the duration of their use.
>
> This implementation never requires the read-side to loop, thus
> guaranteeing a wait-free read-side behavior (so search operations will
> always be strictly log(n) without any busy-loop delay).
>
> I have not created stress-tests for next/prev walk of the tree yet. It
> is therefore entirely possible that this does not work as expected.
I've 'forked' tools/kvm/, and started working on integrating urcu into
it (Will be located in https://github.com/levinsasha/linux-kvm once some
progress has been made), this should make it easier to review
work-in-progress. I'll switch to the rbtree2 branch in urcu and work
with it from now.
> Comments are welcome,
>
> Thanks,
>
> Mathieu
>
>
> >
> > Thanks,
> >
> > Mathieu
> >
> >
> > --
> > Mathieu Desnoyers
> > Operating System Efficiency R&D Consultant
> > EfficiOS Inc.
> > http://www.efficios.com
>
--
Sasha.
next prev parent reply other threads:[~2011-05-29 17:48 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-26 14:25 [PATCH 1/6] kvm tools: Prevent double assignment of guest memory info Sasha Levin
2011-05-26 14:25 ` [PATCH 2/6] kvm tools: Exit VCPU thread only when SIGKVMEXIT is received Sasha Levin
2011-05-26 14:25 ` [PATCH 3/6] kvm tools: Protect IRQ allocations by a mutex Sasha Levin
2011-05-26 14:25 ` [PATCH 4/6] kvm tools: Add rwlock wrapper Sasha Levin
2011-05-26 16:02 ` Pekka Enberg
2011-05-26 16:19 ` Sasha Levin
2011-05-26 18:05 ` Ingo Molnar
2011-05-26 18:11 ` Avi Kivity
2011-05-26 18:21 ` Pekka Enberg
2011-05-26 18:57 ` Sasha Levin
2011-05-26 23:09 ` Mathieu Desnoyers
2011-05-27 10:19 ` Sasha Levin
2011-05-27 10:36 ` Ingo Molnar
2011-05-27 15:52 ` Sasha Levin
2011-05-27 17:10 ` Ingo Molnar
2011-05-27 20:19 ` Sasha Levin
2011-05-28 15:24 ` Ingo Molnar
2011-05-28 16:44 ` Paul E. McKenney
2011-05-28 19:45 ` Sasha Levin
2011-05-29 6:47 ` Avi Kivity
2011-05-29 7:19 ` Ingo Molnar
2011-05-29 15:31 ` Paul E. McKenney
2011-05-29 15:51 ` Paul E. McKenney
2011-05-29 19:54 ` Ingo Molnar
2011-05-30 3:12 ` Paul E. McKenney
2011-05-29 16:22 ` Sasha Levin
2011-05-27 13:14 ` Mathieu Desnoyers
2011-05-29 17:01 ` RCU red-black tree (was: Re: [PATCH 4/6] kvm tools: Add rwlock wrapper) Mathieu Desnoyers
2011-05-29 17:48 ` Sasha Levin [this message]
2011-05-30 2:54 ` Mathieu Desnoyers
2011-05-30 6:07 ` Sasha Levin
2011-05-30 11:30 ` Mathieu Desnoyers
2011-05-30 17:38 ` Mathieu Desnoyers
2011-05-30 17:50 ` Mathieu Desnoyers
2011-05-30 17:52 ` Sasha Levin
2011-05-30 18:57 ` Mathieu Desnoyers
2011-05-30 19:11 ` Sasha Levin
2011-05-31 13:05 ` Sasha Levin
2011-05-31 13:09 ` Ingo Molnar
2011-05-31 13:20 ` Sasha Levin
2011-05-31 15:25 ` Ingo Molnar
2011-05-31 19:09 ` Prasad Joshi
2011-05-31 19:31 ` Ingo Molnar
2011-06-02 14:55 ` Mathieu Desnoyers
2011-05-30 3:38 ` Paul E. McKenney
2011-05-30 11:18 ` Mathieu Desnoyers
2011-05-26 20:25 ` [PATCH 4/6] kvm tools: Add rwlock wrapper Ingo Molnar
2011-05-26 23:05 ` Mathieu Desnoyers
2011-05-27 0:58 ` Paul E. McKenney
2011-05-27 9:12 ` Ingo Molnar
2011-05-27 12:48 ` Mathieu Desnoyers
2011-05-27 13:19 ` Ingo Molnar
2011-05-27 13:29 ` Mathieu Desnoyers
2011-05-27 13:36 ` Ingo Molnar
2011-05-27 17:22 ` Paul E. McKenney
2011-05-27 10:25 ` Ingo Molnar
2011-05-27 11:07 ` Ingo Molnar
2011-05-27 11:10 ` Ingo Molnar
2011-05-27 11:24 ` Ingo Molnar
2011-05-27 14:18 ` Mathieu Desnoyers
2011-05-27 14:11 ` Mathieu Desnoyers
2011-05-28 18:12 ` Avi Kivity
2011-05-28 18:32 ` Ingo Molnar
2011-05-29 6:41 ` Avi Kivity
2011-05-29 7:35 ` Ingo Molnar
2011-05-29 7:54 ` Avi Kivity
2011-05-29 12:37 ` Ingo Molnar
2011-05-29 12:48 ` Avi Kivity
2011-05-29 14:27 ` Ingo Molnar
2011-05-29 15:00 ` Avi Kivity
2011-05-29 15:38 ` Paul E. McKenney
2011-05-29 19:33 ` Ingo Molnar
2011-05-30 3:07 ` Paul E. McKenney
2011-05-30 8:12 ` Ingo Molnar
2011-05-27 13:22 ` Mathieu Desnoyers
2011-05-27 13:31 ` Ingo Molnar
2011-05-28 18:14 ` Avi Kivity
2011-05-27 13:07 ` Ingo Molnar
2011-05-26 14:25 ` [PATCH 5/6] kvm tools: Protect MMIO tree by rwsem Sasha Levin
2011-05-26 14:25 ` [PATCH 6/6] kvm tools: Protect IOPORT " Sasha Levin
2011-05-26 16:01 ` Pekka Enberg
2011-05-26 16:19 ` Sasha Levin
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=1306691292.14564.12.camel@lappy \
--to=levinsasha928@gmail.com \
--cc=asias.hejun@gmail.com \
--cc=avi@redhat.com \
--cc=csbetterthanjava@gmail.com \
--cc=gorcunov@gmail.com \
--cc=john@jfloren.net \
--cc=kvm@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@elte.hu \
--cc=paulmck@linux.vnet.ibm.com \
--cc=penberg@kernel.org \
--cc=prasadjoshi124@gmail.com \
--cc=rp@svcs.cs.pdx.edu \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox