Btree spliting and garbage collection process will drop placeholders, which may cause cache miss collision. We can insert nonoverlapping bkeys with write lock. It is helpful for performance. Signed-off-by: Liu Hua <liusdu@xxxxxxx> --- drivers/md/bcache/extents.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c index c809724e6571..acebe5bdb3f1 100644 --- a/drivers/md/bcache/extents.c +++ b/drivers/md/bcache/extents.c @@ -329,6 +329,7 @@ static bool bch_extent_insert_fixup(struct btree_keys *b, uint64_t old_offset; unsigned int old_size, sectors_found = 0; + bool overlap = false; BUG_ON(!KEY_OFFSET(insert)); BUG_ON(!KEY_SIZE(insert)); @@ -340,15 +341,18 @@ static bool bch_extent_insert_fixup(struct btree_keys *b, break; if (bkey_cmp(&START_KEY(k), insert) >= 0) { - if (KEY_SIZE(k)) - break; - else + if (!KEY_SIZE(k)) continue; + if (replace_key && overlap == false) + goto out; + break; } if (bkey_cmp(k, &START_KEY(insert)) <= 0) continue; + overlap = true; + old_offset = KEY_START(k); old_size = KEY_SIZE(k); -- 2.17.1