On 2020/9/22 23:47, Liu Hua wrote: > 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. > Could you please to explain more detais about, - How does "Btree spliting and garbage collection process will drop placeholders" happen? - And how does the consequence "cache miss collision" happen? - Do you observe performance improvement? If yes, which part is improved and what is the performance number? Thanks in advance. Coly Li > 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); > >