mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
mm/memcontrol: fix data-race on reading jiffies_64
KCSAN reported a data-race between tick_do_update_jiffies64() updating jiffies_64 and mem_cgroup_flush_stats_ratelimited() reading it directly. Unlike jiffies, jiffies_64 is not volatile, so raw reads are plain accesses and can even be torn on 32-bit. Use get_jiffies_64() instead, and fix the same pattern in mem_cgroup_flush_foreign(). Link: https://lore.kernel.org/20260827025457.116191-1-jiayuan.chen@linux.dev Fixes:508bed8847("mm: memcg: change flush_next_time to flush_last_time") Fixes:97b27821b4("writeback, memcg: Implement foreign dirty flushing") Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reported-by: syzbot+ced4d9a8cadb5ef3adae@syzkaller.appspotmail.com Acked-by: Muchun Song <muchun.song@linux.dev> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Chris Li <chrisl@kernel.org> Cc: Jan Kara <jack@suse.cz> Cc: Jens Axboe <axboe@kernel.dk> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Tejun Heo <tj@kernel.org> Cc: <stable@vger.kernel.org>
This commit is contained in:
parent
576446e2df
commit
c20cf1c3c8
|
|
@ -757,7 +757,7 @@ static void __mem_cgroup_flush_stats(struct mem_cgroup *memcg, bool force)
|
|||
return;
|
||||
|
||||
if (mem_cgroup_is_root(memcg))
|
||||
WRITE_ONCE(flush_last_time, jiffies_64);
|
||||
WRITE_ONCE(flush_last_time, get_jiffies_64());
|
||||
|
||||
css_rstat_flush(&memcg->css);
|
||||
}
|
||||
|
|
@ -785,7 +785,7 @@ void mem_cgroup_flush_stats(struct mem_cgroup *memcg)
|
|||
void mem_cgroup_flush_stats_ratelimited(struct mem_cgroup *memcg)
|
||||
{
|
||||
/* Only flush if the periodic flusher is one full cycle late */
|
||||
if (time_after64(jiffies_64, READ_ONCE(flush_last_time) + 2*FLUSH_TIME))
|
||||
if (time_after64(get_jiffies_64(), READ_ONCE(flush_last_time) + 2 * FLUSH_TIME))
|
||||
mem_cgroup_flush_stats(memcg);
|
||||
}
|
||||
|
||||
|
|
@ -3946,7 +3946,7 @@ void mem_cgroup_flush_foreign(struct bdi_writeback *wb)
|
|||
{
|
||||
struct mem_cgroup *memcg = mem_cgroup_from_css(wb->memcg_css);
|
||||
unsigned long intv = msecs_to_jiffies(dirty_expire_interval * 10);
|
||||
u64 now = jiffies_64;
|
||||
u64 now = get_jiffies_64();
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MEMCG_CGWB_FRN_CNT; i++) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user