bcache: Write out full stripes
Now that we're tracking dirty data per stripe, we can add two optimizations for raid5/6: * If a stripe is already dirty, force writes to that stripe to writeback mode - to help build up full stripes of dirty data * When flushing dirty data, preferentially write out full stripes first if there are any. Signed-off-by: Kent Overstreet <koverstreet@google.com>
Этот коммит содержится в:
@@ -2252,7 +2252,8 @@ static inline int keybuf_nonoverlapping_cmp(struct keybuf_key *l,
|
||||
}
|
||||
|
||||
static int bch_btree_refill_keybuf(struct btree *b, struct btree_op *op,
|
||||
struct keybuf *buf, struct bkey *end)
|
||||
struct keybuf *buf, struct bkey *end,
|
||||
keybuf_pred_fn *pred)
|
||||
{
|
||||
struct btree_iter iter;
|
||||
bch_btree_iter_init(b, &iter, &buf->last_scanned);
|
||||
@@ -2271,7 +2272,7 @@ static int bch_btree_refill_keybuf(struct btree *b, struct btree_op *op,
|
||||
if (bkey_cmp(&buf->last_scanned, end) >= 0)
|
||||
break;
|
||||
|
||||
if (buf->key_predicate(buf, k)) {
|
||||
if (pred(buf, k)) {
|
||||
struct keybuf_key *w;
|
||||
|
||||
spin_lock(&buf->lock);
|
||||
@@ -2290,7 +2291,7 @@ static int bch_btree_refill_keybuf(struct btree *b, struct btree_op *op,
|
||||
if (!k)
|
||||
break;
|
||||
|
||||
btree(refill_keybuf, k, b, op, buf, end);
|
||||
btree(refill_keybuf, k, b, op, buf, end, pred);
|
||||
/*
|
||||
* Might get an error here, but can't really do anything
|
||||
* and it'll get logged elsewhere. Just read what we
|
||||
@@ -2308,7 +2309,7 @@ static int bch_btree_refill_keybuf(struct btree *b, struct btree_op *op,
|
||||
}
|
||||
|
||||
void bch_refill_keybuf(struct cache_set *c, struct keybuf *buf,
|
||||
struct bkey *end)
|
||||
struct bkey *end, keybuf_pred_fn *pred)
|
||||
{
|
||||
struct bkey start = buf->last_scanned;
|
||||
struct btree_op op;
|
||||
@@ -2316,7 +2317,7 @@ void bch_refill_keybuf(struct cache_set *c, struct keybuf *buf,
|
||||
|
||||
cond_resched();
|
||||
|
||||
btree_root(refill_keybuf, c, &op, buf, end);
|
||||
btree_root(refill_keybuf, c, &op, buf, end, pred);
|
||||
closure_sync(&op.cl);
|
||||
|
||||
pr_debug("found %s keys from %llu:%llu to %llu:%llu",
|
||||
@@ -2402,7 +2403,8 @@ struct keybuf_key *bch_keybuf_next(struct keybuf *buf)
|
||||
|
||||
struct keybuf_key *bch_keybuf_next_rescan(struct cache_set *c,
|
||||
struct keybuf *buf,
|
||||
struct bkey *end)
|
||||
struct bkey *end,
|
||||
keybuf_pred_fn *pred)
|
||||
{
|
||||
struct keybuf_key *ret;
|
||||
|
||||
@@ -2416,15 +2418,14 @@ struct keybuf_key *bch_keybuf_next_rescan(struct cache_set *c,
|
||||
break;
|
||||
}
|
||||
|
||||
bch_refill_keybuf(c, buf, end);
|
||||
bch_refill_keybuf(c, buf, end, pred);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void bch_keybuf_init(struct keybuf *buf, keybuf_pred_fn *fn)
|
||||
void bch_keybuf_init(struct keybuf *buf)
|
||||
{
|
||||
buf->key_predicate = fn;
|
||||
buf->last_scanned = MAX_KEY;
|
||||
buf->keys = RB_ROOT;
|
||||
|
||||
|
Ссылка в новой задаче
Block a user