mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
blk-cgroup: fix list corruption from reorder of WRITE ->lqueued
__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@kernel.org>
Cc: Waiman Long <longman@redhat.com>
Fixes: 3b8cc62987
("blk-cgroup: Optimize blkcg_rstat_flush()")
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20240515013157.443672-3-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
6da6680632
commit
d0aac23635
@ -1035,6 +1035,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 */
|
||||
|
Loading…
Reference in New Issue
Block a user