Prepare locking for threads. Some operations require to lock bat data (see next patch) and in some cases we need to lock md page while hodling bat spin lock but we can not take sleeping lock while holding a spin lock. To address this use a spin lock for md pages instead of rwlock.
https://virtuozzo.atlassian.net/browse/VSTOR-91821 Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com> --- drivers/md/dm-ploop-cmd.c | 9 ++++----- drivers/md/dm-ploop-map.c | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c index f98542e952e1..fa9f8c9d8d40 100644 --- a/drivers/md/dm-ploop-cmd.c +++ b/drivers/md/dm-ploop-cmd.c @@ -34,7 +34,7 @@ static void ploop_advance_holes_bitmap(struct ploop *ploop, return; cmd->resize.stage++; - write_lock_irq(&ploop->bat_rwlock); + write_lock_irqsave(&ploop->bat_rwlock, flags); /* Copy and swap holes_bitmap */ size = DIV_ROUND_UP(ploop->hb_nr, 8); memcpy(cmd->resize.holes_bitmap, ploop->holes_bitmap, size); @@ -46,7 +46,7 @@ static void ploop_advance_holes_bitmap(struct ploop *ploop, ploop_init_be_iter(ploop, md->id, &i, &end); bat_entries = md->kmpage; - spin_lock_irqsave(&md->md_lock, flags); /* read */ + spin_lock(&md->md_lock); /* read */ for (; i <= end; i++) { if (!ploop_md_page_cluster_is_in_top_delta(ploop, md, i)) continue; @@ -57,9 +57,9 @@ static void ploop_advance_holes_bitmap(struct ploop *ploop, ploop_hole_clear_bit(dst_clu, ploop); } } - spin_unlock_irqrestore(&md->md_lock, flags); + spin_unlock(&md->md_lock); } - write_unlock_irq(&ploop->bat_rwlock); + write_unlock_irqrestore(&ploop->bat_rwlock, flags); } static int ploop_wait_for_completion_maybe_killable(struct completion *comp, @@ -730,7 +730,6 @@ static void notify_delta_merged(struct ploop *ploop, u8 level, spin_lock_irqsave(&md->md_lock, flags); /* write */ spin_lock(&d_md->md_lock); /* write */ - for (; i <= end; i++) { clu = ploop_page_clu_idx_to_bat_clu(md->id, i); if (clu == nr_be - 1) diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index 4b5992335e04..052dae188264 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -960,14 +960,13 @@ static int ploop_prepare_bat_update(struct ploop *ploop, struct md_page *md, bat_entries = md->kmpage; spin_lock_irq(&md->md_lock); /* write */ + WARN_ON_ONCE(md->piwb); md->piwb = piwb; piwb->md = md; - spin_unlock_irq(&md->md_lock); piwb->page_id = page_id; to = kmap_local_page(page); - spin_lock_irq(&md->md_lock); memcpy((void *)to, bat_entries, PAGE_SIZE); /* Absolute number of first index in page (negative for page#0) */ -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel