aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcu/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/rcu/tree.c')
-rw-r--r--kernel/rcu/tree.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index fd2f582a6db0..bcd659e65dfd 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1790,24 +1790,23 @@ static bool __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp,
1790 1790
1791 raw_lockdep_assert_held_rcu_node(rnp); 1791 raw_lockdep_assert_held_rcu_node(rnp);
1792 1792
1793 /* Handle the ends of any preceding grace periods first. */ 1793 if (rdp->gp_seq == rnp->gp_seq)
1794 if (rdp->completed == rnp->completed && 1794 return false; /* Nothing to do. */
1795 !unlikely(READ_ONCE(rdp->gpwrap))) {
1796
1797 /* No grace period end, so just accelerate recent callbacks. */
1798 ret = rcu_accelerate_cbs(rsp, rnp, rdp);
1799
1800 } else {
1801
1802 /* Advance callbacks. */
1803 ret = rcu_advance_cbs(rsp, rnp, rdp);
1804 1795
1796 /* Handle the ends of any preceding grace periods first. */
1797 if (rcu_seq_completed_gp(rdp->gp_seq, rnp->gp_seq) ||
1798 unlikely(READ_ONCE(rdp->gpwrap))) {
1799 ret = rcu_advance_cbs(rsp, rnp, rdp); /* Advance callbacks. */
1805 /* Remember that we saw this grace-period completion. */ 1800 /* Remember that we saw this grace-period completion. */
1806 rdp->completed = rnp->completed; 1801 rdp->completed = rnp->completed;
1807 trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("cpuend")); 1802 trace_rcu_grace_period(rsp->name, rdp->gp_seq, TPS("cpuend"));
1803 } else {
1804 ret = rcu_accelerate_cbs(rsp, rnp, rdp); /* Recent callbacks. */
1808 } 1805 }
1809 1806
1810 if (rdp->gpnum != rnp->gpnum || unlikely(READ_ONCE(rdp->gpwrap))) { 1807 /* Now handle the beginnings of any new-to-this-CPU grace periods. */
1808 if (rcu_seq_new_gp(rdp->gp_seq, rnp->gp_seq) ||
1809 unlikely(READ_ONCE(rdp->gpwrap))) {
1811 /* 1810 /*
1812 * If the current grace period is waiting for this CPU, 1811 * If the current grace period is waiting for this CPU,
1813 * set up to detect a quiescent state, otherwise don't 1812 * set up to detect a quiescent state, otherwise don't
@@ -1823,8 +1822,7 @@ static bool __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp,
1823 WRITE_ONCE(rdp->gpwrap, false); 1822 WRITE_ONCE(rdp->gpwrap, false);
1824 rcu_gpnum_ovf(rnp, rdp); 1823 rcu_gpnum_ovf(rnp, rdp);
1825 } 1824 }
1826 if (rdp->gp_seq != rnp->gp_seq) 1825 rdp->gp_seq = rnp->gp_seq; /* Remember new grace-period state. */
1827 rdp->gp_seq = rnp->gp_seq;
1828 return ret; 1826 return ret;
1829} 1827}
1830 1828
@@ -1836,8 +1834,7 @@ static void note_gp_changes(struct rcu_state *rsp, struct rcu_data *rdp)
1836 1834
1837 local_irq_save(flags); 1835 local_irq_save(flags);
1838 rnp = rdp->mynode; 1836 rnp = rdp->mynode;
1839 if ((rdp->gpnum == READ_ONCE(rnp->gpnum) && 1837 if ((rdp->gp_seq == rcu_seq_current(&rnp->gp_seq) &&
1840 rdp->completed == READ_ONCE(rnp->completed) &&
1841 !unlikely(READ_ONCE(rdp->gpwrap))) || /* w/out lock. */ 1838 !unlikely(READ_ONCE(rdp->gpwrap))) || /* w/out lock. */
1842 !raw_spin_trylock_rcu_node(rnp)) { /* irqs already off, so later. */ 1839 !raw_spin_trylock_rcu_node(rnp)) { /* irqs already off, so later. */
1843 local_irq_restore(flags); 1840 local_irq_restore(flags);
@@ -3286,12 +3283,8 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp)
3286 !rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL)) 3283 !rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
3287 return 1; 3284 return 1;
3288 3285
3289 /* Has another RCU grace period completed? */ 3286 /* Have RCU grace period completed or started? */
3290 if (READ_ONCE(rnp->completed) != rdp->completed) /* outside lock */ 3287 if (rcu_seq_current(&rnp->gp_seq) != rdp->gp_seq ||
3291 return 1;
3292
3293 /* Has a new RCU grace period started? */
3294 if (READ_ONCE(rnp->gpnum) != rdp->gpnum ||
3295 unlikely(READ_ONCE(rdp->gpwrap))) /* outside lock */ 3288 unlikely(READ_ONCE(rdp->gpwrap))) /* outside lock */
3296 return 1; 3289 return 1;
3297 3290