[Devel] [PATCH rh7 09/12] ploop: Never merge discard requests

Kirill Tkhai ktkhai at virtuozzo.com
Fri Mar 1 18:14:10 MSK 2019


The further architecture of discard for ploop1 format
looks for me as following.

blkdev_issue_discard() splits big region into requests
of one block size ((preq->req_size == 1<<plo->cluster_log).
Then requests each other completes in a separate, so we
continue existing data ---> index_writeback scheme.
Another approach, when we try to merge writing of indexes,
which are related to one index page, does not look for me
good, since all the existing code was never written in
an assumption, that a request may iterate on different
index writing, and this will introduce more corner cases,
when we already have in ploop.

For raw format this won't introduce any changes in case
of fstrim, since fstrim sends a request of maximum free
space it sees at a moment. This will touch only online
discard option for ext4, when freed block is not big enough,
but it still will be discardable via fstrim.

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/block/ploop/dev.c   |    8 +++-----
 include/linux/ploop/ploop.h |    2 +-
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index 060aa8bcdfde..9ac436201b1b 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -288,9 +288,7 @@ static void preq_set_sync_bit(struct ploop_request * preq)
 
 static struct rb_root *req_entry_tree(struct ploop_device *plo, unsigned rw)
 {
-	if (rw & REQ_DISCARD)
-		return plo->entry_tree + 2;
-	else if (rw & REQ_WRITE)
+	if (rw & REQ_WRITE)
 		return plo->entry_tree + 1;
 	return plo->entry_tree + 0;
 }
@@ -597,7 +595,7 @@ ploop_bio_queue(struct ploop_device * plo, struct bio * bio,
 		plo->bio_qlen--;
 	ploop_entry_add(plo, preq);
 
-	if (bio->bi_size && !(preq->state & (1 << PLOOP_REQ_DISCARD)))
+	if (bio->bi_size && !(bio->bi_rw & REQ_DISCARD))
 		insert_entry_tree(plo, preq, drop_list);
 
 	trace_bio_queue(preq);
@@ -5325,7 +5323,7 @@ static struct ploop_device *__ploop_dev_alloc(int index)
 	plo->freeze_timer.function = freeze_timeout;
 	plo->freeze_timer.data = (unsigned long)plo;
 	INIT_LIST_HEAD(&plo->entry_queue);
-	plo->entry_tree[0] = plo->entry_tree[1] = plo->entry_tree[2] = RB_ROOT;
+	plo->entry_tree[0] = plo->entry_tree[1] = RB_ROOT;
 	plo->lockout_tree = RB_ROOT;
 	plo->lockout_pb_tree = RB_ROOT;
 	INIT_LIST_HEAD(&plo->ready_queue);
diff --git a/include/linux/ploop/ploop.h b/include/linux/ploop/ploop.h
index 58154219d7cb..71a55573bdf6 100644
--- a/include/linux/ploop/ploop.h
+++ b/include/linux/ploop/ploop.h
@@ -382,7 +382,7 @@ struct ploop_device
 	int			bio_qlen;
 	int			bio_total;
 
-	struct rb_root		entry_tree[3];
+	struct rb_root		entry_tree[2];
 
 	struct list_head	ready_queue;
 



More information about the Devel mailing list