diff options
Diffstat (limited to 'kernel/rcu/tree.c')
| -rw-r--r-- | kernel/rcu/tree.c | 39 |
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 | ||
