[Devel] [PATCH vz9 v1 56/63] dm-ploop: rework logic in pio processing
Alexander Atanasov
alexander.atanasov at virtuozzo.com
Fri Jan 24 18:36:30 MSK 2025
improve how and when we wait for pios to complete
before proceeding with next pios.
force writing of pending md pages in case we have a sync pios.
remove now unused functions.
https://virtuozzo.atlassian.net/browse/VSTOR-91821
Signed-off-by: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
---
drivers/md/dm-ploop-map.c | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 35d12fd54050..f9904e708c35 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -2049,6 +2049,7 @@ void do_ploop_run_work(struct ploop *ploop)
struct llist_node *llflush_pios;
unsigned int old_flags = current->flags;
int npios;
+ int force_md_update;
current->flags |= PF_IO_THREAD|PF_LOCAL_THROTTLE|PF_MEMALLOC_NOIO;
@@ -2064,8 +2065,7 @@ void do_ploop_run_work(struct ploop *ploop)
ploop_runners_add_work_list(ploop, lldeferred_pios);
if (llembedded_pios)
- ploop_prepare_embedded_pios(ploop, llist_reverse_order(llembedded_pios),
- &deferred_pios);
+ ploop_prepare_embedded_pios(ploop, llembedded_pios, &deferred_pios);
llflush_pios = llist_del_all(&ploop->pios[PLOOP_LIST_FLUSH]);
@@ -2080,23 +2080,28 @@ void do_ploop_run_work(struct ploop *ploop)
if (llcow_pios)
ploop_runners_add_work_list(ploop, llcow_pios);
- /* wait for all pios to be executed before metadata updates */
+ /*
+ * put stick in the wheel - wait for all pios to be executed before doing metadata
+ * we could gain a bit more iops if we can skip this wait but for now we can not
+ */
current->flags = old_flags;
- wait_event_interruptible(ploop->dispatcher_wq_data, (!ploop_runners_have_pending(ploop)));
+ wait_event_interruptible(ploop->dispatcher_wq_data,
+ (!ploop_runners_have_pending(ploop)));
current->flags |= PF_IO_THREAD|PF_LOCAL_THROTTLE|PF_MEMALLOC_NOIO;
/* if we have a flush we must sync md data too */
- npios = ploop_submit_metadata_writeback(ploop, !!llflush_pios | ploop->force_md_writeback);
+ force_md_update = !!llflush_pios | ploop->force_md_writeback;
+ npios = ploop_submit_metadata_writeback(ploop, force_md_update);
- if (llflush_pios) {
- if (npios) {
- /* wait for metadata writeback to complete */
- current->flags = old_flags;
- /* First wait all pios to be processed */
- wait_event_interruptible(ploop->dispatcher_wq_data,
- (!ploop_runners_have_pending(ploop)));
- current->flags |= PF_IO_THREAD|PF_LOCAL_THROTTLE|PF_MEMALLOC_NOIO;
- }
+ if (npios) {
+ /* wait for metadata writeback to complete */
+ current->flags = old_flags;
+ /* First wait all pios to be processed */
+ wait_event_interruptible(ploop->dispatcher_wq_data,
+ (!ploop_runners_have_pending(ploop)));
+ current->flags |= PF_IO_THREAD|PF_LOCAL_THROTTLE|PF_MEMALLOC_NOIO;
+ }
+ if (llflush_pios || npios) {
/* Now process fsync pios after we have done all other */
npios = process_ploop_fsync_work(ploop, llflush_pios);
/* Since dispatcher is single thread no other work can be queued */
--
2.43.0
More information about the Devel
mailing list