Prepare to reduce locking by using atomic 32 bit access to the fields. To ensure this we need to use the _ONCE macros.
https://virtuozzo.atlassian.net/browse/VSTOR-91659 Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com> --- drivers/md/dm-ploop-bat.c | 2 +- drivers/md/dm-ploop-map.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/md/dm-ploop-bat.c b/drivers/md/dm-ploop-bat.c index 30c9e45ccf2f..0fce5ed998d6 100644 --- a/drivers/md/dm-ploop-bat.c +++ b/drivers/md/dm-ploop-bat.c @@ -143,7 +143,7 @@ bool ploop_try_update_bat_entry(struct ploop *ploop, u32 clu, u8 level, u32 dst_ clu = ploop_bat_clu_idx_in_page(clu); /* relative offset */ - if (md->bat_levels[clu] == level) { + if (READ_ONCE(md->bat_levels[clu]) == level) { bat_entries = md->kmpage; WRITE_ONCE(bat_entries[clu], dst_clu); return true; diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index 481ca6556d69..9f7efed45c2a 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -724,9 +724,9 @@ static void ploop_release_cluster(struct ploop *ploop, u32 clu) clu = ploop_bat_clu_idx_in_page(clu); /* relative to page */ bat_entries = md->kmpage; - dst_clu = bat_entries[clu]; - bat_entries[clu] = BAT_ENTRY_NONE; - md->bat_levels[clu] = 0; + dst_clu = READ_ONCE(bat_entries[clu]); + WRITE_ONCE(bat_entries[clu], BAT_ENTRY_NONE); + WRITE_ONCE(md->bat_levels[clu], 0); ploop_hole_set_bit(dst_clu, ploop); } @@ -794,8 +794,8 @@ static void ploop_advance_local_after_bat_wb(struct ploop *ploop, } if (success) { - bat_entries[i] = dst_clu[i]; - md->bat_levels[i] = ploop_top_level(ploop); + bat_entries[i] = READ_ONCE(dst_clu[i]); + WRITE_ONCE(md->bat_levels[i], ploop_top_level(ploop)); } else { ploop_hole_set_bit(i + off, ploop); } @@ -1090,9 +1090,9 @@ static int ploop_alloc_cluster(struct ploop *ploop, struct ploop_index_wb *piwb, clu -= piwb->page_id * PAGE_SIZE / sizeof(map_index_t) - PLOOP_MAP_OFFSET; to = piwb->kmpage; - if (to[clu]) { + if (READ_ONCE(to[clu])) { /* Already mapped by one of previous bios */ - *dst_clu = to[clu]; + *dst_clu = READ_ONCE(to[clu]); already_alloced = true; } @@ -1104,7 +1104,7 @@ static int ploop_alloc_cluster(struct ploop *ploop, struct ploop_index_wb *piwb, goto out; to = piwb->kmpage; - to[clu] = *dst_clu; + WRITE_ONCE(to[clu], *dst_clu); out: return ret; } @@ -1386,7 +1386,7 @@ static void ploop_submit_cow_index_wb(struct ploop_cow *cow) to = piwb->kmpage; WARN_ON(to[clu]); - to[clu] = cow->dst_clu; + WRITE_ONCE(to[clu], cow->dst_clu); /* Prevent double clearing of holes_bitmap bit on complete_cow() */ cow->dst_clu = BAT_ENTRY_NONE; -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel