The commit is pushed to "branch-rh8-4.18.0-240.1.1.vz8.6.x-ovz" and will appear 
at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-240.1.1.el8
------>
commit 63d14109f789da1907d2383d43a4f6f185ab155d
Author: Kirill Tkhai <ktk...@virtuozzo.com>
Date:   Fri Jul 2 22:43:26 2021 +0300

    ploop: Introduce batch list for md pages writeback
    
    Every iteration of do_ploop_work collects changes
    to md pages. On the end of work we submit all of
    the md pages writeback in parallel.
    
    https://jira.sw.ru/browse/PSBM-124550
    
    Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
    
    ==========================
    Parallel async BAT pages submission and improvements
    
    [1-15]:
    https://jira.sw.ru/browse/PSBM-124550
    
    [16-22]:
    following improvements
    
    Kirill Tkhai (22):
          ploop: Remove absolet comment
          ploop: Add md and piwb cross pointers
          ploop: Add @md argument to locate_new_cluster_and_attach_pio()
          ploop: Refactoring in process_one_discard_pio()
          ploop: Pass type argument to ploop_prepare_bat_update()
          ploop: Move md is busy check to delay_if_md_busy()
          ploop: Introduce batch list for md pages writeback
          ploop: Check for md dirty instead of md piwb
          ploop: Reread piwb after ploop_prepare_bat_update()
          ploop: Change argument in ploop_prepare_bat_update()
          ploop: Return md from ploop_prepare_reloc_index_wb()
          ploop: Change arguments and rename ploop_reset_bat_update()
          ploop: Allow parallel wb of md pages
          ploop: Async md writeback
          ploop: Rename ploop_submit_index_wb_sync()
          ploop: Resubmit pios from main kwork
          ploop: Rename process_delta_wb()
          ploop: Do fsync after bat page write
          ploop: Do not iterate excess clusters in notify_delta_merged()
          ploop: Use kvec in ploop_delta_check_header()
          ploop: Add argument to ploop_read_delta_metadata()
          ploop: Underline clu and page is u32
---
 drivers/md/dm-ploop-bat.c    |  2 ++
 drivers/md/dm-ploop-cmd.c    |  9 +++++++
 drivers/md/dm-ploop-map.c    | 57 ++++++++++++++++++++++++++++++++++++++++----
 drivers/md/dm-ploop-target.c |  1 +
 drivers/md/dm-ploop.h        |  7 ++++++
 5 files changed, 71 insertions(+), 5 deletions(-)

diff --git a/drivers/md/dm-ploop-bat.c b/drivers/md/dm-ploop-bat.c
index b445663c8be6..ad9c3a171dc9 100644
--- a/drivers/md/dm-ploop-bat.c
+++ b/drivers/md/dm-ploop-bat.c
@@ -79,7 +79,9 @@ static struct md_page * alloc_md_page(unsigned int id)
        if (!page)
                goto err_page;
        INIT_LIST_HEAD(&md->wait_list);
+       INIT_LIST_HEAD(&md->wb_link);
 
+       md->status = 0;
        md->bat_levels = levels;
        md->piwb = NULL;
        md->page = page;
diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index bf9e2c04138a..183524f61243 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -266,6 +266,13 @@ static int ploop_write_zero_cluster_sync(struct ploop 
*ploop,
        return ploop_write_cluster_sync(ploop, pio, clu);
 }
 
+static void ploop_make_md_wb(struct ploop *ploop, struct md_page *md)
+{
+       write_lock_irq(&ploop->bat_rwlock);
+       md->status |= MD_WRITEBACK;
+       write_unlock_irq(&ploop->bat_rwlock);
+}
+
 static int ploop_grow_relocate_cluster(struct ploop *ploop,
                                       struct ploop_index_wb *piwb,
                                       struct ploop_cmd *cmd)
@@ -308,6 +315,7 @@ static int ploop_grow_relocate_cluster(struct ploop *ploop,
                goto out;
        }
 
+       ploop_make_md_wb(ploop, piwb->md);
        /* Write new index on disk */
        ploop_submit_index_wb_sync(ploop, piwb);
        ret = blk_status_to_errno(piwb->bi_status);
@@ -360,6 +368,7 @@ static int ploop_grow_update_header(struct ploop *ploop,
        offset = hdr->m_FirstBlockOffset = cpu_to_le32(first_block_off);
        kunmap_atomic(hdr);
 
+       ploop_make_md_wb(ploop, piwb->md);
        ploop_submit_index_wb_sync(ploop, piwb);
        ret = blk_status_to_errno(piwb->bi_status);
        if (!ret) {
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 877e29226a45..d91baef66973 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -463,6 +463,23 @@ static void unlink_completed_pio(struct ploop *ploop, 
struct pio *pio)
                dispatch_pios(ploop, NULL, &pio_list);
 }
 
+static bool ploop_md_make_dirty(struct ploop *ploop, struct md_page *md)
+{
+       unsigned long flags;
+       bool new = false;
+
+       write_lock_irqsave(&ploop->bat_rwlock, flags);
+       WARN_ON_ONCE((md->status & MD_WRITEBACK));
+        if (!(md->status & MD_DIRTY)) {
+                md->status |= MD_DIRTY;
+                list_add_tail(&md->wb_link, &ploop->wb_batch_list);
+                new = true;
+       }
+       write_unlock_irqrestore(&ploop->bat_rwlock, flags);
+
+       return new;
+}
+
 static bool pio_endio_if_all_zeros(struct pio *pio)
 {
        struct bvec_iter bi = {
@@ -695,6 +712,8 @@ static void ploop_advance_local_after_bat_wb(struct ploop 
*ploop,
                }
        }
 
+       WARN_ON_ONCE(!(md->status & MD_WRITEBACK));
+       md->status &= ~MD_WRITEBACK;
        list_splice_tail_init(&md->wait_list, &list);
        write_unlock_irqrestore(&ploop->bat_rwlock, flags);
        kunmap_atomic(dst_clu);
@@ -1259,6 +1278,7 @@ static void submit_cow_index_wb(struct ploop_cow *cow,
                /* No index wb in process. Prepare a new one */
                if (ploop_prepare_bat_update(ploop, page_id, piwb, 
PIWB_TYPE_ALLOC) < 0)
                        goto err_resource;
+               ploop_md_make_dirty(ploop, md);
        }
 
        clu -= page_id * PAGE_SIZE / sizeof(map_index_t) - PLOOP_MAP_OFFSET;
@@ -1354,6 +1374,9 @@ static bool locate_new_cluster_and_attach_pio(struct 
ploop *ploop,
                goto error;
        }
 
+       if (bat_update_prepared)
+               ploop_md_make_dirty(ploop, md);
+
        ploop_attach_end_action(pio, piwb);
        attached = true;
 out:
@@ -1497,6 +1520,9 @@ static void process_one_discard_pio(struct ploop *ploop, 
struct pio *pio,
                list_add_tail(&pio->list, &piwb->ready_data_pios);
        }
        kunmap_atomic(to);
+
+       if (bat_update_prepared)
+               ploop_md_make_dirty(ploop, md);
 out:
        return;
 err:
@@ -1524,6 +1550,31 @@ static void process_resubmit_pios(struct ploop *ploop, 
struct list_head *pios)
        }
 }
 
+static void submit_metadata_writeback(struct ploop *ploop)
+{
+       struct md_page *md;
+
+       while (1) {
+               write_lock_irq(&ploop->bat_rwlock);
+               md = list_first_entry_or_null(&ploop->wb_batch_list,
+                               struct md_page, wb_link);
+               if (!md) {
+                       write_unlock_irq(&ploop->bat_rwlock);
+                       break;
+               }
+               list_del_init(&md->wb_link);
+               /* L1L2 mustn't be redirtyed, when wb in-flight! */
+               WARN_ON_ONCE(!(md->status & MD_DIRTY) ||
+                            (md->status & MD_WRITEBACK));
+               md->status |= MD_WRITEBACK;
+               md->status &= ~MD_DIRTY;
+               write_unlock_irq(&ploop->bat_rwlock);
+
+               ploop_submit_index_wb_sync(ploop, md->piwb);
+               ploop_reset_bat_update(md->piwb);
+       }
+}
+
 void do_ploop_work(struct work_struct *ws)
 {
        struct ploop *ploop = container_of(ws, struct ploop, worker);
@@ -1555,11 +1606,7 @@ void do_ploop_work(struct work_struct *ws)
        process_discard_pios(ploop, &discard_pios, &piwb);
        process_delta_wb(ploop, &cow_pios, &piwb);
 
-       if (piwb.page_id != PAGE_NR_NONE) {
-               /* Index wb was prepared -- submit and wait it */
-               ploop_submit_index_wb_sync(ploop, &piwb);
-               ploop_reset_bat_update(&piwb);
-       }
+       submit_metadata_writeback(ploop);
 
        current->flags = (current->flags & ~PF_IO_THREAD) | pf_io_thread;
 }
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index d4413ff259a5..705f2252e822 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -334,6 +334,7 @@ static int ploop_ctr(struct dm_target *ti, unsigned int 
argc, char **argv)
        INIT_LIST_HEAD(&ploop->resubmit_pios);
        INIT_LIST_HEAD(&ploop->enospc_pios);
        INIT_LIST_HEAD(&ploop->cluster_lk_list);
+       INIT_LIST_HEAD(&ploop->wb_batch_list);
        ploop->bat_entries = RB_ROOT;
        timer_setup(&ploop->enospc_timer, ploop_enospc_timer, 0);
 
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 879d7c5b25e7..babdfdb7f672 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -110,9 +110,14 @@ struct ploop_index_wb {
 struct md_page {
        struct rb_node node;
        unsigned int id; /* Number of this page starting from hdr */
+#define MD_DIRTY       (1U << 1) /* Page contains changes and wants writeback 
*/
+#define MD_WRITEBACK   (1U << 2) /* Writeback was submitted */
+       unsigned int status;
        struct page *page;
        u8 *bat_levels;
        struct list_head wait_list;
+
+       struct list_head wb_link;
        struct ploop_index_wb *piwb;
 };
 
@@ -146,6 +151,8 @@ struct ploop {
        unsigned int hb_nr; /* holes_bitmap size in bits */
        rwlock_t bat_rwlock;
 
+       struct list_head wb_batch_list;
+
        void *tracking_bitmap;
        unsigned int tb_nr; /* tracking_bitmap size in bits */
        unsigned int tb_cursor;
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to