From: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Kent Overstreet <koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
dm-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
agk-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org
Subject: Re: [Bcache v13 12/16] bcache: Bset code (lookups within a btree node)
Date: Tue, 22 May 2012 15:39:32 -0700 [thread overview]
Message-ID: <20120522223932.GK14339@google.com> (raw)
In-Reply-To: <5b5998d7d09ec36377acdb5d15665d1e4e818521.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Hello, again.
On Wed, May 09, 2012 at 11:11:00PM -0400, Kent Overstreet wrote:
> +void bkey_copy_single_ptr(struct bkey *dest, const struct bkey *src, unsigned i)
> +{
> + BUG_ON(i > KEY_PTRS(src));
> +
> + /* Only copy the header, key, and one pointer. */
> + memcpy(dest, src, 2 * sizeof(uint64_t));
I hope this could be better somehow.
> + dest->ptr[0] = src->ptr[i];
> + SET_KEY_PTRS(dest, 1);
> + /* We didn't copy the checksum so clear that bit. */
> + SET_KEY_CSUM(dest, 0);
> +}
> +/* I have no idea why this code works... and I'm the one who wrote it
> + *
> + * However, I do know what it does:
> + * Given a binary tree constructed in an array (i.e. how you normally implement
> + * a heap), it converts a node in the tree - referenced by array index - to the
> + * index it would have if you did an inorder traversal.
> + *
> + * The binary tree starts at array index 1, not 0
> + * extra is a function of size:
> + * extra = (size - rounddown_pow_of_two(size - 1)) << 1;
> + */
It's kinda problematic if you can't understand or explain it. I'm
scared. :(
> +static unsigned __to_inorder(unsigned j, unsigned size, unsigned extra)
> +{
> + unsigned b = fls(j);
> + unsigned shift = fls(size - 1) - b;
> +
> + j ^= 1U << (b - 1);
> + j <<= 1;
> + j |= 1;
> + j <<= shift;
> +
> + if (j > extra)
> + j -= (j - extra) >> 1;
> +
> + return j;
> +}
...
> +static void bset_alloc_tree(struct btree *b, struct bset_tree *t)
> +{
> + if (t != b->sets) {
> + unsigned j = roundup(t[-1].size,
> + 64 / sizeof(struct bkey_float));
> +
> + t->tree = t[-1].tree + j;
> + t->prev = t[-1].prev + j;
> + }
> +
> + while (t < b->sets + MAX_BSETS)
> + t++->size = 0;
> +}
I don't know. This is cryptic and I feel dirty and stupid.
> +static void bset_build_unwritten_tree(struct btree *b)
> +{
> + struct bset_tree *t = b->sets + b->nsets;
Why not &b->sets[b->nsets]?
> +
> + bset_alloc_tree(b, t);
> +
> + if (t->tree != b->sets->tree + bset_tree_space(b)) {
And why are we switching between sets[N].XXX and sets->XXX? Do they
signify something? The usages don't seem to be consistent tho.
> + t->prev[0] = bkey_to_cacheline_offset(t->data->start);
> + t->size = 1;
> + }
> +}
...
> +void bset_init_next(struct btree *b)
> +{
> + struct bset *i = write_block(b);
> +
> + if (i != b->sets[0].data) {
> + b->sets[++b->nsets].data = i;
> + i->seq = b->sets[0].data->seq;
> + } else
> + get_random_bytes(&i->seq, sizeof(uint64_t));
> +
> + i->magic = bset_magic(b->c);
> + i->version = 0;
> + i->keys = 0;
> +
> + bset_build_unwritten_tree(b);
> +}
> +
> +struct bset_search_iter {
> + struct bkey *l, *r;
> +};
> +
> +__attribute__((optimize(3)))
So, this sets different optimization level per function. Is this
really necessary? If so, you need to make compiler independent in
include/linux/compiler*.h.
> +static void __btree_sort(struct btree *b, struct btree_iter *iter,
> + unsigned start, unsigned order, bool fixup)
> +{
> + uint64_t start_time;
> + bool remove_stale = !b->written;
> + struct bset *out = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOIO,
> + order);
> + if (!out) {
> + mutex_lock(&b->c->sort_lock);
> + out = b->c->sort;
> + order = ilog2(bucket_pages(b->c));
> + }
So, this is implementing simplistic mempool, right? If so, why not
just use mempool?
> + start_time = local_clock();
> +
> + btree_mergesort(b, out, iter, fixup, remove_stale);
> + b->nsets = start;
> +
> + if (!fixup && !start && b->written)
> + btree_verify(b, out);
> +
> + if (!start && order == b->page_order) {
> + out->magic = bset_magic(b->c);
> + out->seq = b->sets[0].data->seq;
> + out->version = b->sets[0].data->version;
> + swap(out, b->sets[0].data);
> +
> + if (b->c->sort == b->sets[0].data)
> + b->c->sort = out;
> + } else {
> + b->sets[start].data->keys = out->keys;
> + memcpy(b->sets[start].data->start, out->start,
> + (void *) end(out) - (void *) out->start);
> + }
> +
> + if (out == b->c->sort)
And is this test correct given the above swap(out, b->sets[0].data)?
> + mutex_unlock(&b->c->sort_lock);
> + else
> + free_pages((unsigned long) out, order);
> +
> + if (b->written)
> + bset_build_written_tree(b);
> +
> + if (!start) {
> + spin_lock(&b->c->sort_time_lock);
> + time_stats_update(&b->c->sort_time, start_time);
> + spin_unlock(&b->c->sort_time_lock);
> + }
> +}
...
> +#define BKEY_MID_BITS 3
> +#define BKEY_MID_MAX (~(~0 << (BKEY_MID_BITS - 1)))
> +#define BKEY_MID_MIN (-1 - BKEY_MID_MAX)
> +
> +#define BKEY_EXPONENT_BITS 7
> +#define BKEY_MANTISSA_BITS 22
> +#define BKEY_MANTISSA_MASK ((1 << BKEY_MANTISSA_BITS) - 1)
> +
> +struct bkey_float {
> + unsigned exponent:BKEY_EXPONENT_BITS;
> + unsigned m:BKEY_MID_BITS;
> + unsigned mantissa:BKEY_MANTISSA_BITS;
> +} __packed;
I *suppose* bkey_float is used to somehow compactly represent key
values for compacter search tree. Wouldn't things like this need
boatload of explanation?
> +#define BSET_CACHELINE 128
> +#define BSET_CACHELINE_BITS ilog2(BSET_CACHELINE)
Hmm... what if CACHELINE isn't 128 bytes? What are the effects?
Wouldn't it be better to name it something else (I don't know,
BSET_UNIT_BYTES or whatever) and then explain that it's defined to be
close to popular cacheline size and the effects of it not coinciding
with actual cacheline size? Another nit, it's more customary to
define BITS or SHIFT first and then define size as << SHIFT.
> +#define bset_tree_space(b) (btree_data_space(b) >> BSET_CACHELINE_BITS)
> +
> +#define bset_tree_bytes(b) (bset_tree_space(b) * sizeof(struct bkey_float))
> +#define bset_prev_bytes(b) (bset_tree_bytes(b) >> 2)
Ummm.... cryptic. What does that >> 2 mean? Why not
bset_tree_space(b) * sizeof(whatever prev type is)?
> +void bset_init_next(struct btree *);
> +
> +void bset_fix_invalidated_key(struct btree *, struct bkey *);
> +void bset_fix_lookup_table(struct btree *, struct bkey *);
> +
> +struct bkey *__bset_search(struct btree *, struct bset_tree *,
> + const struct bkey *);
> +#define bset_search(b, t, search) \
> + ((search) ? __bset_search(b, t, search) : (t)->data->start)
Why oh why is this a macro? And can we please have descriptive
variable names in prototypes? btree_sort_into(btree *, btree *) - how
is one supposed to know from which into which?
> +bool bkey_try_merge(struct btree *, struct bkey *, struct bkey *);
> +void btree_sort_lazy(struct btree *);
> +void btree_sort_into(struct btree *, struct btree *);
> +void btree_sort_and_fix_extents(struct btree *, struct btree_iter *);
> +void btree_sort_partial(struct btree *, unsigned);
> +#define btree_sort(b) btree_sort_partial(b, 0)
> +
> +int bset_print_stats(struct cache_set *, char *);
Thanks.
--
tejun
WARNING: multiple messages have this Message-ID (diff)
From: Tejun Heo <tj@kernel.org>
To: Kent Overstreet <koverstreet@google.com>
Cc: linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org,
dm-devel@redhat.com, agk@redhat.com
Subject: Re: [Bcache v13 12/16] bcache: Bset code (lookups within a btree node)
Date: Tue, 22 May 2012 15:39:32 -0700 [thread overview]
Message-ID: <20120522223932.GK14339@google.com> (raw)
In-Reply-To: <5b5998d7d09ec36377acdb5d15665d1e4e818521.1336619038.git.koverstreet@google.com>
Hello, again.
On Wed, May 09, 2012 at 11:11:00PM -0400, Kent Overstreet wrote:
> +void bkey_copy_single_ptr(struct bkey *dest, const struct bkey *src, unsigned i)
> +{
> + BUG_ON(i > KEY_PTRS(src));
> +
> + /* Only copy the header, key, and one pointer. */
> + memcpy(dest, src, 2 * sizeof(uint64_t));
I hope this could be better somehow.
> + dest->ptr[0] = src->ptr[i];
> + SET_KEY_PTRS(dest, 1);
> + /* We didn't copy the checksum so clear that bit. */
> + SET_KEY_CSUM(dest, 0);
> +}
> +/* I have no idea why this code works... and I'm the one who wrote it
> + *
> + * However, I do know what it does:
> + * Given a binary tree constructed in an array (i.e. how you normally implement
> + * a heap), it converts a node in the tree - referenced by array index - to the
> + * index it would have if you did an inorder traversal.
> + *
> + * The binary tree starts at array index 1, not 0
> + * extra is a function of size:
> + * extra = (size - rounddown_pow_of_two(size - 1)) << 1;
> + */
It's kinda problematic if you can't understand or explain it. I'm
scared. :(
> +static unsigned __to_inorder(unsigned j, unsigned size, unsigned extra)
> +{
> + unsigned b = fls(j);
> + unsigned shift = fls(size - 1) - b;
> +
> + j ^= 1U << (b - 1);
> + j <<= 1;
> + j |= 1;
> + j <<= shift;
> +
> + if (j > extra)
> + j -= (j - extra) >> 1;
> +
> + return j;
> +}
...
> +static void bset_alloc_tree(struct btree *b, struct bset_tree *t)
> +{
> + if (t != b->sets) {
> + unsigned j = roundup(t[-1].size,
> + 64 / sizeof(struct bkey_float));
> +
> + t->tree = t[-1].tree + j;
> + t->prev = t[-1].prev + j;
> + }
> +
> + while (t < b->sets + MAX_BSETS)
> + t++->size = 0;
> +}
I don't know. This is cryptic and I feel dirty and stupid.
> +static void bset_build_unwritten_tree(struct btree *b)
> +{
> + struct bset_tree *t = b->sets + b->nsets;
Why not &b->sets[b->nsets]?
> +
> + bset_alloc_tree(b, t);
> +
> + if (t->tree != b->sets->tree + bset_tree_space(b)) {
And why are we switching between sets[N].XXX and sets->XXX? Do they
signify something? The usages don't seem to be consistent tho.
> + t->prev[0] = bkey_to_cacheline_offset(t->data->start);
> + t->size = 1;
> + }
> +}
...
> +void bset_init_next(struct btree *b)
> +{
> + struct bset *i = write_block(b);
> +
> + if (i != b->sets[0].data) {
> + b->sets[++b->nsets].data = i;
> + i->seq = b->sets[0].data->seq;
> + } else
> + get_random_bytes(&i->seq, sizeof(uint64_t));
> +
> + i->magic = bset_magic(b->c);
> + i->version = 0;
> + i->keys = 0;
> +
> + bset_build_unwritten_tree(b);
> +}
> +
> +struct bset_search_iter {
> + struct bkey *l, *r;
> +};
> +
> +__attribute__((optimize(3)))
So, this sets different optimization level per function. Is this
really necessary? If so, you need to make compiler independent in
include/linux/compiler*.h.
> +static void __btree_sort(struct btree *b, struct btree_iter *iter,
> + unsigned start, unsigned order, bool fixup)
> +{
> + uint64_t start_time;
> + bool remove_stale = !b->written;
> + struct bset *out = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOIO,
> + order);
> + if (!out) {
> + mutex_lock(&b->c->sort_lock);
> + out = b->c->sort;
> + order = ilog2(bucket_pages(b->c));
> + }
So, this is implementing simplistic mempool, right? If so, why not
just use mempool?
> + start_time = local_clock();
> +
> + btree_mergesort(b, out, iter, fixup, remove_stale);
> + b->nsets = start;
> +
> + if (!fixup && !start && b->written)
> + btree_verify(b, out);
> +
> + if (!start && order == b->page_order) {
> + out->magic = bset_magic(b->c);
> + out->seq = b->sets[0].data->seq;
> + out->version = b->sets[0].data->version;
> + swap(out, b->sets[0].data);
> +
> + if (b->c->sort == b->sets[0].data)
> + b->c->sort = out;
> + } else {
> + b->sets[start].data->keys = out->keys;
> + memcpy(b->sets[start].data->start, out->start,
> + (void *) end(out) - (void *) out->start);
> + }
> +
> + if (out == b->c->sort)
And is this test correct given the above swap(out, b->sets[0].data)?
> + mutex_unlock(&b->c->sort_lock);
> + else
> + free_pages((unsigned long) out, order);
> +
> + if (b->written)
> + bset_build_written_tree(b);
> +
> + if (!start) {
> + spin_lock(&b->c->sort_time_lock);
> + time_stats_update(&b->c->sort_time, start_time);
> + spin_unlock(&b->c->sort_time_lock);
> + }
> +}
...
> +#define BKEY_MID_BITS 3
> +#define BKEY_MID_MAX (~(~0 << (BKEY_MID_BITS - 1)))
> +#define BKEY_MID_MIN (-1 - BKEY_MID_MAX)
> +
> +#define BKEY_EXPONENT_BITS 7
> +#define BKEY_MANTISSA_BITS 22
> +#define BKEY_MANTISSA_MASK ((1 << BKEY_MANTISSA_BITS) - 1)
> +
> +struct bkey_float {
> + unsigned exponent:BKEY_EXPONENT_BITS;
> + unsigned m:BKEY_MID_BITS;
> + unsigned mantissa:BKEY_MANTISSA_BITS;
> +} __packed;
I *suppose* bkey_float is used to somehow compactly represent key
values for compacter search tree. Wouldn't things like this need
boatload of explanation?
> +#define BSET_CACHELINE 128
> +#define BSET_CACHELINE_BITS ilog2(BSET_CACHELINE)
Hmm... what if CACHELINE isn't 128 bytes? What are the effects?
Wouldn't it be better to name it something else (I don't know,
BSET_UNIT_BYTES or whatever) and then explain that it's defined to be
close to popular cacheline size and the effects of it not coinciding
with actual cacheline size? Another nit, it's more customary to
define BITS or SHIFT first and then define size as << SHIFT.
> +#define bset_tree_space(b) (btree_data_space(b) >> BSET_CACHELINE_BITS)
> +
> +#define bset_tree_bytes(b) (bset_tree_space(b) * sizeof(struct bkey_float))
> +#define bset_prev_bytes(b) (bset_tree_bytes(b) >> 2)
Ummm.... cryptic. What does that >> 2 mean? Why not
bset_tree_space(b) * sizeof(whatever prev type is)?
> +void bset_init_next(struct btree *);
> +
> +void bset_fix_invalidated_key(struct btree *, struct bkey *);
> +void bset_fix_lookup_table(struct btree *, struct bkey *);
> +
> +struct bkey *__bset_search(struct btree *, struct bset_tree *,
> + const struct bkey *);
> +#define bset_search(b, t, search) \
> + ((search) ? __bset_search(b, t, search) : (t)->data->start)
Why oh why is this a macro? And can we please have descriptive
variable names in prototypes? btree_sort_into(btree *, btree *) - how
is one supposed to know from which into which?
> +bool bkey_try_merge(struct btree *, struct bkey *, struct bkey *);
> +void btree_sort_lazy(struct btree *);
> +void btree_sort_into(struct btree *, struct btree *);
> +void btree_sort_and_fix_extents(struct btree *, struct btree_iter *);
> +void btree_sort_partial(struct btree *, unsigned);
> +#define btree_sort(b) btree_sort_partial(b, 0)
> +
> +int bset_print_stats(struct cache_set *, char *);
Thanks.
--
tejun
next prev parent reply other threads:[~2012-05-22 22:39 UTC|newest]
Thread overview: 152+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-10 3:07 [Bcache v13 00/16] Kent Overstreet
2012-05-10 3:09 ` [Bcache v13 05/16] Export get_random_int() Kent Overstreet
[not found] ` <5278ad493eb3ad441b2091b4c119d741e47f5c97.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 16:44 ` Tejun Heo
2012-05-15 16:44 ` Tejun Heo
2012-05-10 3:09 ` [Bcache v13 07/16] Closures Kent Overstreet
[not found] ` <82f00ebb4ee0404788c5bd7fbfa1fe4969f28ba1.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 22:41 ` Tejun Heo
2012-05-15 22:41 ` Tejun Heo
[not found] ` <20120515224137.GA15386-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 6:29 ` Kent Overstreet
2012-05-18 6:29 ` Kent Overstreet
[not found] ` <20120518062948.GA21163-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-18 10:02 ` Alan Cox
2012-05-18 10:02 ` Alan Cox
2012-05-21 19:40 ` Kent Overstreet
2012-05-10 3:10 ` [Bcache v13 08/16] bcache: Documentation, and changes to generic code Kent Overstreet
2012-05-10 3:10 ` [Bcache v13 09/16] Bcache: generic utility code Kent Overstreet
[not found] ` <c3f0ca2a499f532253d4c16a30837d43e237266a.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 19:35 ` Dan Williams
2012-05-10 19:35 ` Dan Williams
2012-05-10 21:42 ` Kent Overstreet
2012-05-22 21:17 ` Tejun Heo
2012-05-22 21:17 ` Tejun Heo
2012-05-23 3:12 ` Kent Overstreet
2012-05-23 3:12 ` Kent Overstreet
[not found] ` <20120523031214.GA607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 3:36 ` Joe Perches
2012-05-23 3:36 ` Joe Perches
2012-05-23 4:50 ` [PATCH] Add human-readable units modifier to vsnprintf() Kent Overstreet
[not found] ` <20120523045023.GE607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:10 ` Joe Perches
2012-05-23 5:10 ` Joe Perches
2012-05-23 5:22 ` Kent Overstreet
2012-05-23 5:22 ` Kent Overstreet
[not found] ` <20120523052236.GA14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:42 ` Joe Perches
2012-05-23 5:42 ` Joe Perches
2012-05-23 6:04 ` Kent Overstreet
2012-05-23 6:04 ` Kent Overstreet
[not found] ` <20120523060435.GD14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 6:12 ` Joe Perches
2012-05-23 6:12 ` Joe Perches
2012-05-23 5:08 ` [Bcache v13 09/16] Bcache: generic utility code Tejun Heo
2012-05-23 5:08 ` Tejun Heo
[not found] ` <20120523050808.GA29976-RcKxWJ4Cfj1J2suj2OqeGauc2jM2gXBXkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:54 ` Kent Overstreet
2012-05-23 5:54 ` Kent Overstreet
[not found] ` <20120523055402.GC14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 16:51 ` Tejun Heo
2012-05-23 16:51 ` Tejun Heo
[not found] ` <20120522211706.GH14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 15:15 ` [dm-devel] " Vivek Goyal
2012-05-23 15:15 ` Vivek Goyal
[not found] ` <20120523151538.GJ14943-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-23 15:33 ` Kent Overstreet
2012-05-23 15:33 ` Kent Overstreet
2012-05-22 21:19 ` Tejun Heo
2012-05-22 21:19 ` Tejun Heo
2012-05-10 3:10 ` [Bcache v13 10/16] bcache: Superblock/initialization/sysfs code Kent Overstreet
2012-05-10 3:10 ` [Bcache v13 11/16] bcache: Core btree code Kent Overstreet
[not found] ` <7f1de39b6d7040b3fe271500776f4b985b21ea82.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-22 22:12 ` Tejun Heo
2012-05-22 22:12 ` Tejun Heo
[not found] ` <20120522221259.GJ14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 3:45 ` Kent Overstreet
2012-05-23 3:45 ` Kent Overstreet
[not found] ` <20120523034546.GB607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:20 ` Tejun Heo
2012-05-23 5:20 ` Tejun Heo
2012-05-23 5:34 ` Kent Overstreet
[not found] ` <20120523053403.GB14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 17:24 ` Tejun Heo
2012-05-23 17:24 ` Tejun Heo
2012-05-22 22:40 ` Tejun Heo
2012-05-22 22:40 ` Tejun Heo
2012-05-30 7:47 ` Tejun Heo
2012-05-30 7:47 ` Tejun Heo
[not found] ` <20120530074708.GA32121-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-31 1:09 ` Kent Overstreet
2012-05-31 1:09 ` Kent Overstreet
2012-05-10 3:11 ` [Bcache v13 12/16] bcache: Bset code (lookups within a btree node) Kent Overstreet
[not found] ` <5b5998d7d09ec36377acdb5d15665d1e4e818521.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-22 22:39 ` Tejun Heo [this message]
2012-05-22 22:39 ` Tejun Heo
[not found] ` <20120522223932.GK14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 4:21 ` Kent Overstreet
2012-05-23 4:21 ` Kent Overstreet
[not found] ` <20120523042114.GC607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 17:55 ` Tejun Heo
2012-05-23 17:55 ` Tejun Heo
[not found] ` <20120523175544.GC18143-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 20:49 ` Tejun Heo
2012-05-23 20:49 ` Tejun Heo
[not found] ` <20120523204914.GC3933-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2012-05-24 18:11 ` Tejun Heo
2012-05-24 18:11 ` Tejun Heo
2012-05-10 3:11 ` [Bcache v13 13/16] bcache: Journalling Kent Overstreet
2012-05-10 3:11 ` [Bcache v13 14/16] bcache: Request, io and allocation code Kent Overstreet
[not found] ` <9ea33658f2a71b3b9bd2ec10bee959bef146f23c.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-22 22:42 ` Tejun Heo
2012-05-22 22:42 ` Tejun Heo
[not found] ` <20120522224255.GM14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 1:44 ` Kent Overstreet
2012-05-23 1:44 ` Kent Overstreet
2012-05-23 4:24 ` Kent Overstreet
2012-05-23 4:24 ` Kent Overstreet
2012-05-22 22:44 ` Tejun Heo
2012-05-22 22:44 ` Tejun Heo
2012-05-30 7:23 ` Tejun Heo
2012-05-30 7:23 ` Tejun Heo
[not found] ` <20120530072358.GB4854-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-31 0:52 ` Kent Overstreet
2012-05-31 0:52 ` Kent Overstreet
[not found] ` <20120531005224.GA5645-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-31 2:43 ` Tejun Heo
2012-05-31 2:43 ` Tejun Heo
2012-05-31 5:13 ` Kent Overstreet
[not found] ` <20120531051321.GA12602-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-31 6:45 ` Tejun Heo
2012-05-31 6:45 ` Tejun Heo
[not found] ` <20120531064515.GA18984-9pTldWuhBndy/B6EtB590w@public.gmane.org>
2012-06-01 2:37 ` Tejun Heo
2012-06-01 2:37 ` Tejun Heo
2012-05-31 2:45 ` Tejun Heo
2012-05-30 7:32 ` Tejun Heo
2012-05-30 7:32 ` Tejun Heo
2012-05-10 3:11 ` [Bcache v13 15/16] bcache: Writeback Kent Overstreet
2012-05-10 13:54 ` [Bcache v13 00/16] Vivek Goyal
2012-05-10 13:54 ` [dm-devel] " Vivek Goyal
2012-05-10 15:03 ` Vivek Goyal
[not found] ` <20120510150353.GI23768-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-10 15:34 ` Kent Overstreet
2012-05-10 15:34 ` Kent Overstreet
[not found] ` <cover.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 3:08 ` [Bcache v13 01/16] Only clone bio vecs that are in use Kent Overstreet
2012-05-10 3:08 ` Kent Overstreet
[not found] ` <cb817596299fecd01ea36e4a80203f23165bda75.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:35 ` [dm-devel] " Vivek Goyal
2012-05-10 21:35 ` Vivek Goyal
[not found] ` <20120510213556.GO23768-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:42 ` Kent Overstreet
2012-05-10 21:42 ` Kent Overstreet
[not found] ` <CAH+dOxJ2Vi=8Oq1zDZLmqD9-a_wgM=co3+xemw4XBoiDkh_4zg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-05-11 13:29 ` Jeff Moyer
2012-05-11 13:29 ` Jeff Moyer
2012-05-11 20:29 ` Kent Overstreet
2012-05-15 16:19 ` Tejun Heo
2012-05-15 16:19 ` Tejun Heo
2012-05-10 3:08 ` [Bcache v13 02/16] Bio pool freeing Kent Overstreet
2012-05-10 3:08 ` Kent Overstreet
[not found] ` <ba8ce9fcca87f192ff5f5d3a436eb8f4d0bcb006.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:32 ` [dm-devel] " Vivek Goyal
2012-05-10 21:32 ` Vivek Goyal
2012-05-10 21:39 ` Kent Overstreet
[not found] ` <CAH+dOxL7QwcyUm46cK-pF1qK+kHYC=67iAaQDDwUF2ssJwergA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-05-10 21:52 ` Vivek Goyal
2012-05-10 21:52 ` Vivek Goyal
[not found] ` <20120510215208.GC2613-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:53 ` Kent Overstreet
2012-05-10 21:53 ` Kent Overstreet
2012-05-15 16:24 ` Tejun Heo
2012-05-15 16:24 ` Tejun Heo
2012-05-15 16:25 ` Tejun Heo
2012-05-15 16:25 ` Tejun Heo
2012-05-10 3:08 ` [Bcache v13 03/16] Revert "rw_semaphore: remove up/down_read_non_owner" Kent Overstreet
2012-05-10 3:08 ` Kent Overstreet
[not found] ` <3f51ec3e69b8f471e2d1cc539f01504e2b903fed.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 16:37 ` Tejun Heo
2012-05-15 16:37 ` Tejun Heo
2012-05-15 16:38 ` Tejun Heo
2012-05-10 3:09 ` [Bcache v13 04/16] Fix ratelimit macro to compile in c99 mode Kent Overstreet
2012-05-10 3:09 ` Kent Overstreet
[not found] ` <d7cfd6b70316efc3fe2ce575203d906a610e3670.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 16:43 ` Tejun Heo
2012-05-15 16:43 ` Tejun Heo
2012-05-10 3:09 ` [Bcache v13 06/16] Export blk_fill_rwbs() Kent Overstreet
2012-05-10 3:09 ` Kent Overstreet
2012-05-10 3:11 ` [Bcache v13 16/16] bcache: Debug and tracing code Kent Overstreet
2012-05-10 3:11 ` Kent Overstreet
2012-05-10 18:34 ` [Bcache v13 00/16] Dan Williams
2012-05-10 18:34 ` Dan Williams
2012-05-18 10:06 ` Arnd Bergmann
2012-05-18 10:06 ` Arnd Bergmann
2012-05-30 8:29 ` Tejun Heo
2012-05-30 8:29 ` Tejun Heo
2012-05-30 8:54 ` Zhi Yong Wu
2012-05-30 8:54 ` Zhi Yong Wu
[not found] ` <1188908028.170.1336674698865.JavaMail.mail@webmail09>
2012-05-10 18:49 ` [Bcache v13 11/16] bcache: Core btree code Joe Perches
2012-05-10 21:48 ` Kent Overstreet
2012-05-10 21:48 ` Kent Overstreet
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=20120522223932.GK14339@google.com \
--to=tj-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
--cc=agk-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=dm-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/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.