Lines Matching refs:rnp

145 static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
147 static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu);
151 static void check_cb_ovld_locked(struct rcu_data *rdp, struct rcu_node *rnp);
730 static void rcu_gpnum_ovf(struct rcu_node *rnp, struct rcu_data *rdp) in rcu_gpnum_ovf() argument
732 raw_lockdep_assert_held_rcu_node(rnp); in rcu_gpnum_ovf()
734 rnp->gp_seq)) in rcu_gpnum_ovf()
736 if (ULONG_CMP_LT(rdp->rcu_iw_gp_seq + ULONG_MAX / 4, rnp->gp_seq)) in rcu_gpnum_ovf()
737 rdp->rcu_iw_gp_seq = rnp->gp_seq + ULONG_MAX / 4; in rcu_gpnum_ovf()
765 struct rcu_node *rnp = rdp->mynode; in rcu_implicit_dynticks_qs() local
777 rcu_gpnum_ovf(rnp, rdp); in rcu_implicit_dynticks_qs()
803 __func__, rnp->grplo, rnp->grphi, rnp->level, in rcu_implicit_dynticks_qs()
804 (long)rnp->gp_seq, (long)rnp->completedqs); in rcu_implicit_dynticks_qs()
805 for (rnp1 = rnp; rnp1; rnp1 = rnp1->parent) in rcu_implicit_dynticks_qs()
868 !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq && in rcu_implicit_dynticks_qs()
869 (rnp->ffmask & rdp->grpmask)) { in rcu_implicit_dynticks_qs()
871 rdp->rcu_iw_gp_seq = rnp->gp_seq; in rcu_implicit_dynticks_qs()
898 static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp, in trace_rcu_this_gp() argument
901 trace_rcu_future_grace_period(rcu_state.name, READ_ONCE(rnp->gp_seq), in trace_rcu_this_gp()
902 gp_seq_req, rnp->level, in trace_rcu_this_gp()
903 rnp->grplo, rnp->grphi, s); in trace_rcu_this_gp()
926 struct rcu_node *rnp; in rcu_start_this_gp() local
939 for (rnp = rnp_start; 1; rnp = rnp->parent) { in rcu_start_this_gp()
940 if (rnp != rnp_start) in rcu_start_this_gp()
941 raw_spin_lock_rcu_node(rnp); in rcu_start_this_gp()
942 if (ULONG_CMP_GE(rnp->gp_seq_needed, gp_seq_req) || in rcu_start_this_gp()
943 rcu_seq_started(&rnp->gp_seq, gp_seq_req) || in rcu_start_this_gp()
944 (rnp != rnp_start && in rcu_start_this_gp()
945 rcu_seq_state(rcu_seq_current(&rnp->gp_seq)))) { in rcu_start_this_gp()
946 trace_rcu_this_gp(rnp, rdp, gp_seq_req, in rcu_start_this_gp()
950 WRITE_ONCE(rnp->gp_seq_needed, gp_seq_req); in rcu_start_this_gp()
951 if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) { in rcu_start_this_gp()
962 if (rnp != rnp_start && rnp->parent != NULL) in rcu_start_this_gp()
963 raw_spin_unlock_rcu_node(rnp); in rcu_start_this_gp()
964 if (!rnp->parent) in rcu_start_this_gp()
970 trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedleafroot")); in rcu_start_this_gp()
973 trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedroot")); in rcu_start_this_gp()
977 trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("NoGPkthread")); in rcu_start_this_gp()
984 if (ULONG_CMP_LT(gp_seq_req, rnp->gp_seq_needed)) { in rcu_start_this_gp()
985 WRITE_ONCE(rnp_start->gp_seq_needed, rnp->gp_seq_needed); in rcu_start_this_gp()
986 WRITE_ONCE(rdp->gp_seq_needed, rnp->gp_seq_needed); in rcu_start_this_gp()
988 if (rnp != rnp_start) in rcu_start_this_gp()
989 raw_spin_unlock_rcu_node(rnp); in rcu_start_this_gp()
997 static bool rcu_future_gp_cleanup(struct rcu_node *rnp) in rcu_future_gp_cleanup() argument
1002 needmore = ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed); in rcu_future_gp_cleanup()
1004 rnp->gp_seq_needed = rnp->gp_seq; /* Avoid counter wrap. */ in rcu_future_gp_cleanup()
1005 trace_rcu_this_gp(rnp, rdp, rnp->gp_seq, in rcu_future_gp_cleanup()
1049 static bool rcu_accelerate_cbs(struct rcu_node *rnp, struct rcu_data *rdp) in rcu_accelerate_cbs() argument
1055 raw_lockdep_assert_held_rcu_node(rnp); in rcu_accelerate_cbs()
1075 ret = rcu_start_this_gp(rnp, rdp, gp_seq_req); in rcu_accelerate_cbs()
1095 static void rcu_accelerate_cbs_unlocked(struct rcu_node *rnp, in rcu_accelerate_cbs_unlocked() argument
1108 raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */ in rcu_accelerate_cbs_unlocked()
1109 needwake = rcu_accelerate_cbs(rnp, rdp); in rcu_accelerate_cbs_unlocked()
1110 raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */ in rcu_accelerate_cbs_unlocked()
1125 static bool rcu_advance_cbs(struct rcu_node *rnp, struct rcu_data *rdp) in rcu_advance_cbs() argument
1128 raw_lockdep_assert_held_rcu_node(rnp); in rcu_advance_cbs()
1138 rcu_segcblist_advance(&rdp->cblist, rnp->gp_seq); in rcu_advance_cbs()
1141 return rcu_accelerate_cbs(rnp, rdp); in rcu_advance_cbs()
1148 static void __maybe_unused rcu_advance_cbs_nowake(struct rcu_node *rnp, in rcu_advance_cbs_nowake() argument
1152 if (!rcu_seq_state(rcu_seq_current(&rnp->gp_seq)) || !raw_spin_trylock_rcu_node(rnp)) in rcu_advance_cbs_nowake()
1155 if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) in rcu_advance_cbs_nowake()
1156 WARN_ON_ONCE(rcu_advance_cbs(rnp, rdp)); in rcu_advance_cbs_nowake()
1157 raw_spin_unlock_rcu_node(rnp); in rcu_advance_cbs_nowake()
1179 static bool __note_gp_changes(struct rcu_node *rnp, struct rcu_data *rdp) in __note_gp_changes() argument
1185 raw_lockdep_assert_held_rcu_node(rnp); in __note_gp_changes()
1187 if (rdp->gp_seq == rnp->gp_seq) in __note_gp_changes()
1191 if (rcu_seq_completed_gp(rdp->gp_seq, rnp->gp_seq) || in __note_gp_changes()
1194 ret = rcu_advance_cbs(rnp, rdp); /* Advance CBs. */ in __note_gp_changes()
1199 ret = rcu_accelerate_cbs(rnp, rdp); /* Recent CBs. */ in __note_gp_changes()
1201 rdp->core_needs_qs = !!(rnp->qsmask & rdp->grpmask); in __note_gp_changes()
1205 if (rcu_seq_new_gp(rdp->gp_seq, rnp->gp_seq) || in __note_gp_changes()
1212 trace_rcu_grace_period(rcu_state.name, rnp->gp_seq, TPS("cpustart")); in __note_gp_changes()
1213 need_qs = !!(rnp->qsmask & rdp->grpmask); in __note_gp_changes()
1218 rdp->gp_seq = rnp->gp_seq; /* Remember new grace-period state. */ in __note_gp_changes()
1219 if (ULONG_CMP_LT(rdp->gp_seq_needed, rnp->gp_seq_needed) || rdp->gpwrap) in __note_gp_changes()
1220 WRITE_ONCE(rdp->gp_seq_needed, rnp->gp_seq_needed); in __note_gp_changes()
1224 rcu_gpnum_ovf(rnp, rdp); in __note_gp_changes()
1232 struct rcu_node *rnp; in note_gp_changes() local
1235 rnp = rdp->mynode; in note_gp_changes()
1236 if ((rdp->gp_seq == rcu_seq_current(&rnp->gp_seq) && in note_gp_changes()
1238 !raw_spin_trylock_rcu_node(rnp)) { /* irqs already off, so later. */ in note_gp_changes()
1242 needwake = __note_gp_changes(rnp, rdp); in note_gp_changes()
1243 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in note_gp_changes()
1320 struct rcu_node *rnp = rcu_get_root(); in rcu_poll_gp_seq_start() local
1323 raw_lockdep_assert_held_rcu_node(rnp); in rcu_poll_gp_seq_start()
1336 struct rcu_node *rnp = rcu_get_root(); in rcu_poll_gp_seq_end() local
1339 raw_lockdep_assert_held_rcu_node(rnp); in rcu_poll_gp_seq_end()
1358 struct rcu_node *rnp = rcu_get_root(); in rcu_poll_gp_seq_start_unlocked() local
1363 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcu_poll_gp_seq_start_unlocked()
1367 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_poll_gp_seq_start_unlocked()
1375 struct rcu_node *rnp = rcu_get_root(); in rcu_poll_gp_seq_end_unlocked() local
1380 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcu_poll_gp_seq_end_unlocked()
1384 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_poll_gp_seq_end_unlocked()
1396 struct rcu_node *rnp = rcu_get_root(); in rcu_gp_init() local
1399 raw_spin_lock_irq_rcu_node(rnp); in rcu_gp_init()
1402 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_init()
1412 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_init()
1423 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_init()
1436 rcu_for_each_leaf_node(rnp) { in rcu_gp_init()
1439 raw_spin_lock_rcu_node(rnp); in rcu_gp_init()
1440 if (rnp->qsmaskinit == rnp->qsmaskinitnext && in rcu_gp_init()
1441 !rnp->wait_blkd_tasks) { in rcu_gp_init()
1443 raw_spin_unlock_rcu_node(rnp); in rcu_gp_init()
1450 oldmask = rnp->qsmaskinit; in rcu_gp_init()
1451 rnp->qsmaskinit = rnp->qsmaskinitnext; in rcu_gp_init()
1454 if (!oldmask != !rnp->qsmaskinit) { in rcu_gp_init()
1456 if (!rnp->wait_blkd_tasks) /* Ever offline? */ in rcu_gp_init()
1457 rcu_init_new_rnp(rnp); in rcu_gp_init()
1458 } else if (rcu_preempt_has_tasks(rnp)) { in rcu_gp_init()
1459 rnp->wait_blkd_tasks = true; /* blocked tasks */ in rcu_gp_init()
1461 rcu_cleanup_dead_rnp(rnp); in rcu_gp_init()
1473 if (rnp->wait_blkd_tasks && in rcu_gp_init()
1474 (!rcu_preempt_has_tasks(rnp) || rnp->qsmaskinit)) { in rcu_gp_init()
1475 rnp->wait_blkd_tasks = false; in rcu_gp_init()
1476 if (!rnp->qsmaskinit) in rcu_gp_init()
1477 rcu_cleanup_dead_rnp(rnp); in rcu_gp_init()
1480 raw_spin_unlock_rcu_node(rnp); in rcu_gp_init()
1499 rcu_for_each_node_breadth_first(rnp) { in rcu_gp_init()
1501 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcu_gp_init()
1503 rcu_preempt_check_blocked_tasks(rnp); in rcu_gp_init()
1504 rnp->qsmask = rnp->qsmaskinit; in rcu_gp_init()
1505 WRITE_ONCE(rnp->gp_seq, rcu_state.gp_seq); in rcu_gp_init()
1506 if (rnp == rdp->mynode) in rcu_gp_init()
1507 (void)__note_gp_changes(rnp, rdp); in rcu_gp_init()
1508 rcu_preempt_boost_start_gp(rnp); in rcu_gp_init()
1509 trace_rcu_grace_period_init(rcu_state.name, rnp->gp_seq, in rcu_gp_init()
1510 rnp->level, rnp->grplo, in rcu_gp_init()
1511 rnp->grphi, rnp->qsmask); in rcu_gp_init()
1513 mask = rnp->qsmask & ~rnp->qsmaskinitnext; in rcu_gp_init()
1514 rnp->rcu_gp_init_mask = mask; in rcu_gp_init()
1515 if ((mask || rnp->wait_blkd_tasks) && rcu_is_leaf_node(rnp)) in rcu_gp_init()
1516 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags); in rcu_gp_init()
1518 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_init()
1536 struct rcu_node *rnp = rcu_get_root(); in rcu_gp_fqs_check_wake() local
1548 if (!READ_ONCE(rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp)) in rcu_gp_fqs_check_wake()
1559 struct rcu_node *rnp = rcu_get_root(); in rcu_gp_fqs() local
1572 raw_spin_lock_irq_rcu_node(rnp); in rcu_gp_fqs()
1575 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_fqs()
1588 struct rcu_node *rnp = rcu_get_root(); in rcu_gp_fqs_loop() local
1627 if (!READ_ONCE(rnp->qsmask) && in rcu_gp_fqs_loop()
1628 !rcu_preempt_blocked_readers_cgp(rnp)) in rcu_gp_fqs_loop()
1676 struct rcu_node *rnp = rcu_get_root(); in rcu_gp_cleanup() local
1680 raw_spin_lock_irq_rcu_node(rnp); in rcu_gp_cleanup()
1695 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_cleanup()
1708 rcu_for_each_node_breadth_first(rnp) { in rcu_gp_cleanup()
1709 raw_spin_lock_irq_rcu_node(rnp); in rcu_gp_cleanup()
1710 if (WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp))) in rcu_gp_cleanup()
1711 dump_blkd_tasks(rnp, 10); in rcu_gp_cleanup()
1712 WARN_ON_ONCE(rnp->qsmask); in rcu_gp_cleanup()
1713 WRITE_ONCE(rnp->gp_seq, new_gp_seq); in rcu_gp_cleanup()
1714 if (!rnp->parent) in rcu_gp_cleanup()
1717 if (rnp == rdp->mynode) in rcu_gp_cleanup()
1718 needgp = __note_gp_changes(rnp, rdp) || needgp; in rcu_gp_cleanup()
1720 needgp = rcu_future_gp_cleanup(rnp) || needgp; in rcu_gp_cleanup()
1722 if (rcu_is_leaf_node(rnp)) in rcu_gp_cleanup()
1723 for_each_leaf_node_cpu_mask(rnp, cpu, rnp->cbovldmask) { in rcu_gp_cleanup()
1725 check_cb_ovld_locked(rdp, rnp); in rcu_gp_cleanup()
1727 sq = rcu_nocb_gp_get(rnp); in rcu_gp_cleanup()
1728 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_cleanup()
1734 rnp = rcu_get_root(); in rcu_gp_cleanup()
1735 raw_spin_lock_irq_rcu_node(rnp); /* GP before ->gp_seq update. */ in rcu_gp_cleanup()
1744 if (!needgp && ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed)) { in rcu_gp_cleanup()
1745 trace_rcu_this_gp(rnp, rdp, rnp->gp_seq_needed, in rcu_gp_cleanup()
1751 if ((offloaded || !rcu_accelerate_cbs(rnp, rdp)) && needgp) { in rcu_gp_cleanup()
1776 raw_spin_unlock_irq_rcu_node(rnp); in rcu_gp_cleanup()
1855 static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp, in rcu_report_qs_rnp() argument
1857 __releases(rnp->lock) in rcu_report_qs_rnp()
1862 raw_lockdep_assert_held_rcu_node(rnp); in rcu_report_qs_rnp()
1866 if ((!(rnp->qsmask & mask) && mask) || rnp->gp_seq != gps) { in rcu_report_qs_rnp()
1872 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_report_qs_rnp()
1876 WARN_ON_ONCE(!rcu_is_leaf_node(rnp) && in rcu_report_qs_rnp()
1877 rcu_preempt_blocked_readers_cgp(rnp)); in rcu_report_qs_rnp()
1878 WRITE_ONCE(rnp->qsmask, rnp->qsmask & ~mask); in rcu_report_qs_rnp()
1879 trace_rcu_quiescent_state_report(rcu_state.name, rnp->gp_seq, in rcu_report_qs_rnp()
1880 mask, rnp->qsmask, rnp->level, in rcu_report_qs_rnp()
1881 rnp->grplo, rnp->grphi, in rcu_report_qs_rnp()
1882 !!rnp->gp_tasks); in rcu_report_qs_rnp()
1883 if (rnp->qsmask != 0 || rcu_preempt_blocked_readers_cgp(rnp)) { in rcu_report_qs_rnp()
1886 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_report_qs_rnp()
1889 rnp->completedqs = rnp->gp_seq; in rcu_report_qs_rnp()
1890 mask = rnp->grpmask; in rcu_report_qs_rnp()
1891 if (rnp->parent == NULL) { in rcu_report_qs_rnp()
1897 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_report_qs_rnp()
1898 rnp_c = rnp; in rcu_report_qs_rnp()
1899 rnp = rnp->parent; in rcu_report_qs_rnp()
1900 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcu_report_qs_rnp()
1920 rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) in rcu_report_unblock_qs_rnp() argument
1921 __releases(rnp->lock) in rcu_report_unblock_qs_rnp()
1927 raw_lockdep_assert_held_rcu_node(rnp); in rcu_report_unblock_qs_rnp()
1929 WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)) || in rcu_report_unblock_qs_rnp()
1930 rnp->qsmask != 0) { in rcu_report_unblock_qs_rnp()
1931 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_report_unblock_qs_rnp()
1935 rnp->completedqs = rnp->gp_seq; in rcu_report_unblock_qs_rnp()
1936 rnp_p = rnp->parent; in rcu_report_unblock_qs_rnp()
1947 gps = rnp->gp_seq; in rcu_report_unblock_qs_rnp()
1948 mask = rnp->grpmask; in rcu_report_unblock_qs_rnp()
1949 raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */ in rcu_report_unblock_qs_rnp()
1964 struct rcu_node *rnp; in rcu_report_qs_rdp() local
1967 rnp = rdp->mynode; in rcu_report_qs_rdp()
1968 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcu_report_qs_rdp()
1969 if (rdp->cpu_no_qs.b.norm || rdp->gp_seq != rnp->gp_seq || in rcu_report_qs_rdp()
1979 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_report_qs_rdp()
1984 if ((rnp->qsmask & mask) == 0) { in rcu_report_qs_rdp()
1985 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_report_qs_rdp()
1999 WARN_ON_ONCE(rcu_accelerate_cbs(rnp, rdp)); in rcu_report_qs_rdp()
2009 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags); in rcu_report_qs_rdp()
2014 rcu_accelerate_cbs_unlocked(rnp, rdp); in rcu_report_qs_rdp()
2262 struct rcu_node *rnp; in force_qs_rnp() local
2266 rcu_for_each_leaf_node(rnp) { in force_qs_rnp()
2269 raw_spin_lock_irqsave_rcu_node(rnp, flags); in force_qs_rnp()
2270 rcu_state.cbovldnext |= !!rnp->cbovldmask; in force_qs_rnp()
2271 if (rnp->qsmask == 0) { in force_qs_rnp()
2272 if (rcu_preempt_blocked_readers_cgp(rnp)) { in force_qs_rnp()
2278 rcu_initiate_boost(rnp, flags); in force_qs_rnp()
2282 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in force_qs_rnp()
2285 for_each_leaf_node_cpu_mask(rnp, cpu, rnp->qsmask) { in force_qs_rnp()
2294 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags); in force_qs_rnp()
2297 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in force_qs_rnp()
2310 struct rcu_node *rnp; in rcu_force_quiescent_state() local
2314 rnp = raw_cpu_read(rcu_data.mynode); in rcu_force_quiescent_state()
2315 for (; rnp != NULL; rnp = rnp->parent) { in rcu_force_quiescent_state()
2317 !raw_spin_trylock(&rnp->fqslock); in rcu_force_quiescent_state()
2322 rnp_old = rnp; in rcu_force_quiescent_state()
2353 struct rcu_node *rnp = rdp->mynode; in rcu_core() local
2394 rcu_accelerate_cbs_unlocked(rnp, rdp); in rcu_core()
2398 rcu_check_gp_start_stall(rnp, rdp, rcu_jiffies_till_stall_check()); in rcu_core()
2590 static void check_cb_ovld_locked(struct rcu_data *rdp, struct rcu_node *rnp) in check_cb_ovld_locked() argument
2592 raw_lockdep_assert_held_rcu_node(rnp); in check_cb_ovld_locked()
2596 WRITE_ONCE(rnp->cbovldmask, rnp->cbovldmask | rdp->grpmask); in check_cb_ovld_locked()
2598 WRITE_ONCE(rnp->cbovldmask, rnp->cbovldmask & ~rdp->grpmask); in check_cb_ovld_locked()
2615 struct rcu_node *const rnp = rdp->mynode; in check_cb_ovld() local
2619 !!(READ_ONCE(rnp->cbovldmask) & rdp->grpmask))) in check_cb_ovld()
2621 raw_spin_lock_rcu_node(rnp); in check_cb_ovld()
2622 check_cb_ovld_locked(rdp, rnp); in check_cb_ovld()
2623 raw_spin_unlock_rcu_node(rnp); in check_cb_ovld()
3531 struct rcu_node *rnp; in synchronize_rcu() local
3561 for (rnp = this_cpu_ptr(&rcu_data)->mynode; rnp; rnp = rnp->parent) in synchronize_rcu()
3562 rnp->gp_seq_needed = rnp->gp_seq = rcu_state.gp_seq; in synchronize_rcu()
3618 struct rcu_node *rnp = rcu_get_root(); in get_state_synchronize_rcu_full() local
3625 rgosp->rgos_norm = rcu_seq_snap(&rnp->gp_seq); in get_state_synchronize_rcu_full()
3639 struct rcu_node *rnp; in start_poll_synchronize_rcu_common() local
3644 rnp = rdp->mynode; in start_poll_synchronize_rcu_common()
3645 raw_spin_lock_rcu_node(rnp); // irqs already disabled. in start_poll_synchronize_rcu_common()
3652 needwake = rcu_start_this_gp(rnp, rdp, rcu_seq_snap(&rcu_state.gp_seq)); in start_poll_synchronize_rcu_common()
3653 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in start_poll_synchronize_rcu_common()
3780 struct rcu_node *rnp = rcu_get_root(); in poll_state_synchronize_rcu_full() local
3784 rcu_seq_done_exact(&rnp->gp_seq, rgosp->rgos_norm) || in poll_state_synchronize_rcu_full()
3857 struct rcu_node *rnp = rdp->mynode; in rcu_pending() local
3889 if (rcu_seq_current(&rnp->gp_seq) != rdp->gp_seq || in rcu_pending()
4092 static unsigned long rcu_rnp_online_cpus(struct rcu_node *rnp) in rcu_rnp_online_cpus() argument
4094 return READ_ONCE(rnp->qsmaskinitnext); in rcu_rnp_online_cpus()
4162 struct rcu_node *rnp = rdp->mynode; in rcutree_dying_cpu() local
4167 blkd = !!(READ_ONCE(rnp->qsmask) & rdp->grpmask); in rcutree_dying_cpu()
4168 trace_rcu_grace_period(rcu_state.name, READ_ONCE(rnp->gp_seq), in rcutree_dying_cpu()
4193 struct rcu_node *rnp = rnp_leaf; in rcu_cleanup_dead_rnp() local
4201 mask = rnp->grpmask; in rcu_cleanup_dead_rnp()
4202 rnp = rnp->parent; in rcu_cleanup_dead_rnp()
4203 if (!rnp) in rcu_cleanup_dead_rnp()
4205 raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */ in rcu_cleanup_dead_rnp()
4206 rnp->qsmaskinit &= ~mask; in rcu_cleanup_dead_rnp()
4208 WARN_ON_ONCE(rnp->qsmask); in rcu_cleanup_dead_rnp()
4209 if (rnp->qsmaskinit) { in rcu_cleanup_dead_rnp()
4210 raw_spin_unlock_rcu_node(rnp); in rcu_cleanup_dead_rnp()
4214 raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */ in rcu_cleanup_dead_rnp()
4245 struct rcu_node *rnp = rnp_leaf; in rcu_init_new_rnp() local
4248 WARN_ON_ONCE(rnp->wait_blkd_tasks); in rcu_init_new_rnp()
4250 mask = rnp->grpmask; in rcu_init_new_rnp()
4251 rnp = rnp->parent; in rcu_init_new_rnp()
4252 if (rnp == NULL) in rcu_init_new_rnp()
4254 raw_spin_lock_rcu_node(rnp); /* Interrupts already disabled. */ in rcu_init_new_rnp()
4255 oldmask = rnp->qsmaskinit; in rcu_init_new_rnp()
4256 rnp->qsmaskinit |= mask; in rcu_init_new_rnp()
4257 raw_spin_unlock_rcu_node(rnp); /* Interrupts remain disabled. */ in rcu_init_new_rnp()
4302 struct rcu_node *rnp = rcu_get_root(); in rcutree_prepare_cpu() local
4305 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcutree_prepare_cpu()
4310 raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */ in rcutree_prepare_cpu()
4324 rnp = rdp->mynode; in rcutree_prepare_cpu()
4325 raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */ in rcutree_prepare_cpu()
4326 rdp->gp_seq = READ_ONCE(rnp->gp_seq); in rcutree_prepare_cpu()
4334 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcutree_prepare_cpu()
4335 rcu_spawn_one_boost_kthread(rnp); in rcutree_prepare_cpu()
4370 struct rcu_node *rnp; in rcutree_online_cpu() local
4373 rnp = rdp->mynode; in rcutree_online_cpu()
4374 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcutree_online_cpu()
4375 rnp->ffmask |= rdp->grpmask; in rcutree_online_cpu()
4376 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcutree_online_cpu()
4395 struct rcu_node *rnp; in rcutree_offline_cpu() local
4398 rnp = rdp->mynode; in rcutree_offline_cpu()
4399 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcutree_offline_cpu()
4400 rnp->ffmask &= ~rdp->grpmask; in rcutree_offline_cpu()
4401 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcutree_offline_cpu()
4426 struct rcu_node *rnp; in rcu_cpu_starting() local
4435 rnp = rdp->mynode; in rcu_cpu_starting()
4440 raw_spin_lock_rcu_node(rnp); in rcu_cpu_starting()
4441 WRITE_ONCE(rnp->qsmaskinitnext, rnp->qsmaskinitnext | mask); in rcu_cpu_starting()
4443 newcpu = !(rnp->expmaskinitnext & mask); in rcu_cpu_starting()
4444 rnp->expmaskinitnext |= mask; in rcu_cpu_starting()
4448 rcu_gpnum_ovf(rnp, rdp); /* Offline-induced counter wrap? */ in rcu_cpu_starting()
4453 if (WARN_ON_ONCE(rnp->qsmask & mask)) { /* RCU waiting on incoming CPU? */ in rcu_cpu_starting()
4460 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags); in rcu_cpu_starting()
4462 raw_spin_unlock_rcu_node(rnp); in rcu_cpu_starting()
4482 struct rcu_node *rnp = rdp->mynode; /* Outgoing CPU's rdp & rnp. */ in rcu_report_dead() local
4493 raw_spin_lock_irqsave_rcu_node(rnp, flags); /* Enforce GP memory-order guarantee. */ in rcu_report_dead()
4496 if (rnp->qsmask & mask) { /* RCU waiting on outgoing CPU? */ in rcu_report_dead()
4499 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags); in rcu_report_dead()
4500 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcu_report_dead()
4502 WRITE_ONCE(rnp->qsmaskinitnext, rnp->qsmaskinitnext & ~mask); in rcu_report_dead()
4503 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_report_dead()
4638 struct rcu_node *rnp; in rcu_spawn_gp_kthread() local
4651 rnp = rcu_get_root(); in rcu_spawn_gp_kthread()
4652 raw_spin_lock_irqsave_rcu_node(rnp, flags); in rcu_spawn_gp_kthread()
4657 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); in rcu_spawn_gp_kthread()
4687 struct rcu_node *rnp; in rcu_scheduler_starting() local
4695 rcu_for_each_node_breadth_first(rnp) in rcu_scheduler_starting()
4696 rnp->gp_seq_needed = rnp->gp_seq = rcu_state.gp_seq; in rcu_scheduler_starting()
4718 struct rcu_node *rnp; in rcu_init_one() local
4737 rnp = rcu_state.level[i]; in rcu_init_one()
4738 for (j = 0; j < num_rcu_lvl[i]; j++, rnp++) { in rcu_init_one()
4739 raw_spin_lock_init(&ACCESS_PRIVATE(rnp, lock)); in rcu_init_one()
4740 lockdep_set_class_and_name(&ACCESS_PRIVATE(rnp, lock), in rcu_init_one()
4742 raw_spin_lock_init(&rnp->fqslock); in rcu_init_one()
4743 lockdep_set_class_and_name(&rnp->fqslock, in rcu_init_one()
4745 rnp->gp_seq = rcu_state.gp_seq; in rcu_init_one()
4746 rnp->gp_seq_needed = rcu_state.gp_seq; in rcu_init_one()
4747 rnp->completedqs = rcu_state.gp_seq; in rcu_init_one()
4748 rnp->qsmask = 0; in rcu_init_one()
4749 rnp->qsmaskinit = 0; in rcu_init_one()
4750 rnp->grplo = j * cpustride; in rcu_init_one()
4751 rnp->grphi = (j + 1) * cpustride - 1; in rcu_init_one()
4752 if (rnp->grphi >= nr_cpu_ids) in rcu_init_one()
4753 rnp->grphi = nr_cpu_ids - 1; in rcu_init_one()
4755 rnp->grpnum = 0; in rcu_init_one()
4756 rnp->grpmask = 0; in rcu_init_one()
4757 rnp->parent = NULL; in rcu_init_one()
4759 rnp->grpnum = j % levelspread[i - 1]; in rcu_init_one()
4760 rnp->grpmask = BIT(rnp->grpnum); in rcu_init_one()
4761 rnp->parent = rcu_state.level[i - 1] + in rcu_init_one()
4764 rnp->level = i; in rcu_init_one()
4765 INIT_LIST_HEAD(&rnp->blkd_tasks); in rcu_init_one()
4766 rcu_init_one_nocb(rnp); in rcu_init_one()
4767 init_waitqueue_head(&rnp->exp_wq[0]); in rcu_init_one()
4768 init_waitqueue_head(&rnp->exp_wq[1]); in rcu_init_one()
4769 init_waitqueue_head(&rnp->exp_wq[2]); in rcu_init_one()
4770 init_waitqueue_head(&rnp->exp_wq[3]); in rcu_init_one()
4771 spin_lock_init(&rnp->exp_lock); in rcu_init_one()
4772 mutex_init(&rnp->boost_kthread_mutex); in rcu_init_one()
4773 raw_spin_lock_init(&rnp->exp_poll_lock); in rcu_init_one()
4774 rnp->exp_seq_poll_rq = RCU_GET_STATE_COMPLETED; in rcu_init_one()
4775 INIT_WORK(&rnp->exp_poll_wq, sync_rcu_do_polled_gp); in rcu_init_one()
4781 rnp = rcu_first_leaf_node(); in rcu_init_one()
4783 while (i > rnp->grphi) in rcu_init_one()
4784 rnp++; in rcu_init_one()
4785 per_cpu_ptr(&rcu_data, i)->mynode = rnp; in rcu_init_one()
4913 struct rcu_node *rnp; in rcu_dump_rcu_node_tree() local
4917 rcu_for_each_node_breadth_first(rnp) { in rcu_dump_rcu_node_tree()
4918 if (rnp->level != level) { in rcu_dump_rcu_node_tree()
4921 level = rnp->level; in rcu_dump_rcu_node_tree()
4923 pr_cont("%d:%d ^%d ", rnp->grplo, rnp->grphi, rnp->grpnum); in rcu_dump_rcu_node_tree()