mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
srcu: Apply *_ONCE() to ->srcu_last_gp_end
The ->srcu_last_gp_end field is accessed from any CPU at any time by synchronize_srcu(), so non-initialization references need to use READ_ONCE() and WRITE_ONCE(). This commit therefore makes that change. Reported-by: syzbot+08f3e9d26e5541e1ecf2@syzkaller.appspotmail.com Acked-by: Marco Elver <elver@google.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
7441e7661d
commit
844a378de3
@ -530,7 +530,7 @@ static void srcu_gp_end(struct srcu_struct *ssp)
|
|||||||
idx = rcu_seq_state(ssp->srcu_gp_seq);
|
idx = rcu_seq_state(ssp->srcu_gp_seq);
|
||||||
WARN_ON_ONCE(idx != SRCU_STATE_SCAN2);
|
WARN_ON_ONCE(idx != SRCU_STATE_SCAN2);
|
||||||
cbdelay = srcu_get_delay(ssp);
|
cbdelay = srcu_get_delay(ssp);
|
||||||
ssp->srcu_last_gp_end = ktime_get_mono_fast_ns();
|
WRITE_ONCE(ssp->srcu_last_gp_end, ktime_get_mono_fast_ns());
|
||||||
rcu_seq_end(&ssp->srcu_gp_seq);
|
rcu_seq_end(&ssp->srcu_gp_seq);
|
||||||
gpseq = rcu_seq_current(&ssp->srcu_gp_seq);
|
gpseq = rcu_seq_current(&ssp->srcu_gp_seq);
|
||||||
if (ULONG_CMP_LT(ssp->srcu_gp_seq_needed_exp, gpseq))
|
if (ULONG_CMP_LT(ssp->srcu_gp_seq_needed_exp, gpseq))
|
||||||
@ -762,6 +762,7 @@ static bool srcu_might_be_idle(struct srcu_struct *ssp)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct srcu_data *sdp;
|
struct srcu_data *sdp;
|
||||||
unsigned long t;
|
unsigned long t;
|
||||||
|
unsigned long tlast;
|
||||||
|
|
||||||
/* If the local srcu_data structure has callbacks, not idle. */
|
/* If the local srcu_data structure has callbacks, not idle. */
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
@ -780,9 +781,9 @@ static bool srcu_might_be_idle(struct srcu_struct *ssp)
|
|||||||
|
|
||||||
/* First, see if enough time has passed since the last GP. */
|
/* First, see if enough time has passed since the last GP. */
|
||||||
t = ktime_get_mono_fast_ns();
|
t = ktime_get_mono_fast_ns();
|
||||||
|
tlast = READ_ONCE(ssp->srcu_last_gp_end);
|
||||||
if (exp_holdoff == 0 ||
|
if (exp_holdoff == 0 ||
|
||||||
time_in_range_open(t, ssp->srcu_last_gp_end,
|
time_in_range_open(t, tlast, tlast + exp_holdoff))
|
||||||
ssp->srcu_last_gp_end + exp_holdoff))
|
|
||||||
return false; /* Too soon after last GP. */
|
return false; /* Too soon after last GP. */
|
||||||
|
|
||||||
/* Next, check for probable idleness. */
|
/* Next, check for probable idleness. */
|
||||||
|
Loading…
Reference in New Issue
Block a user