From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Chris Mason <chris.mason@fusionio.com>
Cc: Linux FS Devel <linux-fsdevel@vger.kernel.org>,
David Woodhouse <David.Woodhouse@intel.com>,
"dchinner@redhat.com" <dchinner@redhat.com>,
bo.li.liu@oracle.com, rp@svcs.cs.pdx.edu,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Lai Jiangshan <laijs@cn.fujitsu.com>,
Stephen Hemminger <shemminger@vyatta.com>,
Alan Stern <stern@rowland.harvard.edu>
Subject: [RFC] RCU Judy array with distributed locking for FS extents
Date: Mon, 3 Jun 2013 01:27:58 -0400 [thread overview]
Message-ID: <20130603052758.GA4278@Krystal> (raw)
Hi Chris,
I stumbled the LWN article "A kernel skiplist implementation (Part 1)",
and really thought I should tell you about the side-project I am
currently working on: RCU Judy array, with locking distributed within
the data structure. I developed my own design of this structure
specifically to be usable with RCU. (ref. my LPC2012 presentation:
https://www.efficios.com/lpc2012-scaling-rcu-judy-arrays-cache-efficient-compact-fast-and-scalable-trie)
I think it would fit your extents use-case perfectly, with excellent
cache usage, constant lookup time, near-linear scalability for lookups,
and pretty good update scability.
The code is available in a development branch of the Userspace RCU
library:
git://git.lttng.org/userspace-rcu.git branch: urcu/rcuja
https://git.lttng.org/?p=userspace-rcu.git;a=shortlog;h=refs/heads/urcu/rcuja
It runs entirely in user-space, although it can be ported easily to the
Linux kernel. I'd be curious to see how it behaves with your workload.
Relevant files:
- rcuja/design.txt: design document of the data structure,
- urcu/rcuja.h (public API)
- rcuja/*.[ch]: implementation
- tests/test_urcu_ja.c: stress-tests, example usage.
After reading the article on skiplists, I added a new API specifically
to handle non-overlapping ranges:
struct cds_hlist_head cds_ja_lookup_lower_equal(struct cds_ja *ja,
uint64_t key);
AFAIU, "extents", as far as keys are concerned, are nothing more than
segments, with start and end values.
Extents can be indexed by the Judy array in the following way: we use
the start of segment as node key, and keep the end of segment value
within the leaf node. We add those nodes into the judy array, indexed by
start-of-segment value. Then, when we want to figure out if a value
matches a segment, we do the following:
1) lookup the possible segment match with cds_ja_lookup_lower_equal(),
passing the key to lookup as parameter,
2) check that our key fits within the range of the segment using the
end-of-segment value within the leaf node.
Of course, this approach is limited to non-overlapping segments, so I
hope this is what you need.
Feedback is welcome!
Thanks,
Mathieu
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next reply other threads:[~2013-06-03 5:28 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-03 5:27 Mathieu Desnoyers [this message]
2013-06-03 12:40 ` [RFC] RCU Judy array with distributed locking for FS extents Chris Mason
2013-06-03 12:46 ` Mathieu Desnoyers
2013-06-03 13:07 ` Chris Mason
2013-06-03 13:50 ` Mathieu Desnoyers
2013-06-04 11:54 ` Dave Chinner
2013-06-04 14:21 ` Chris Mason
2013-06-04 18:57 ` Mathieu Desnoyers
2013-06-05 23:48 ` Dave Chinner
2013-06-12 1:12 ` Mathieu Desnoyers
2013-06-13 1:25 ` Chris Mason
2013-06-16 14:02 ` Liu Bo
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=20130603052758.GA4278@Krystal \
--to=mathieu.desnoyers@efficios.com \
--cc=David.Woodhouse@intel.com \
--cc=bo.li.liu@oracle.com \
--cc=chris.mason@fusionio.com \
--cc=dchinner@redhat.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=rp@svcs.cs.pdx.edu \
--cc=shemminger@vyatta.com \
--cc=stern@rowland.harvard.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 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.