Hello, On Wed, Jul 10, 2024 at 02:13:34PM +0800, boy.wu wrote: ... > @@ -952,7 +952,6 @@ static void blkcg_fill_root_iostats(void) > struct blkcg_gq *blkg = bdev->bd_disk->queue->root_blkg; > struct blkg_iostat tmp; > int cpu; > - unsigned long flags; > > memset(&tmp, 0, sizeof(tmp)); > for_each_possible_cpu(cpu) { > @@ -974,9 +973,10 @@ static void blkcg_fill_root_iostats(void) > cpu_dkstats->sectors[STAT_DISCARD] << 9; > } > > - flags = u64_stats_update_begin_irqsave(&blkg->iostat.sync); > +#if BITS_PER_LONG == 32 > + guard(raw_spinlock_irqsave)(&blkg_stat_lock); > +#endif > blkg_iostat_set(&blkg->iostat.cur, &tmp); > - u64_stats_update_end_irqrestore(&blkg->iostat.sync, flags); Isn't the problem shared across other blkg->iostat.sync users too? Also, maybe, we can just grab the spinlock without testing for 32bit. blkg->iostat (unlike the per-cpu counterpart) isn't accessed that frequently, so keeping it simple and consistent probably makes more sense, right? Thanks. -- tejun