[Devel] [PATCH RH8 07/14] ploop: Use array of pios instead of separate lists

Kirill Tkhai ktkhai at virtuozzo.com
Fri Jun 25 18:09:42 MSK 2021


Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/md/dm-ploop-map.c    |   25 ++++++++++++++-----------
 drivers/md/dm-ploop-target.c |   13 +++++++------
 drivers/md/dm-ploop.h        |   17 ++++++++++++-----
 3 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 1f34ebcc0b6a..9f85ca7754b7 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -244,15 +244,16 @@ static int split_pio_to_list(struct ploop *ploop, struct pio *pio,
 
 void defer_pios(struct ploop *ploop, struct pio *pio, struct list_head *pio_list)
 {
+	struct list_head *list = &ploop->pios[PLOOP_LIST_DEFERRED];
 	unsigned long flags;
 
 	spin_lock_irqsave(&ploop->deferred_lock, flags);
 	if (pio)
-		list_add_tail(&pio->list, &ploop->deferred_pios);
+		list_add_tail(&pio->list, list);
 	if (pio_list)
-		list_splice_tail_init(pio_list, &ploop->deferred_pios);
-
+		list_splice_tail_init(pio_list, list);
 	spin_unlock_irqrestore(&ploop->deferred_lock, flags);
+
 	queue_work(ploop->wq, &ploop->worker);
 }
 
@@ -289,10 +290,11 @@ void __track_pio(struct ploop *ploop, struct pio *pio)
 
 static void queue_discard_index_wb(struct ploop *ploop, struct pio *pio)
 {
+	struct list_head *list = &ploop->pios[PLOOP_LIST_DISCARD];
 	unsigned long flags;
 
 	spin_lock_irqsave(&ploop->deferred_lock, flags);
-	list_add_tail(&pio->list, &ploop->discard_pios);
+	list_add_tail(&pio->list, list);
 	spin_unlock_irqrestore(&ploop->deferred_lock, flags);
 
 	queue_work(ploop->wq, &ploop->worker);
@@ -1133,7 +1135,7 @@ static void ploop_cow_endio(struct pio *aux_pio, void *data, blk_status_t bi_sta
 	unsigned long flags;
 
 	spin_lock_irqsave(&ploop->deferred_lock, flags);
-	list_add_tail(&aux_pio->list, &ploop->delta_cow_action_list);
+	list_add_tail(&aux_pio->list, &ploop->pios[PLOOP_LIST_COW]);
 	spin_unlock_irqrestore(&ploop->deferred_lock, flags);
 
 	queue_work(ploop->wq, &ploop->worker);
@@ -1241,7 +1243,7 @@ static void submit_cow_index_wb(struct ploop_cow *cow,
 		/* Another BAT page wb is in process */
 		spin_lock_irq(&ploop->deferred_lock);
 		list_add_tail(&cow->aux_pio->list,
-			      &ploop->delta_cow_action_list);
+			      &ploop->pios[PLOOP_LIST_COW]);
 		spin_unlock_irq(&ploop->deferred_lock);
 		queue_work(ploop->wq, &ploop->worker);
 		goto out;
@@ -1267,13 +1269,14 @@ static void submit_cow_index_wb(struct ploop_cow *cow,
 
 static void process_delta_wb(struct ploop *ploop, struct ploop_index_wb *piwb)
 {
+	struct list_head *list = &ploop->pios[PLOOP_LIST_COW];
 	struct pio *aux_pio;
 	struct ploop_cow *cow;
 	LIST_HEAD(cow_list);
 
-	if (list_empty(&ploop->delta_cow_action_list))
+	if (list_empty(list))
 		return;
-	list_splice_tail_init(&ploop->delta_cow_action_list, &cow_list);
+	list_splice_tail_init(list, &cow_list);
 	spin_unlock_irq(&ploop->deferred_lock);
 
 	while ((aux_pio = pio_list_pop(&cow_list)) != NULL) {
@@ -1547,8 +1550,8 @@ void do_ploop_work(struct work_struct *ws)
 	spin_lock_irq(&ploop->deferred_lock);
 	process_delta_wb(ploop, &piwb);
 
-	list_splice_init(&ploop->deferred_pios, &deferred_pios);
-	list_splice_init(&ploop->discard_pios, &discard_pios);
+	list_splice_init(&ploop->pios[PLOOP_LIST_DEFERRED], &deferred_pios);
+	list_splice_init(&ploop->pios[PLOOP_LIST_DISCARD], &discard_pios);
 	spin_unlock_irq(&ploop->deferred_lock);
 
 	process_deferred_pios(ploop, &deferred_pios, &piwb);
@@ -1632,7 +1635,7 @@ static void submit_pio(struct ploop *ploop, struct pio *pio)
 	int ret;
 
 	if (pio->bi_iter.bi_size) {
-		queue_list = &ploop->deferred_pios;
+		queue_list = &ploop->pios[PLOOP_LIST_DEFERRED];
 		worker = &ploop->worker;
 
 		if (ploop_pio_valid(ploop, pio) < 0)
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index afdf23325d3b..d4413ff259a5 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -132,11 +132,11 @@ void free_md_pages_tree(struct rb_root *root)
 static bool ploop_has_pending_activity(struct ploop *ploop)
 {
 	bool has = false;
+	int i;
 
 	spin_lock_irq(&ploop->deferred_lock);
-	has |= !list_empty(&ploop->deferred_pios);
-	has |= !list_empty(&ploop->discard_pios);
-	has |= !list_empty(&ploop->delta_cow_action_list);
+	for (i = 0; i < PLOOP_LIST_COUNT; i++)
+		has |= !list_empty(&ploop->pios[i]);
 	spin_unlock_irq(&ploop->deferred_lock);
 
 	return has;
@@ -326,13 +326,14 @@ static int ploop_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 	spin_lock_init(&ploop->deferred_lock);
 
 	INIT_LIST_HEAD(&ploop->suspended_pios);
-	INIT_LIST_HEAD(&ploop->deferred_pios);
+
+	for (i = 0; i < PLOOP_LIST_COUNT; i++)
+		INIT_LIST_HEAD(&ploop->pios[i]);
+
 	INIT_LIST_HEAD(&ploop->flush_pios);
-	INIT_LIST_HEAD(&ploop->discard_pios);
 	INIT_LIST_HEAD(&ploop->resubmit_pios);
 	INIT_LIST_HEAD(&ploop->enospc_pios);
 	INIT_LIST_HEAD(&ploop->cluster_lk_list);
-	INIT_LIST_HEAD(&ploop->delta_cow_action_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 9192d96ce64d..9b69a7eed71d 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -114,6 +114,15 @@ struct md_page {
 	u8 *bat_levels;
 };
 
+enum {
+	PLOOP_LIST_DEFERRED = 0,
+	PLOOP_LIST_DISCARD,
+	PLOOP_LIST_COW,
+
+	PLOOP_LIST_COUNT,
+	PLOOP_LIST_INVALID = PLOOP_LIST_COUNT,
+};
+
 struct ploop {
 	struct dm_target *ti;
 
@@ -166,9 +175,10 @@ struct ploop {
 
 	spinlock_t inflight_lock;
 	spinlock_t deferred_lock;
-	struct list_head deferred_pios;
+
+	struct list_head pios[PLOOP_LIST_COUNT];
+
 	struct list_head flush_pios;
-	struct list_head discard_pios;
 	struct list_head resubmit_pios; /* After partial IO */
 	struct list_head enospc_pios; /* Delayed after ENOSPC */
 
@@ -184,9 +194,6 @@ struct ploop {
 	 */
 	struct list_head cluster_lk_list;
 
-	/* List of COW requests requiring action. */
-	struct list_head delta_cow_action_list;
-
 	/* Resume is prohibited */
 	bool noresume;
 	/* Device is suspended */




More information about the Devel mailing list