Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c575026 authored by Hong Zhiguo's avatar Hong Zhiguo Committed by Jens Axboe
Browse files

Update of blkg_stat and blkg_rwstat may happen in bh context.


While u64_stats_fetch_retry is only preempt_disable on 32bit
UP system. This is not enough to avoid preemption by bh and
may read strange 64 bit value.

Signed-off-by: default avatarHong Zhiguo <zhiguohong@tencent.com>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Cc: stable@kernel.org
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 82023bb7
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -435,9 +435,9 @@ static inline uint64_t blkg_stat_read(struct blkg_stat *stat)
	uint64_t v;

	do {
		start = u64_stats_fetch_begin(&stat->syncp);
		start = u64_stats_fetch_begin_bh(&stat->syncp);
		v = stat->cnt;
	} while (u64_stats_fetch_retry(&stat->syncp, start));
	} while (u64_stats_fetch_retry_bh(&stat->syncp, start));

	return v;
}
@@ -508,9 +508,9 @@ static inline struct blkg_rwstat blkg_rwstat_read(struct blkg_rwstat *rwstat)
	struct blkg_rwstat tmp;

	do {
		start = u64_stats_fetch_begin(&rwstat->syncp);
		start = u64_stats_fetch_begin_bh(&rwstat->syncp);
		tmp = *rwstat;
	} while (u64_stats_fetch_retry(&rwstat->syncp, start));
	} while (u64_stats_fetch_retry_bh(&rwstat->syncp, start));

	return tmp;
}