bcache: avoid unncessary cache prefetch bch_btree_node_get()
authorColy Li <colyli@suse.de>
Thu, 9 Aug 2018 07:48:44 +0000 (15:48 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 9 Aug 2018 14:21:05 +0000 (08:21 -0600)
In bch_btree_node_get() the read-in btree node will be partially
prefetched into L1 cache for following bset iteration (if there is).
But if the btree node read is failed, the perfetch operations will
waste L1 cache space. This patch checkes whether read operation and
only does cache prefetch when read I/O succeeded.

Signed-off-by: Coly Li <colyli@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/btree.c

index 475008fbbaab6ab1dd72e8264d54215bba0eb4ca..c19f7716df8800b95184f25f629349109fcfbc20 100644 (file)
@@ -1011,6 +1011,13 @@ retry:
                BUG_ON(b->level != level);
        }
 
+       if (btree_node_io_error(b)) {
+               rw_unlock(write, b);
+               return ERR_PTR(-EIO);
+       }
+
+       BUG_ON(!b->written);
+
        b->parent = parent;
        b->accessed = 1;
 
@@ -1022,13 +1029,6 @@ retry:
        for (; i <= b->keys.nsets; i++)
                prefetch(b->keys.set[i].data);
 
-       if (btree_node_io_error(b)) {
-               rw_unlock(write, b);
-               return ERR_PTR(-EIO);
-       }
-
-       BUG_ON(!b->written);
-
        return b;
 }