Patch "blk-cgroup: fix list corruption from reorder of WRITE ->lqueued" has been added to the 6.9-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

    blk-cgroup: fix list corruption from reorder of WRITE ->lqueued

to the 6.9-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:
     blk-cgroup-fix-list-corruption-from-reorder-of-write.patch
and it can be found in the queue-6.9 subdirectory.

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



commit cee3eacfaee9d33c8217d304af5db8e257ac71d7
Author: Ming Lei <ming.lei@xxxxxxxxxx>
Date:   Wed May 15 09:31:57 2024 +0800

    blk-cgroup: fix list corruption from reorder of WRITE ->lqueued
    
    [ Upstream commit d0aac2363549e12cc79b8e285f13d5a9f42fd08e ]
    
    __blkcg_rstat_flush() can be run anytime, especially when blk_cgroup_bio_start
    is being executed.
    
    If WRITE of `->lqueued` is re-ordered with READ of 'bisc->lnode.next' in
    the loop of __blkcg_rstat_flush(), `next_bisc` can be assigned with one
    stat instance being added in blk_cgroup_bio_start(), then the local
    list in __blkcg_rstat_flush() could be corrupted.
    
    Fix the issue by adding one barrier.
    
    Cc: Tejun Heo <tj@xxxxxxxxxx>
    Cc: Waiman Long <longman@xxxxxxxxxx>
    Fixes: 3b8cc6298724 ("blk-cgroup: Optimize blkcg_rstat_flush()")
    Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240515013157.443672-3-ming.lei@xxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index 86752b1652b5b..b36ba1d40ba1d 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -1036,6 +1036,16 @@ static void __blkcg_rstat_flush(struct blkcg *blkcg, int cpu)
 		struct blkg_iostat cur;
 		unsigned int seq;
 
+		/*
+		 * Order assignment of `next_bisc` from `bisc->lnode.next` in
+		 * llist_for_each_entry_safe and clearing `bisc->lqueued` for
+		 * avoiding to assign `next_bisc` with new next pointer added
+		 * in blk_cgroup_bio_start() in case of re-ordering.
+		 *
+		 * The pair barrier is implied in llist_add() in blk_cgroup_bio_start().
+		 */
+		smp_mb();
+
 		WRITE_ONCE(bisc->lqueued, false);
 
 		/* fetch the current per-cpu values */




[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