Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756303AbcLNPOn (ORCPT ); Wed, 14 Dec 2016 10:14:43 -0500 Received: from mail-qt0-f171.google.com ([209.85.216.171]:33886 "EHLO mail-qt0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755788AbcLNPOl (ORCPT ); Wed, 14 Dec 2016 10:14:41 -0500 Date: Wed, 14 Dec 2016 10:14:39 -0500 (EST) From: Nicolas Pitre To: Guenter Roeck cc: "linux-kernel@vger.kernel.org" Subject: Re: Build failures due to missing 'posix_timer_event' In-Reply-To: Message-ID: References: User-Agent: Alpine 2.20 (LFD 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3167 Lines: 84 On Wed, 14 Dec 2016, Guenter Roeck wrote: > avr32:allnoconfig: > > kernel/built-in.o: In function `do_adjtimex': > (.text+0x1d748): undefined reference to `posix_timer_event' > make[1]: *** [vmlinux] Error 1 > > metag:allnoconfig: > > kernel/built-in.o: In function `alarm_handle_timer': > alarmtimer.c:(.text.alarm_handle_timer+0x38): undefined reference to > `posix_timer_event' > > openrisc:allnoconfig: > > kernel/built-in.o: In function `alarm_handle_timer': > alarmtimer.c:(.text+0x3fca4): undefined reference to `posix_timer_event' > > unicore32:allnoconfig: > > kernel/built-in.o: In function `alarm_handle_timer': > memremap.c:(.text+0x31c1c): undefined reference to `posix_timer_event' > > Since I don't run allnoconfig builds for all architectures, I strongly suspect > that more are affected. This is a known problem. Oddly enough only those "less popular" architectures are affected. > Looking into alarmtimer.c, with seems to call posix_timer_event() > unconditionally, I don't entirely understand how this can work in the > first place. Maybe I am missing something, though. The magic is in alarmtimer_init(): if (IS_ENABLED(CONFIG_POSIX_TIMERS)) { posix_timers_register_clock(CLOCK_REALTIME_ALARM, &alarm_clock); posix_timers_register_clock(CLOCK_BOOTTIME_ALARM, &alarm_clock); } If CONFIG_POSIX_TIMERS is not enabled, the condition becomes a constant zero. The posix_timers_register_clock calls are then optimized away by the compiler. In turn the alarm_clock structure has no longer any reference to it and therefore is also optimized away, including its method functions such as alarm_timer_create() and finally alarm_handle_timer(). But for some reasons, some gcc versions (mainly for "secondary" architectures) fail to optimize away all that code, and a dead reference to posix_timer_event() remains in the compiled code. There is a fix already queued in the mm tree. It goes like this: posix-timers: give lazy compilers some help optimizing code away The OpenRISC compiler (so far) fails to optimize away a large portion of code containing a reference to posix_timer_event in alarmtimer.c when CONFIG_POSIX_TIMERS is unset. Let's give it a direct clue to let the build succeed. This fixes [linux-next:master 6682/7183] alarmtimer.c:undefined reference to `posix_timer_event' reported by kbuild test robot. Signed-off-by: Nicolas Pitre Cc: Thomas Gleixner Cc: Josh Triplett Signed-off-by: Andrew Morton diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 9b08ca391a..3921cf7fea 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -516,7 +516,8 @@ static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm, spin_lock_irqsave(&ptr->it_lock, flags); if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) { - if (posix_timer_event(ptr, 0) != 0) + if (IS_ENABLED(CONFIG_POSIX_TIMERS) && + posix_timer_event(ptr, 0) != 0) ptr->it_overrun++; }