Re: [ANNOUNCE] v4.11.12-rt15

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

 



On Wednesday 11 October 2017 06:35:33 Sebastian Andrzej Siewior wrote:

> Dear RT folks!
>
> I'm pleased to announce the v4.11.12-rt15 patch set.
>
> Changes since v4.11.12-rt14:
>
>   - Programmed wake ups (nanosleep, clock_nanosleep, …) by a task with
>     RT priority will still be carried out in the hardirq context
>     (nothing changes). If it is programmed by task with a normal
>     priority then the wake up will be carried out in the softirq
>     context via the ktimersoftd thread.
>     The advantage is that multiple wake ups of non-RT tasks won't
>     disturb the RT task. Reported by Gratian Crisan.
>
>   - Paul Gortmaker reported splat during boot when TSC (on x86)
> becomes unstable and kernel switches to an alternative. This has been
> fixed by cherry-picking a patch from upstream.
>
>   - After the hrtimer rework, certain wake ups (like those programmed
> in the past using the softirq context) won't fire. Reported by Mike
> Galbraith, patched by Anna-Maria Gleixner.
>
>   - After the hrtimer rework, wake ups using CLOCK_REALTIME and a
>     relative delay were affected by clock_settime() (they should have
>     not been). Reported by Mike Galbraith.
>
> Known issues
> 	None
>
> The delta patch against v4.11.12-rt14 is appended below and can be
> found here:
>
>     
> https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.11/incr/patch-4.
>11.12-rt14-rt15.patch.xz
>
> You can get this release via the git tree at:
>
>    
> git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git
> v4.11.12-rt15
>
> The RT patch against v4.11.12 can be found here:
>
>    
> https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patch-4
>.11.12-rt15.patch.xz
>
> The split quilt queue is available at:
>
>    
> https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches
>-4.11.12-rt15.tar.xz
>
> Sebastian
> diff --git a/kernel/sched/clock.c b/kernel/sched/clock.c
> --- a/kernel/sched/clock.c
> +++ b/kernel/sched/clock.c
> @@ -124,6 +124,12 @@ int sched_clock_stable(void)
>  	return static_branch_likely(&__sched_clock_stable);
>  }
>
> +static void __scd_stamp(struct sched_clock_data *scd)
> +{
> +	scd->tick_gtod = ktime_get_ns();
> +	scd->tick_raw = sched_clock();
> +}
> +
>  static void __set_sched_clock_stable(void)
>  {
>  	struct sched_clock_data *scd;
> @@ -148,8 +154,37 @@ static void __set_sched_clock_stable(void)
>  	tick_dep_clear(TICK_DEP_BIT_CLOCK_UNSTABLE);
>  }
>
> +/*
> + * If we ever get here, we're screwed, because we found out --
> typically after + * the fact -- that TSC wasn't good. This means all
> our clocksources (including + * ktime) could have reported wrong
> values.
> + *
> + * What we do here is an attempt to fix up and continue sort of where
> we left + * off in a coherent manner.
> + *
> + * The only way to fully avoid random clock jumps is to boot with:
> + * "tsc=unstable".
> + */
>  static void __sched_clock_work(struct work_struct *work)
>  {
> +	struct sched_clock_data *scd;
> +	int cpu;
> +
> +	/* take a current timestamp and set 'now' */
> +	preempt_disable();
> +	scd = this_scd();
> +	__scd_stamp(scd);
> +	scd->clock = scd->tick_gtod + __gtod_offset;
> +	preempt_enable();
> +
> +	/* clone to all CPUs */
> +	for_each_possible_cpu(cpu)
> +		per_cpu(sched_clock_data, cpu) = *scd;
> +
> +	printk(KERN_INFO "sched_clock: Marking unstable (%lld, %lld)<-(%lld,
> %lld)\n", +			scd->tick_gtod, __gtod_offset,
> +			scd->tick_raw,  __sched_clock_offset);
> +
>  	static_branch_disable(&__sched_clock_stable);
>  }
>
> @@ -157,27 +192,11 @@ static DECLARE_WORK(sched_clock_work,
> __sched_clock_work);
>
>  static void __clear_sched_clock_stable(void)
>  {
> -	struct sched_clock_data *scd = this_scd();
> -
> -	/*
> -	 * Attempt to make the stable->unstable transition continuous.
> -	 *
> -	 * Trouble is, this is typically called from the TSC watchdog
> -	 * timer, which is late per definition. This means the tick
> -	 * values can already be screwy.
> -	 *
> -	 * Still do what we can.
> -	 */
> -	__gtod_offset = (scd->tick_raw + __sched_clock_offset) -
> (scd->tick_gtod); -
> -	printk(KERN_INFO "sched_clock: Marking unstable (%lld, %lld)<-(%lld,
> %lld)\n", -			scd->tick_gtod, __gtod_offset,
> -			scd->tick_raw,  __sched_clock_offset);
> +	if (!sched_clock_stable())
> +		return;
>
>  	tick_dep_set(TICK_DEP_BIT_CLOCK_UNSTABLE);
> -
> -	if (sched_clock_stable())
> -		schedule_work(&sched_clock_work);
> +	schedule_work(&sched_clock_work);
>  }
>
>  void clear_sched_clock_stable(void)
> @@ -364,8 +383,7 @@ void sched_clock_tick(void)
>  	 * XXX arguably we can skip this if we expose
> tsc_clocksource_reliable */
>  	scd = this_scd();
> -	scd->tick_raw  = sched_clock();
> -	scd->tick_gtod = ktime_get_ns();
> +	__scd_stamp(scd);
>
>  	if (!sched_clock_stable() && likely(sched_clock_running))
>  		sched_clock_local(scd);
> diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
> --- a/kernel/time/hrtimer.c
> +++ b/kernel/time/hrtimer.c
> @@ -562,8 +562,14 @@ static inline ktime_t hrtimer_update_base(struct
> hrtimer_cpu_base *base) ktime_t *offs_boot =
> &base->clock_base[HRTIMER_BASE_BOOTTIME].offset; ktime_t *offs_tai =
> &base->clock_base[HRTIMER_BASE_TAI].offset;
>
> -	return ktime_get_update_offsets_now(&base->clock_was_set_seq,
> +	ktime_t now = ktime_get_update_offsets_now(&base->clock_was_set_seq,
>  					    offs_real, offs_boot, offs_tai);
> +
> +	base->clock_base[HRTIMER_BASE_REALTIME_SOFT].offset = *offs_real;
> +	base->clock_base[HRTIMER_BASE_BOOTTIME_SOFT].offset = *offs_boot;
> +	base->clock_base[HRTIMER_BASE_TAI_SOFT].offset = *offs_tai;
> +
> +	return now;
>  }
>
>  /*
> @@ -1252,6 +1258,8 @@ static void __hrtimer_init(struct hrtimer
> *timer, clockid_t clock_id, clock_id = CLOCK_MONOTONIC;
>  		else if (clock_id == CLOCK_REALTIME_SOFT)
>  			clock_id = CLOCK_MONOTONIC_SOFT;
> +		else if (clock_id == CLOCK_REALTIME_HARD)
> +			clock_id = CLOCK_MONOTONIC_HARD;
>  	}
>
>  	base = hrtimer_clockid_to_base(clock_id);
> @@ -1622,14 +1630,31 @@ static enum hrtimer_restart
> hrtimer_wakeup(struct hrtimer *timer) return HRTIMER_NORESTART;
>  }
>
> +#ifdef CONFIG_PREEMPT_RT_FULL
> +static bool task_is_elevated(struct task_struct *tsk)
> +{
> +	int policy = tsk->policy;
> +
> +	if (policy == SCHED_FIFO || policy == SCHED_RR)
> +		return true;
> +	if (policy == SCHED_DEADLINE)
> +		return true;
> +	return false;
> +}
> +#endif
> +
>  static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
>  				   clockid_t clock_id,
>  				   enum hrtimer_mode mode,
>  				   struct task_struct *task)
>  {
>  #ifdef CONFIG_PREEMPT_RT_FULL
> -	if (!(clock_id & HRTIMER_BASE_SOFT_MASK))
> -		clock_id |= HRTIMER_BASE_HARD_MASK;
> +	if (!(clock_id & (HRTIMER_BASE_HARD_MASK | HRTIMER_BASE_SOFT_MASK)))
> { +		if (task_is_elevated(current) || system_state != SYSTEM_RUNNING)
> +			clock_id |= HRTIMER_BASE_HARD_MASK;
> +		else
> +			clock_id |= HRTIMER_BASE_SOFT_MASK;
> +	}
>  #endif
>  	__hrtimer_init(&sl->timer, clock_id, mode);
>  	sl->timer.function = hrtimer_wakeup;
> diff --git a/localversion-rt b/localversion-rt
> --- a/localversion-rt
> +++ b/localversion-rt
> @@ -1 +1 @@
> --rt14
> +-rt15
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Neat, and newer than the kernel.org release by several steps, its 
4.10-rc3, so where can I get the whole thing, ready for a make menu|x|g|
config?

I am trying to make linuxcnc run on a rock64, its so new you can still 
smell the paint.

Cheers, Gene Heskett
-- 
"There are four boxes to be used in defense of liberty:
 soap, ballot, jury, and ammo. Please use in that order."
-Ed Howdershelt (Author)
Genes Web page <http://geneslinuxbox.net:6309/gene>
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux