[Devel] [PATCH vz9 v1 33/63] dm-ploop: convert md page rw lock to spin lock
Alexander Atanasov
alexander.atanasov at virtuozzo.com
Fri Jan 24 18:36:07 MSK 2025
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.atanasov at 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
More information about the Devel
mailing list