On 1/20/25 11:25, Pavel Tikhomirov wrote:


On 12/6/24 05:55, Alexander Atanasov wrote:
From: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>

Do not bother with locked clusters. For llseek we can ignore all
concurrent operations.
Do not call ploop_bat_entries() on every cluster as this is slow.
Just remember md and read it directly.

https://virtuozzo.atlassian.net/browse/VSTOR-91817
Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>
---
  drivers/md/dm-ploop-map.c | 27 ++++++++-------------------
  1 file changed, 8 insertions(+), 19 deletions(-)

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 7ecf79fcd2cc..ad7ca7d43dfc 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -2088,32 +2088,21 @@ ALLOW_ERROR_INJECTION(ploop_prepare_reloc_index_wb, ERRNO);   loff_t ploop_llseek_hole(struct dm_target *ti, loff_t offset, int whence)
  {
      struct ploop *ploop = ti->private;
-    u32 clu, dst_clu;
+    u32 clu, dst_clu, id, *bat;
+    struct md_page *md;
      loff_t result;
      clu = SEC_TO_CLU(ploop, to_sector(offset) + ploop->skip_off);
+    id = U32_MAX;
      while (clu < ploop->nr_bat_entries) {
-
-        /*
-         * Assume a locked cluster to have a data.
-         * In worst case someone will read zeroes
-         */
-        if (ploop_postpone_if_cluster_locked(ploop, NULL, clu)) {
-            if (whence & SEEK_DATA)
-                break;
-            if (whence & SEEK_HOLE) {
-                clu++;
-                continue;
-            }
+        if (id != ploop_bat_clu_to_page_nr(clu)) {
+            id = ploop_bat_clu_to_page_nr(clu);
+            md = ploop_md_page_find(ploop, id);
          }
-        /*
-         * It *may* be possible to speed this up by iterating over clusters
-         * in mapped metadata page, but this is a bit problematic
-         * since we want to check if cluster is locked
-         */
-        dst_clu = ploop_bat_entries(ploop, clu, NULL, NULL);


+        bat = md->kmpage;
+        dst_clu = READ_ONCE(bat[ploop_bat_clu_idx_in_page(clu)]);

Before this patch we used ploop_bat_entries which takes md->md_lock around dst_clu reading, shouldn't we do the same here too?

Ah, I see, we have md_lock in ploop_bat_entries to make returned bat_level and dst_clu in sync. And as we don't use level here we don't need a lock.


          if (whence & SEEK_DATA && dst_clu != BAT_ENTRY_NONE)
              break;


--
Best regards, Tikhomirov Pavel
Senior Software Developer, Virtuozzo.

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to