[firefly] [PATCH 2/2] kernel: rcu: Fix unprotected use of jiffies_stall in tree.c

Valentina Manea valentina at rosedu.org
Tue Mar 11 11:43:20 EET 2014


On Tue, Mar 11, 2014 at 11:03 AM, Iulia Manda <iulia.manda21 at gmail.com>wrote:

> Protect use of jiffies_stall in tree.c and also some warnings from
> checkpatch.pl.
>
> Signed-off-by: Iulia Manda <iulia.manda21 at gmail.com>
> ---
>  kernel/rcu/tree.c |   24 +++++++++++++-----------
>  1 file changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> index b3d116c..2090a94 100644
> --- a/kernel/rcu/tree.c
> +++ b/kernel/rcu/tree.c
> @@ -195,7 +195,8 @@ void rcu_sched_qs(int cpu)
>         struct rcu_data *rdp = &per_cpu(rcu_sched_data, cpu);
>
>         if (rdp->passed_quiesce == 0)
> -               trace_rcu_grace_period(TPS("rcu_sched"), rdp->gpnum,
> TPS("cpuqs"));
> +               trace_rcu_grace_period(TPS("rcu_sched"),
> +                       rdp->gpnum, TPS("cpuqs"));
>         rdp->passed_quiesce = 1;
>  }
>
> @@ -377,7 +378,8 @@ static void rcu_eqs_enter_common(struct rcu_dynticks
> *rdtp, long long oldval,
>                 struct task_struct *idle __maybe_unused =
>                         idle_task(smp_processor_id());
>
> -               trace_rcu_dyntick(TPS("Error on entry: not idle task"),
> oldval, 0);
> +               trace_rcu_dyntick(TPS("Error on entry: not idle task"),
> +                       oldval, 0);
>                 ftrace_dump(DUMP_ORIG);
>                 WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d
> comm: %s",
>                           current->pid, current->comm,
> @@ -767,7 +769,6 @@ static int dyntick_save_progress_counter(struct
> rcu_data *rdp,
>   * This function really isn't for public consumption, but RCU is special
> in
>   * that context switches can allow the state machine to make progress.
>   */
> -extern void resched_cpu(int cpu);
>
>  /*
>   * Return true if the specified CPU has passed through a quiescent
> @@ -853,7 +854,7 @@ static void record_gp_stall_check_time(struct
> rcu_state *rsp)
>         rsp->gp_start = j;
>         smp_wmb(); /* Record start time before stall time. */
>         j1 = rcu_jiffies_till_stall_check();
> -       rsp->jiffies_stall = j + j1;
> +       ACCESS_ONCE(rsp->jiffies_stall) = j + j1;
>         rsp->jiffies_resched = j + j1 / 2;
>  }
>
> @@ -892,12 +893,13 @@ static void print_other_cpu_stall(struct rcu_state
> *rsp)
>         /* Only let one CPU complain about others per time interval. */
>
>         raw_spin_lock_irqsave(&rnp->lock, flags);
> -       delta = jiffies - rsp->jiffies_stall;
> +       delta = jiffies - ACCESS_ONCE(rsp->jiffies_stall);
>         if (delta < RCU_STALL_RAT_DELAY || !rcu_gp_in_progress(rsp)) {
>                 raw_spin_unlock_irqrestore(&rnp->lock, flags);
>                 return;
>         }
> -       rsp->jiffies_stall = jiffies + 3 * rcu_jiffies_till_stall_check()
> + 3;
> +       rsp->jiffies_stall = jiffies +
> +               3 * rcu_jiffies_till_stall_check() + 3;
>         raw_spin_unlock_irqrestore(&rnp->lock, flags);
>
>         /*
> @@ -953,7 +955,6 @@ static void print_other_cpu_stall(struct rcu_state
> *rsp)
>   * This function really isn't for public consumption, but RCU is special
> in
>   * that context switches can allow the state machine to make progress.
>   */
> -extern void resched_cpu(int cpu);
>
>  static void print_cpu_stall(struct rcu_state *rsp)
>  {
> @@ -979,8 +980,8 @@ static void print_cpu_stall(struct rcu_state *rsp)
>                 dump_stack();
>
>         raw_spin_lock_irqsave(&rnp->lock, flags);
> -       if (ULONG_CMP_GE(jiffies, rsp->jiffies_stall))
> -               rsp->jiffies_stall = jiffies +
> +       if (ULONG_CMP_GE(jiffies, ACCESS_ONCE(rsp->jiffies_stall)))
> +               ACCESS_ONCE(rsp->jiffies_stall) = jiffies +
>                                      3 * rcu_jiffies_till_stall_check() +
> 3;
>         raw_spin_unlock_irqrestore(&rnp->lock, flags);
>
> @@ -1064,7 +1065,7 @@ void rcu_cpu_stall_reset(void)
>         struct rcu_state *rsp;
>
>         for_each_rcu_flavor(rsp)
> -               rsp->jiffies_stall = jiffies + ULONG_MAX / 2;
> +               ACCESS_ONCE(rsp->jiffies_stall) = jiffies + ULONG_MAX / 2;
>  }
>
>  /*
> @@ -1293,7 +1294,8 @@ static void rcu_accelerate_cbs(struct rcu_state
> *rsp, struct rcu_node *rnp,
>         if (!*rdp->nxttail[RCU_WAIT_TAIL])
>                 trace_rcu_grace_period(rsp->name, rdp->gpnum,
> TPS("AccWaitCB"));
>         else
> -               trace_rcu_grace_period(rsp->name, rdp->gpnum,
> TPS("AccReadyCB"));
> +               trace_rcu_grace_period(rsp->name, rdp->gpnum,
> +                       TPS("AccReadyCB"));
>  }
>
>  /*
>
>
Hi,

A patch should focus on one thing only. Thus, you can't add jiffies_stall
protection and fix checkpatch.pl in the same patch. Please split them
accordingly.

As a side note, when working on checkpatch.pl, it's recommended that you
either:
a) fix one type of error - only trailing whitespaces or split lines over 80
characters
b) fix everything in the given file :)

Same goes for sparse errors such as functions that should be declared as
static.

Thanks,
Valentina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rosedu.org/pipermail/firefly/attachments/20140311/9cb1b018/attachment.html>


More information about the firefly mailing list