[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3 5/6] xen: RCU: avoid busy waiting until the end of grace period.



>>> On 18.08.17 at 20:04, <dario.faggioli@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/cpu/mwait-idle.c
> +++ b/xen/arch/x86/cpu/mwait-idle.c
> @@ -741,9 +741,8 @@ static void mwait_idle(void)
>       }
>  
>       cpufreq_dbs_timer_suspend();
> -
>       sched_tick_suspend();
> -     /* sched_tick_suspend() can raise TIMER_SOFTIRQ. Process it now. */
> +     /* Timer related operations can raise TIMER_SOFTIRQ. Process it now. */
>       process_pending_softirqs();

Is this a leftover from v1? Otherwise, why do you do the adjustment
here but not in acpi_processor_idle()?

> --- a/xen/common/rcupdate.c
> +++ b/xen/common/rcupdate.c
> @@ -84,8 +84,37 @@ struct rcu_data {
>      int cpu;
>      struct rcu_head barrier;
>      long            last_rs_qlen;     /* qlen during the last resched */
> +
> +    /* 3) idle CPUs handling */
> +    struct timer idle_timer;
> +    bool idle_timer_active;
>  };
>  
> +/*
> + * If a CPU with RCU callbacks queued goes idle, when the grace period is
> + * not finished yet, how can we make sure that the callbacks will eventually
> + * be executed? In Linux (2.6.21, the first "tickless idle" Linux kernel),
> + * the periodic timer tick would not be stopped for such CPU. Here in Xen,
> + * we (may) don't even have a periodic timer tick, so we need to use a
> + * special purpose timer.
> + *
> + * Such timer:
> + * 1) is armed only when a CPU with an RCU callback(s) queued goes idle
> + *    before the end of the current grace period (_not_ for any CPUs that
> + *    go idle!);
> + * 2) when it fires, it is only re-armed if the grace period is still
> + *    running;
> + * 3) it is stopped immediately, if the CPU wakes up from idle and
> + *    resumes 'normal' execution.
> + *
> + * About how far in the future the timer should be programmed each time,
> + * it's hard to tell (guess!!). Since this mimics Linux's periodic timer
> + * tick, take values used there as an indication. In Linux 2.6.21, tick
> + * period can be 10ms, 4ms, 3.33ms or 1ms. Let's use 10ms, to enable
> + * at least some power saving on the CPU that is going idle.
> + */
> +#define RCU_IDLE_TIMER_PERIOD MILLISECS(10)

With you even mentioning that the original Linux code has ways
to use different values, wouldn't it be worth allowing this to be
command line controllable?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.