bcache: Don't touch bucket gen for dirty ptrs
authorKent Overstreet <kmo@daterainc.com>
Sat, 10 Aug 2013 04:14:13 +0000 (21:14 -0700)
committerKent Overstreet <kmo@daterainc.com>
Wed, 8 Jan 2014 21:05:07 +0000 (13:05 -0800)
Unnecessary since a bucket that has dirty pointers pointing to it can
never be invalidated - and skipping it is a measurable performance
boost, since the bucket gen will usually be a cache miss.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
drivers/md/bcache/bset.c
drivers/md/bcache/request.c

index 1695870..e51a739 100644 (file)
@@ -176,10 +176,14 @@ bool bch_ptr_bad(struct btree *b, const struct bkey *k)
            bch_ptr_invalid(b, k))
                return true;
 
-       for (i = 0; i < KEY_PTRS(k); i++) {
+       for (i = 0; i < KEY_PTRS(k); i++)
                if (!ptr_available(b->c, k, i))
                        return true;
 
+       if (!expensive_debug_checks(b->c) && KEY_DIRTY(k))
+               return false;
+
+       for (i = 0; i < KEY_PTRS(k); i++) {
                g = PTR_BUCKET(b->c, k, i);
                stale = ptr_stale(b->c, k, i);
 
index 5878cdb..59b3d6d 100644 (file)
@@ -630,7 +630,8 @@ static void bch_cache_read_endio(struct bio *bio, int error)
 
        if (error)
                s->iop.error = error;
-       else if (ptr_stale(s->iop.c, &b->key, 0)) {
+       else if (!KEY_DIRTY(&b->key) &&
+                ptr_stale(s->iop.c, &b->key, 0)) {
                atomic_long_inc(&s->iop.c->cache_read_races);
                s->iop.error = -EINTR;
        }