ploop_advance_local_after_bat_wb is handling only one md page, so it is possible do simplify discard completion done in ploop_piwb_discard_completed. initialization overlaps and there is an extra md page lookup which can be avoided.
remove the function and integrate it into ploop_advance_local_after_bat_wb. This also makes locking more obvious. https://virtuozzo.atlassian.net/browse/VSTOR-98392 Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com> --- drivers/md/dm-ploop-map.c | 45 ++++++++++++--------------------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index 98297fb46bb6..ef0a7e10d1cc 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -798,36 +798,6 @@ static void ploop_complete_cow(struct ploop_cow *cow, blk_status_t bi_status) kmem_cache_free(cow_cache, cow); } -static void ploop_piwb_discard_completed(struct ploop *ploop, - bool success, u32 clu, u32 new_dst_clu) -{ - u32 id, *bat_entries, dst_clu; - struct md_page *md; - u8 level; - - if (new_dst_clu) - return; - - id = ploop_bat_clu_to_page_nr(clu); - md = ploop_md_page_find(ploop, id); - BUG_ON(!md); - - clu = ploop_bat_clu_idx_in_page(clu); /* relative to page */ - - bat_entries = md->kmpage; - dst_clu = READ_ONCE(bat_entries[clu]); - level = md->bat_levels[clu]; - - if (!(dst_clu == BAT_ENTRY_NONE || level < ploop_top_level(ploop))) { - WARN_ON_ONCE(ploop->nr_deltas != 1); - if (success) { - WRITE_ONCE(bat_entries[clu], BAT_ENTRY_NONE); - WRITE_ONCE(md->bat_levels[clu], 0); - ploop_hole_set_bit(dst_clu, ploop); - } - } -} - /* * Update local BAT copy with written indexes on success. * Mark allocate clusters as holes on failure. @@ -872,7 +842,20 @@ static void ploop_advance_local_after_bat_wb(struct ploop *ploop, #endif for (; i < last; i++) { if (piwb->type == PIWB_TYPE_DISCARD) { - ploop_piwb_discard_completed(ploop, success, i + off, dst_clu[i]); + /* discard completed */ + u32 clu = i + off; + u8 level = md->bat_levels[clu]; + u32 d_clu = READ_ONCE(bat_entries[clu]); + + if (success && !dst_clu[i] && + (!(d_clu == BAT_ENTRY_NONE || + level < ploop_top_level(ploop)))) { + WARN_ON_ONCE(ploop->nr_deltas != 1); + WRITE_ONCE(bat_entries[clu], BAT_ENTRY_NONE); + WRITE_ONCE(md->bat_levels[clu], 0); + ploop_hole_set_bit(d_clu, ploop); + } + continue; } -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel