]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - kernel/rcutree.c
rcu: Move redundant call to note_gp_changes() into called function
[karo-tx-linux.git] / kernel / rcutree.c
index 7eb2bc95300a1c8b42f58d1846a0fc558c7e9706..7a5194ef90da72b6d35344a4dd61cdeb011b0290 100644 (file)
@@ -1254,18 +1254,16 @@ static void rcu_advance_cbs(struct rcu_state *rsp, struct rcu_node *rnp,
 }
 
 /*
- * Advance this CPU's callbacks, but only if the current grace period
- * has ended.  This may be called only from the CPU to whom the rdp
- * belongs.  In addition, the corresponding leaf rcu_node structure's
- * ->lock must be held by the caller, with irqs disabled.
+ * Update CPU-local rcu_data state to record the beginnings and ends of
+ * grace periods.  The caller must hold the ->lock of the leaf rcu_node
+ * structure corresponding to the current CPU, and must have irqs disabled.
  */
-static void
-__rcu_process_gp_end(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
+static void __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
 {
-       /* Did another grace period end? */
+       /* Handle the ends of any preceding grace periods first. */
        if (rdp->completed == rnp->completed) {
 
-               /* No, so just accelerate recent callbacks. */
+               /* No grace period end, so just accelerate recent callbacks. */
                rcu_accelerate_cbs(rsp, rnp, rdp);
 
        } else {
@@ -1276,41 +1274,7 @@ __rcu_process_gp_end(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_dat
                /* Remember that we saw this grace-period completion. */
                rdp->completed = rnp->completed;
                trace_rcu_grace_period(rsp->name, rdp->gpnum, "cpuend");
-
-               /*
-                * If we were in an extended quiescent state, we may have
-                * missed some grace periods that others CPUs handled on
-                * our behalf. Catch up with this state to avoid noting
-                * spurious new grace periods.  If another grace period
-                * has started, then rnp->gpnum will have advanced, so
-                * we will detect this later on.  Of course, any quiescent
-                * states we found for the old GP are now invalid.
-                */
-               if (ULONG_CMP_LT(rdp->gpnum, rdp->completed)) {
-                       rdp->gpnum = rdp->completed;
-                       rdp->passed_quiesce = 0;
-               }
-
-               /*
-                * If RCU does not need a quiescent state from this CPU,
-                * then make sure that this CPU doesn't go looking for one.
-                */
-               if ((rnp->qsmask & rdp->grpmask) == 0)
-                       rdp->qs_pending = 0;
        }
-}
-
-/*
- * Update CPU-local rcu_data state to record the newly noticed grace period.
- * This is used both when we started the grace period and when we notice
- * that someone else started the grace period.  The caller must hold the
- * ->lock of the leaf rcu_node structure corresponding to the current CPU,
- *  and must have irqs disabled.
- */
-static void __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
-{
-       /* Handle the ends of any preceding grace periods first. */
-       __rcu_process_gp_end(rsp, rnp, rdp);
 
        if (rdp->gpnum != rnp->gpnum) {
                /*
@@ -1343,63 +1307,6 @@ static void note_gp_changes(struct rcu_state *rsp, struct rcu_data *rdp)
        raw_spin_unlock_irqrestore(&rnp->lock, flags);
 }
 
-/*
- * Advance this CPU's callbacks, but only if the current grace period
- * has ended.  This may be called only from the CPU to whom the rdp
- * belongs.
- */
-static void
-rcu_process_gp_end(struct rcu_state *rsp, struct rcu_data *rdp)
-{
-       unsigned long flags;
-       struct rcu_node *rnp;
-
-       local_irq_save(flags);
-       rnp = rdp->mynode;
-       if (rdp->completed == ACCESS_ONCE(rnp->completed) || /* outside lock. */
-           !raw_spin_trylock(&rnp->lock)) { /* irqs already off, so later. */
-               local_irq_restore(flags);
-               return;
-       }
-       __rcu_process_gp_end(rsp, rnp, rdp);
-       raw_spin_unlock_irqrestore(&rnp->lock, flags);
-}
-
-/*
- * Did someone else start a new RCU grace period start since we last
- * checked?  Update local state appropriately if so.  Must be called
- * on the CPU corresponding to rdp.
- */
-static int
-check_for_new_grace_period(struct rcu_state *rsp, struct rcu_data *rdp)
-{
-       unsigned long flags;
-       int ret = 0;
-
-       local_irq_save(flags);
-       if (rdp->gpnum != rsp->gpnum) {
-               note_gp_changes(rsp, rdp);
-               ret = 1;
-       }
-       local_irq_restore(flags);
-       return ret;
-}
-
-/*
- * Do per-CPU grace-period initialization for running CPU.  The caller
- * must hold the lock of the leaf rcu_node structure corresponding to
- * this CPU.
- */
-static void
-rcu_start_gp_per_cpu(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
-{
-       /* Prior grace period ended, so advance callbacks for current CPU. */
-       __rcu_process_gp_end(rsp, rnp, rdp);
-
-       /* Set state so that this CPU will detect the next quiescent state. */
-       __note_gp_changes(rsp, rnp, rdp);
-}
-
 /*
  * Initialize a new grace period.
  */
@@ -1448,7 +1355,7 @@ static int rcu_gp_init(struct rcu_state *rsp)
                WARN_ON_ONCE(rnp->completed != rsp->completed);
                ACCESS_ONCE(rnp->completed) = rsp->completed;
                if (rnp == rdp->mynode)
-                       rcu_start_gp_per_cpu(rsp, rnp, rdp);
+                       __note_gp_changes(rsp, rnp, rdp);
                rcu_preempt_boost_start_gp(rnp);
                trace_rcu_grace_period_init(rsp->name, rnp->gpnum,
                                            rnp->level, rnp->grplo,
@@ -1531,7 +1438,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)
                ACCESS_ONCE(rnp->completed) = rsp->gpnum;
                rdp = this_cpu_ptr(rsp->rda);
                if (rnp == rdp->mynode)
-                       __rcu_process_gp_end(rsp, rnp, rdp);
+                       __note_gp_changes(rsp, rnp, rdp);
                nocb += rcu_future_gp_cleanup(rsp, rnp);
                raw_spin_unlock_irq(&rnp->lock);
                cond_resched();
@@ -1809,9 +1716,8 @@ rcu_report_qs_rdp(int cpu, struct rcu_state *rsp, struct rcu_data *rdp)
 static void
 rcu_check_quiescent_state(struct rcu_state *rsp, struct rcu_data *rdp)
 {
-       /* If there is now a new grace period, record and return. */
-       if (check_for_new_grace_period(rsp, rdp))
-               return;
+       /* Check for grace-period ends and beginnings. */
+       note_gp_changes(rsp, rdp);
 
        /*
         * Does this CPU still need to do its part for current grace period?
@@ -2275,9 +2181,6 @@ __rcu_process_callbacks(struct rcu_state *rsp)
 
        WARN_ON_ONCE(rdp->beenonline == 0);
 
-       /* Handle the end of a grace period that some other CPU ended.  */
-       rcu_process_gp_end(rsp, rdp);
-
        /* Update RCU state based on any recent quiescent states. */
        rcu_check_quiescent_state(rsp, rdp);
 
@@ -2362,8 +2265,7 @@ static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp,
        if (unlikely(rdp->qlen > rdp->qlen_last_fqs_check + qhimark)) {
 
                /* Are we ignoring a completed grace period? */
-               rcu_process_gp_end(rsp, rdp);
-               check_for_new_grace_period(rsp, rdp);
+               note_gp_changes(rsp, rdp);
 
                /* Start a new grace period if one not already started. */
                if (!rcu_gp_in_progress(rsp)) {