Sebastian On 02/09/2018 11:39 AM, Sebastian Andrzej Siewior wrote: > On 2018-02-06 09:47:15 [-0600], Dan Murphy wrote: >> Sebastian > Hi Dan, > >> Agreed sorry for that. I sent the issues before I got the mail list information. > > You complained about two warnings. For number one I cherry-picked > 15f7b41f70dd ("brd: remove unused brd_mutex"). > Great thanks. I did see a LKML patch for this but it was old not sure if it was reposted or reported to the list. > The other thing was a warning in > pl011_console_write::drivers/tty/serial/amba-pl011.c the flags member. I > have here: > > CC drivers/tty/serial/amba-pl011.o > > with gcc version 7.3.0 (Debian 7.3.0-1). Looking at the code, flags is > not be initialized in the uap->port.sysrq case but it is also not used. I was using 7.2 gcc compiler distributed via Linaro. > So it is a compiler thing and not a bug. There is the same pattern in > the 8250 UART or the omap-serial driver. If you care enough to get this > one fixed, please send a patch. Hmmm I wonder why the compiler does not complain about this warning then. I will look into it. This warning has been around for a while (4.9-rt as well). We also noticed that there are 2 merge conflicts when going to 4.14.18. Any comments about providing a merge conflict email to the list? Attached is the merge conflicts we are seeing 4.14.15-> 4.14.18 Dan > > Sebastian > -- ------------------ Dan Murphy
diff --cc arch/x86/include/asm/thread_info.h index 4721692,eda3b68..0000000 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@@ -55,8 -55,7 +55,12 @@@ struct task_struct struct thread_info { unsigned long flags; /* low level flags */ ++<<<<<<< HEAD + int preempt_lazy_count; /* 0 => lazy preemptable + <0 => BUG */ ++======= + u32 status; /* thread synchronous flags */ ++>>>>>>> e94830efe7587ed0b733341934aca406edeaccc8 }; #define INIT_THREAD_INFO(tsk) \ diff --cc kernel/time/hrtimer.c index fb3413d,052773d..0000000 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@@ -649,32 -587,77 +649,39 @@@ hrtimer_force_reprogram(struct hrtimer_ tick_program_event(cpu_base->expires_next, 1); } +/* High resolution timer related functions */ +#ifdef CONFIG_HIGH_RES_TIMERS + /* - * When a timer is enqueued and expires earlier than the already enqueued - * timers, we have to check, whether it expires earlier than the timer for - * which the clock event device was armed. - * - * Called with interrupts disabled and base->cpu_base.lock held + * High resolution timer enabled ? */ -static void hrtimer_reprogram(struct hrtimer *timer, - struct hrtimer_clock_base *base) -{ - struct hrtimer_cpu_base *cpu_base = this_cpu_ptr(&hrtimer_bases); - ktime_t expires = ktime_sub(hrtimer_get_expires(timer), base->offset); - - WARN_ON_ONCE(hrtimer_get_expires_tv64(timer) < 0); - - /* - * If the timer is not on the current cpu, we cannot reprogram - * the other cpus clock event device. - */ - if (base->cpu_base != cpu_base) - return; - - /* - * If the hrtimer interrupt is running, then it will - * reevaluate the clock bases and reprogram the clock event - * device. The callbacks are always executed in hard interrupt - * context so we don't need an extra check for a running - * callback. - */ - if (cpu_base->in_hrtirq) - return; - - /* - * CLOCK_REALTIME timer might be requested with an absolute - * expiry time which is less than base->offset. Set it to 0. - */ - if (expires < 0) - expires = 0; - - if (expires >= cpu_base->expires_next) - return; - - /* Update the pointer to the next expiring timer */ - cpu_base->next_timer = timer; - - /* - * If a hang was detected in the last timer interrupt then we - * do not schedule a timer which is earlier than the expiry - * which we enforced in the hang detection. We want the system - * to make progress. - */ - if (cpu_base->hang_detected) - return; +static bool hrtimer_hres_enabled __read_mostly = true; +unsigned int hrtimer_resolution __read_mostly = LOW_RES_NSEC; +EXPORT_SYMBOL_GPL(hrtimer_resolution); - /* - * Program the timer hardware. We enforce the expiry for - * events which are already in the past. - */ - cpu_base->expires_next = expires; - tick_program_event(expires, 1); +/* + * Enable / Disable high resolution mode + */ +static int __init setup_hrtimer_hres(char *str) +{ + return (kstrtobool(str, &hrtimer_hres_enabled) == 0); } +__setup("highres=", setup_hrtimer_hres); + /* - * Initialize the high resolution related parts of cpu_base + * hrtimer_high_res_enabled - query, if the highres mode is enabled */ -static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base) +static inline int hrtimer_is_hres_enabled(void) { ++<<<<<<< HEAD + return hrtimer_hres_enabled; ++======= + base->expires_next = KTIME_MAX; + base->hang_detected = 0; + base->hres_active = 0; + base->next_timer = NULL; ++>>>>>>> e94830efe7587ed0b733341934aca406edeaccc8 } /* @@@ -1900,13 -1593,9 +1907,14 @@@ int hrtimers_prepare_cpu(unsigned int c timerqueue_init_head(&cpu_base->clock_base[i].active); } + cpu_base->active_bases = 0; cpu_base->cpu = cpu; - hrtimer_init_hres(cpu_base); + cpu_base->hres_active = 0; + cpu_base->expires_next = KTIME_MAX; + cpu_base->softirq_expires_next = KTIME_MAX; +#ifdef CONFIG_PREEMPT_RT_BASE + init_waitqueue_head(&cpu_base->wait); +#endif return 0; }