Patch "block, bfq: honor already-setup queue merges" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    block, bfq: honor already-setup queue merges

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     block-bfq-honor-already-setup-queue-merges.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit c9100d4c76f4db72a06fc43a1ee2397b64bfc205
Author: Paolo Valente <paolo.valente@xxxxxxxxxx>
Date:   Mon Aug 2 16:13:52 2021 +0200

    block, bfq: honor already-setup queue merges
    
    [ Upstream commit 2d52c58b9c9bdae0ca3df6a1eab5745ab3f7d80b ]
    
    The function bfq_setup_merge prepares the merging between two
    bfq_queues, say bfqq and new_bfqq. To this goal, it assigns
    bfqq->new_bfqq = new_bfqq. Then, each time some I/O for bfqq arrives,
    the process that generated that I/O is disassociated from bfqq and
    associated with new_bfqq (merging is actually a redirection). In this
    respect, bfq_setup_merge increases new_bfqq->ref in advance, adding
    the number of processes that are expected to be associated with
    new_bfqq.
    
    Unfortunately, the stable-merging mechanism interferes with this
    setup. After bfqq->new_bfqq has been set by bfq_setup_merge, and
    before all the expected processes have been associated with
    bfqq->new_bfqq, bfqq may happen to be stably merged with a different
    queue than the current bfqq->new_bfqq. In this case, bfqq->new_bfqq
    gets changed. So, some of the processes that have been already
    accounted for in the ref counter of the previous new_bfqq will not be
    associated with that queue.  This creates an unbalance, because those
    references will never be decremented.
    
    This commit fixes this issue by reestablishing the previous, natural
    behaviour: once bfqq->new_bfqq has been set, it will not be changed
    until all expected redirections have occurred.
    
    Signed-off-by: Davide Zini <davidezini2@xxxxxxxxx>
    Signed-off-by: Paolo Valente <paolo.valente@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20210802141352.74353-2-paolo.valente@xxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index 73bffd7af15c..8dee243e639f 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -2523,6 +2523,15 @@ bfq_setup_merge(struct bfq_queue *bfqq, struct bfq_queue *new_bfqq)
 	 * are likely to increase the throughput.
 	 */
 	bfqq->new_bfqq = new_bfqq;
+	/*
+	 * The above assignment schedules the following redirections:
+	 * each time some I/O for bfqq arrives, the process that
+	 * generated that I/O is disassociated from bfqq and
+	 * associated with new_bfqq. Here we increases new_bfqq->ref
+	 * in advance, adding the number of processes that are
+	 * expected to be associated with new_bfqq as they happen to
+	 * issue I/O.
+	 */
 	new_bfqq->ref += process_refs;
 	return new_bfqq;
 }
@@ -2582,6 +2591,10 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
 {
 	struct bfq_queue *in_service_bfqq, *new_bfqq;
 
+	/* if a merge has already been setup, then proceed with that first */
+	if (bfqq->new_bfqq)
+		return bfqq->new_bfqq;
+
 	/*
 	 * Do not perform queue merging if the device is non
 	 * rotational and performs internal queueing. In fact, such a
@@ -2636,9 +2649,6 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
 	if (bfq_too_late_for_merging(bfqq))
 		return NULL;
 
-	if (bfqq->new_bfqq)
-		return bfqq->new_bfqq;
-
 	if (!io_struct || unlikely(bfqq == &bfqd->oom_bfqq))
 		return NULL;
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux